xref: /illumos-gate/usr/src/uts/common/inet/ip/keysock.c (revision 47842382d52f28aa3173aa6b511781c322ccb6a2)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #include <sys/param.h>
27 #include <sys/types.h>
28 #include <sys/stream.h>
29 #include <sys/strsubr.h>
30 #include <sys/strsun.h>
31 #include <sys/stropts.h>
32 #include <sys/vnode.h>
33 #include <sys/zone.h>
34 #include <sys/strlog.h>
35 #include <sys/sysmacros.h>
36 #define	_SUN_TPI_VERSION 2
37 #include <sys/tihdr.h>
38 #include <sys/timod.h>
39 #include <sys/tiuser.h>
40 #include <sys/ddi.h>
41 #include <sys/sunddi.h>
42 #include <sys/sunldi.h>
43 #include <sys/file.h>
44 #include <sys/modctl.h>
45 #include <sys/debug.h>
46 #include <sys/kmem.h>
47 #include <sys/cmn_err.h>
48 #include <sys/proc.h>
49 #include <sys/suntpi.h>
50 #include <sys/atomic.h>
51 #include <sys/mkdev.h>
52 #include <sys/policy.h>
53 #include <sys/disp.h>
54 
55 #include <sys/socket.h>
56 #include <netinet/in.h>
57 #include <net/pfkeyv2.h>
58 
59 #include <inet/common.h>
60 #include <netinet/ip6.h>
61 #include <inet/ip.h>
62 #include <inet/proto_set.h>
63 #include <inet/nd.h>
64 #include <inet/optcom.h>
65 #include <inet/ipsec_info.h>
66 #include <inet/ipsec_impl.h>
67 #include <inet/keysock.h>
68 
69 #include <sys/isa_defs.h>
70 
71 /*
72  * This is a transport provider for the PF_KEY key mangement socket.
73  * (See RFC 2367 for details.)
74  * Downstream messages are wrapped in a keysock consumer interface KEYSOCK_IN
75  * messages (see ipsec_info.h), and passed to the appropriate consumer.
76  * Upstream messages are generated for all open PF_KEY sockets, when
77  * appropriate, as well as the sender (as long as SO_USELOOPBACK is enabled)
78  * in reply to downstream messages.
79  *
80  * Upstream messages must be created asynchronously for the following
81  * situations:
82  *
83  *	1.) A keysock consumer requires an SA, and there is currently none.
84  *	2.) An SA expires, either hard or soft lifetime.
85  *	3.) Other events a consumer deems fit.
86  *
87  * The MT model of this is PERMOD, with shared put procedures.  Two types of
88  * messages, SADB_FLUSH and SADB_DUMP, need to lock down the perimeter to send
89  * down the *multiple* messages they create.
90  */
91 
92 static vmem_t *keysock_vmem;		/* for minor numbers. */
93 
94 #define	KEYSOCK_MAX_CONSUMERS 256
95 
96 /* Default structure copied into T_INFO_ACK messages (from rts.c...) */
97 static struct T_info_ack keysock_g_t_info_ack = {
98 	T_INFO_ACK,
99 	T_INFINITE,	/* TSDU_size. Maximum size messages. */
100 	T_INVALID,	/* ETSDU_size. No expedited data. */
101 	T_INVALID,	/* CDATA_size. No connect data. */
102 	T_INVALID,	/* DDATA_size. No disconnect data. */
103 	0,		/* ADDR_size. */
104 	0,		/* OPT_size. No user-settable options */
105 	64 * 1024,	/* TIDU_size. keysock allows maximum size messages. */
106 	T_COTS,		/* SERV_type. keysock supports connection oriented. */
107 	TS_UNBND,	/* CURRENT_state. This is set from keysock_state. */
108 	(XPG4_1)	/* Provider flags */
109 };
110 
111 /* Named Dispatch Parameter Management Structure */
112 typedef struct keysockparam_s {
113 	uint_t	keysock_param_min;
114 	uint_t	keysock_param_max;
115 	uint_t	keysock_param_value;
116 	char	*keysock_param_name;
117 } keysockparam_t;
118 
119 /*
120  * Table of NDD variables supported by keysock. These are loaded into
121  * keysock_g_nd in keysock_init_nd.
122  * All of these are alterable, within the min/max values given, at run time.
123  */
124 static	keysockparam_t	lcl_param_arr[] = {
125 	/* min	max	value	name */
126 	{ 4096, 65536,	8192,	"keysock_xmit_hiwat"},
127 	{ 0,	65536,	1024,	"keysock_xmit_lowat"},
128 	{ 4096, 65536,	8192,	"keysock_recv_hiwat"},
129 	{ 65536, 1024*1024*1024, 256*1024,	"keysock_max_buf"},
130 	{ 0,	3,	0,	"keysock_debug"},
131 };
132 #define	keystack_xmit_hiwat	keystack_params[0].keysock_param_value
133 #define	keystack_xmit_lowat	keystack_params[1].keysock_param_value
134 #define	keystack_recv_hiwat	keystack_params[2].keysock_param_value
135 #define	keystack_max_buf	keystack_params[3].keysock_param_value
136 #define	keystack_debug	keystack_params[4].keysock_param_value
137 
138 #define	ks0dbg(a)	printf a
139 /* NOTE:  != 0 instead of > 0 so lint doesn't complain. */
140 #define	ks1dbg(keystack, a)	if (keystack->keystack_debug != 0) printf a
141 #define	ks2dbg(keystack, a)	if (keystack->keystack_debug > 1) printf a
142 #define	ks3dbg(keystack, a)	if (keystack->keystack_debug > 2) printf a
143 
144 static int keysock_close(queue_t *);
145 static int keysock_open(queue_t *, dev_t *, int, int, cred_t *);
146 static void keysock_wput(queue_t *, mblk_t *);
147 static void keysock_rput(queue_t *, mblk_t *);
148 static void keysock_rsrv(queue_t *);
149 static void keysock_passup(mblk_t *, sadb_msg_t *, minor_t,
150     keysock_consumer_t *, boolean_t, keysock_stack_t *);
151 static void *keysock_stack_init(netstackid_t stackid, netstack_t *ns);
152 static void keysock_stack_fini(netstackid_t stackid, void *arg);
153 
154 static struct module_info info = {
155 	5138, "keysock", 1, INFPSZ, 512, 128
156 };
157 
158 static struct qinit rinit = {
159 	(pfi_t)keysock_rput, (pfi_t)keysock_rsrv, keysock_open, keysock_close,
160 	NULL, &info
161 };
162 
163 static struct qinit winit = {
164 	(pfi_t)keysock_wput, NULL, NULL, NULL, NULL, &info
165 };
166 
167 struct streamtab keysockinfo = {
168 	&rinit, &winit
169 };
170 
171 extern struct modlinkage *keysock_modlp;
172 
173 /*
174  * Plumb IPsec.
175  *
176  * NOTE:  New "default" modules will need to be loaded here if needed before
177  *	  boot time.
178  */
179 
180 /* Keep these in global space to keep the lint from complaining. */
181 static char *IPSECESP = "ipsecesp";
182 static char *IPSECESPDEV = "/devices/pseudo/ipsecesp@0:ipsecesp";
183 static char *IPSECAH = "ipsecah";
184 static char *IPSECAHDEV = "/devices/pseudo/ipsecah@0:ipsecah";
185 static char *IP6DEV = "/devices/pseudo/ip6@0:ip6";
186 static char *KEYSOCK = "keysock";
187 static char *STRMOD = "strmod";
188 
189 /*
190  * Load the other ipsec modules and plumb them together.
191  */
192 int
193 keysock_plumb_ipsec(netstack_t *ns)
194 {
195 	ldi_handle_t	lh, ip6_lh = NULL;
196 	ldi_ident_t	li = NULL;
197 	int		err = 0;
198 	int		muxid, rval;
199 	boolean_t	esp_present = B_TRUE;
200 	cred_t		*cr;
201 	keysock_stack_t *keystack = ns->netstack_keysock;
202 
203 #ifdef NS_DEBUG
204 	(void) printf("keysock_plumb_ipsec(%d)\n",
205 	    ns->netstack_stackid);
206 #endif
207 
208 	keystack->keystack_plumbed = 0;	/* we're trying again.. */
209 
210 	cr = zone_get_kcred(netstackid_to_zoneid(
211 	    keystack->keystack_netstack->netstack_stackid));
212 	ASSERT(cr != NULL);
213 	/*
214 	 * Load up the drivers (AH/ESP).
215 	 *
216 	 * I do this separately from the actual plumbing in case this function
217 	 * ever gets called from a diskless boot before the root filesystem is
218 	 * up.  I don't have to worry about "keysock" because, well, if I'm
219 	 * here, keysock must've loaded successfully.
220 	 */
221 	if (i_ddi_attach_pseudo_node(IPSECAH) == NULL) {
222 		ks0dbg(("IPsec:  AH failed to attach.\n"));
223 		goto bail;
224 	}
225 	if (i_ddi_attach_pseudo_node(IPSECESP) == NULL) {
226 		ks0dbg(("IPsec:  ESP failed to attach.\n"));
227 		esp_present = B_FALSE;
228 	}
229 
230 	/*
231 	 * Set up the IP streams for AH and ESP, as well as tacking keysock
232 	 * on top of them.  Assume keysock has set the autopushes up already.
233 	 */
234 
235 	/* Open IP. */
236 	err = ldi_ident_from_mod(keysock_modlp, &li);
237 	if (err) {
238 		ks0dbg(("IPsec:  lid_ident_from_mod failed (err %d).\n",
239 		    err));
240 		goto bail;
241 	}
242 
243 	err = ldi_open_by_name(IP6DEV, FREAD|FWRITE, cr, &ip6_lh, li);
244 	if (err) {
245 		ks0dbg(("IPsec:  Open of IP6 failed (err %d).\n", err));
246 		goto bail;
247 	}
248 
249 	/* PLINK KEYSOCK/AH */
250 	err = ldi_open_by_name(IPSECAHDEV, FREAD|FWRITE, cr, &lh, li);
251 	if (err) {
252 		ks0dbg(("IPsec:  Open of AH failed (err %d).\n", err));
253 		goto bail;
254 	}
255 	err = ldi_ioctl(lh,
256 	    I_PUSH, (intptr_t)KEYSOCK, FKIOCTL, cr, &rval);
257 	if (err) {
258 		ks0dbg(("IPsec:  Push of KEYSOCK onto AH failed (err %d).\n",
259 		    err));
260 		(void) ldi_close(lh, FREAD|FWRITE, cr);
261 		goto bail;
262 	}
263 	err = ldi_ioctl(ip6_lh, I_PLINK, (intptr_t)lh,
264 	    FREAD+FWRITE+FNOCTTY+FKIOCTL, cr, &muxid);
265 	if (err) {
266 		ks0dbg(("IPsec:  PLINK of KEYSOCK/AH failed (err %d).\n", err));
267 		(void) ldi_close(lh, FREAD|FWRITE, cr);
268 		goto bail;
269 	}
270 	(void) ldi_close(lh, FREAD|FWRITE, cr);
271 
272 	/* PLINK KEYSOCK/ESP */
273 	if (esp_present) {
274 		err = ldi_open_by_name(IPSECESPDEV,
275 		    FREAD|FWRITE, cr, &lh, li);
276 		if (err) {
277 			ks0dbg(("IPsec:  Open of ESP failed (err %d).\n", err));
278 			goto bail;
279 		}
280 		err = ldi_ioctl(lh,
281 		    I_PUSH, (intptr_t)KEYSOCK, FKIOCTL, cr, &rval);
282 		if (err) {
283 			ks0dbg(("IPsec:  "
284 			    "Push of KEYSOCK onto ESP failed (err %d).\n",
285 			    err));
286 			(void) ldi_close(lh, FREAD|FWRITE, cr);
287 			goto bail;
288 		}
289 		err = ldi_ioctl(ip6_lh, I_PLINK, (intptr_t)lh,
290 		    FREAD+FWRITE+FNOCTTY+FKIOCTL, cr, &muxid);
291 		if (err) {
292 			ks0dbg(("IPsec:  "
293 			    "PLINK of KEYSOCK/ESP failed (err %d).\n", err));
294 			(void) ldi_close(lh, FREAD|FWRITE, cr);
295 			goto bail;
296 		}
297 		(void) ldi_close(lh, FREAD|FWRITE, cr);
298 	}
299 
300 bail:
301 	keystack->keystack_plumbed = (err == 0) ? 1 : -1;
302 	if (ip6_lh != NULL) {
303 		(void) ldi_close(ip6_lh, FREAD|FWRITE, cr);
304 	}
305 	if (li != NULL)
306 		ldi_ident_release(li);
307 #ifdef NS_DEBUG
308 	(void) printf("keysock_plumb_ipsec -> %d\n",
309 	    keystack->keystack_plumbed);
310 #endif
311 	crfree(cr);
312 	return (err);
313 }
314 
315 /* ARGSUSED */
316 static int
317 keysock_param_get(q, mp, cp, cr)
318 	queue_t	*q;
319 	mblk_t	*mp;
320 	caddr_t	cp;
321 	cred_t *cr;
322 {
323 	keysockparam_t	*keysockpa = (keysockparam_t *)cp;
324 	uint_t value;
325 	keysock_t *ks = (keysock_t *)q->q_ptr;
326 	keysock_stack_t	*keystack = ks->keysock_keystack;
327 
328 	mutex_enter(&keystack->keystack_param_lock);
329 	value = keysockpa->keysock_param_value;
330 	mutex_exit(&keystack->keystack_param_lock);
331 
332 	(void) mi_mpprintf(mp, "%u", value);
333 	return (0);
334 }
335 
336 /* This routine sets an NDD variable in a keysockparam_t structure. */
337 /* ARGSUSED */
338 static int
339 keysock_param_set(q, mp, value, cp, cr)
340 	queue_t	*q;
341 	mblk_t	*mp;
342 	char	*value;
343 	caddr_t	cp;
344 	cred_t *cr;
345 {
346 	ulong_t	new_value;
347 	keysockparam_t	*keysockpa = (keysockparam_t *)cp;
348 	keysock_t *ks = (keysock_t *)q->q_ptr;
349 	keysock_stack_t	*keystack = ks->keysock_keystack;
350 
351 	/* Convert the value from a string into a long integer. */
352 	if (ddi_strtoul(value, NULL, 10, &new_value) != 0)
353 		return (EINVAL);
354 
355 	mutex_enter(&keystack->keystack_param_lock);
356 	/*
357 	 * Fail the request if the new value does not lie within the
358 	 * required bounds.
359 	 */
360 	if (new_value < keysockpa->keysock_param_min ||
361 	    new_value > keysockpa->keysock_param_max) {
362 		mutex_exit(&keystack->keystack_param_lock);
363 		return (EINVAL);
364 	}
365 
366 	/* Set the new value */
367 	keysockpa->keysock_param_value = new_value;
368 	mutex_exit(&keystack->keystack_param_lock);
369 
370 	return (0);
371 }
372 
373 /*
374  * Initialize keysock at module load time
375  */
376 boolean_t
377 keysock_ddi_init(void)
378 {
379 	keysock_max_optsize = optcom_max_optsize(
380 	    keysock_opt_obj.odb_opt_des_arr, keysock_opt_obj.odb_opt_arr_cnt);
381 
382 	keysock_vmem = vmem_create("keysock", (void *)1, MAXMIN, 1,
383 	    NULL, NULL, NULL, 1, VM_SLEEP | VMC_IDENTIFIER);
384 
385 	/*
386 	 * We want to be informed each time a stack is created or
387 	 * destroyed in the kernel, so we can maintain the
388 	 * set of keysock_stack_t's.
389 	 */
390 	netstack_register(NS_KEYSOCK, keysock_stack_init, NULL,
391 	    keysock_stack_fini);
392 
393 	return (B_TRUE);
394 }
395 
396 /*
397  * Walk through the param array specified registering each element with the
398  * named dispatch handler.
399  */
400 static boolean_t
401 keysock_param_register(IDP *ndp, keysockparam_t *ksp, int cnt)
402 {
403 	for (; cnt-- > 0; ksp++) {
404 		if (ksp->keysock_param_name != NULL &&
405 		    ksp->keysock_param_name[0]) {
406 			if (!nd_load(ndp,
407 			    ksp->keysock_param_name,
408 			    keysock_param_get, keysock_param_set,
409 			    (caddr_t)ksp)) {
410 				nd_free(ndp);
411 				return (B_FALSE);
412 			}
413 		}
414 	}
415 	return (B_TRUE);
416 }
417 
418 /*
419  * Initialize keysock for one stack instance
420  */
421 /* ARGSUSED */
422 static void *
423 keysock_stack_init(netstackid_t stackid, netstack_t *ns)
424 {
425 	keysock_stack_t	*keystack;
426 	keysockparam_t *ksp;
427 
428 	keystack = (keysock_stack_t *)kmem_zalloc(sizeof (*keystack), KM_SLEEP);
429 	keystack->keystack_netstack = ns;
430 
431 	keystack->keystack_acquire_seq = 0xffffffff;
432 
433 	ksp = (keysockparam_t *)kmem_alloc(sizeof (lcl_param_arr), KM_SLEEP);
434 	keystack->keystack_params = ksp;
435 	bcopy(lcl_param_arr, ksp, sizeof (lcl_param_arr));
436 
437 	(void) keysock_param_register(&keystack->keystack_g_nd, ksp,
438 	    A_CNT(lcl_param_arr));
439 
440 	mutex_init(&keystack->keystack_list_lock, NULL, MUTEX_DEFAULT, NULL);
441 	mutex_init(&keystack->keystack_consumers_lock,
442 	    NULL, MUTEX_DEFAULT, NULL);
443 	mutex_init(&keystack->keystack_param_lock, NULL, MUTEX_DEFAULT, NULL);
444 	return (keystack);
445 }
446 
447 /*
448  * Free NDD variable space, and other destructors, for keysock.
449  */
450 void
451 keysock_ddi_destroy(void)
452 {
453 	netstack_unregister(NS_KEYSOCK);
454 	vmem_destroy(keysock_vmem);
455 }
456 
457 /*
458  * Remove one stack instance from keysock
459  */
460 /* ARGSUSED */
461 static void
462 keysock_stack_fini(netstackid_t stackid, void *arg)
463 {
464 	keysock_stack_t *keystack = (keysock_stack_t *)arg;
465 
466 	nd_free(&keystack->keystack_g_nd);
467 	kmem_free(keystack->keystack_params, sizeof (lcl_param_arr));
468 	keystack->keystack_params = NULL;
469 
470 	mutex_destroy(&keystack->keystack_list_lock);
471 	mutex_destroy(&keystack->keystack_consumers_lock);
472 	mutex_destroy(&keystack->keystack_param_lock);
473 
474 	kmem_free(keystack, sizeof (*keystack));
475 }
476 
477 /*
478  * Close routine for keysock.
479  */
480 static int
481 keysock_close(queue_t *q)
482 {
483 	keysock_t *ks;
484 	keysock_consumer_t *kc;
485 	void *ptr = q->q_ptr;
486 	int size;
487 	keysock_stack_t	*keystack;
488 
489 
490 	qprocsoff(q);
491 
492 	/* Safe assumption. */
493 	ASSERT(ptr != NULL);
494 
495 	if (WR(q)->q_next) {
496 		kc = (keysock_consumer_t *)ptr;
497 		keystack = kc->kc_keystack;
498 
499 		ks1dbg(keystack, ("Module close, removing a consumer (%d).\n",
500 		    kc->kc_sa_type));
501 		/*
502 		 * Because of PERMOD open/close exclusive perimeter, I
503 		 * can inspect KC_FLUSHING w/o locking down kc->kc_lock.
504 		 */
505 		if (kc->kc_flags & KC_FLUSHING) {
506 			/*
507 			 * If this decrement was the last one, send
508 			 * down the next pending one, if any.
509 			 *
510 			 * With a PERMOD perimeter, the mutexes ops aren't
511 			 * really necessary, but if we ever loosen up, we will
512 			 * have this bit covered already.
513 			 */
514 			keystack->keystack_flushdump--;
515 			if (keystack->keystack_flushdump == 0) {
516 				/*
517 				 * The flush/dump terminated by having a
518 				 * consumer go away.  I need to send up to the
519 				 * appropriate keysock all of the relevant
520 				 * information.  Unfortunately, I don't
521 				 * have that handy.
522 				 */
523 				ks0dbg(("Consumer went away while flushing or"
524 				    " dumping.\n"));
525 			}
526 		}
527 		size = sizeof (keysock_consumer_t);
528 		mutex_enter(&keystack->keystack_consumers_lock);
529 		keystack->keystack_consumers[kc->kc_sa_type] = NULL;
530 		mutex_exit(&keystack->keystack_consumers_lock);
531 		mutex_destroy(&kc->kc_lock);
532 		netstack_rele(kc->kc_keystack->keystack_netstack);
533 	} else {
534 		ks = (keysock_t *)ptr;
535 		keystack = ks->keysock_keystack;
536 
537 		ks3dbg(keystack,
538 		    ("Driver close, PF_KEY socket is going away.\n"));
539 		if ((ks->keysock_flags & KEYSOCK_EXTENDED) != 0)
540 			atomic_add_32(&keystack->keystack_num_extended, -1);
541 		size = sizeof (keysock_t);
542 		mutex_enter(&keystack->keystack_list_lock);
543 		*(ks->keysock_ptpn) = ks->keysock_next;
544 		if (ks->keysock_next != NULL)
545 			ks->keysock_next->keysock_ptpn = ks->keysock_ptpn;
546 		mutex_exit(&keystack->keystack_list_lock);
547 		mutex_destroy(&ks->keysock_lock);
548 		vmem_free(keysock_vmem, (void *)(uintptr_t)ks->keysock_serial,
549 		    1);
550 		netstack_rele(ks->keysock_keystack->keystack_netstack);
551 	}
552 
553 	/* Now I'm free. */
554 	kmem_free(ptr, size);
555 	return (0);
556 }
557 /*
558  * Open routine for keysock.
559  */
560 /* ARGSUSED */
561 static int
562 keysock_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
563 {
564 	keysock_t *ks;
565 	keysock_consumer_t *kc;
566 	mblk_t *mp;
567 	ipsec_info_t *ii;
568 	netstack_t *ns;
569 	keysock_stack_t *keystack;
570 
571 	if (secpolicy_ip_config(credp, B_FALSE) != 0) {
572 		/* Privilege debugging will log the error */
573 		return (EPERM);
574 	}
575 
576 	if (q->q_ptr != NULL)
577 		return (0);  /* Re-open of an already open instance. */
578 
579 	ns = netstack_find_by_cred(credp);
580 	ASSERT(ns != NULL);
581 	keystack = ns->netstack_keysock;
582 	ASSERT(keystack != NULL);
583 
584 	ks3dbg(keystack, ("Entering keysock open.\n"));
585 
586 	if (keystack->keystack_plumbed < 1) {
587 		netstack_t *ns = keystack->keystack_netstack;
588 
589 		keystack->keystack_plumbed = 0;
590 #ifdef NS_DEBUG
591 		printf("keysock_open(%d) - plumb\n",
592 		    keystack->keystack_netstack->netstack_stackid);
593 #endif
594 		/*
595 		 * Don't worry about ipsec_failure being true here.
596 		 * (See ip.c).  An open of keysock should try and force
597 		 * the issue.  Maybe it was a transient failure.
598 		 */
599 		ipsec_loader_loadnow(ns->netstack_ipsec);
600 	}
601 
602 	if (sflag & MODOPEN) {
603 		/* Initialize keysock_consumer state here. */
604 		kc = kmem_zalloc(sizeof (keysock_consumer_t), KM_NOSLEEP);
605 		if (kc == NULL) {
606 			netstack_rele(keystack->keystack_netstack);
607 			return (ENOMEM);
608 		}
609 		mutex_init(&kc->kc_lock, NULL, MUTEX_DEFAULT, 0);
610 		kc->kc_rq = q;
611 		kc->kc_wq = WR(q);
612 
613 		q->q_ptr = kc;
614 		WR(q)->q_ptr = kc;
615 
616 		kc->kc_keystack = keystack;
617 		qprocson(q);
618 
619 		/*
620 		 * Send down initial message to whatever I was pushed on top
621 		 * of asking for its consumer type.  The reply will set it.
622 		 */
623 
624 		/* Allocate it. */
625 		mp = allocb(sizeof (ipsec_info_t), BPRI_HI);
626 		if (mp == NULL) {
627 			ks1dbg(keystack, (
628 			    "keysock_open:  Cannot allocate KEYSOCK_HELLO.\n"));
629 			/* Do I need to set these to null? */
630 			q->q_ptr = NULL;
631 			WR(q)->q_ptr = NULL;
632 			mutex_destroy(&kc->kc_lock);
633 			kmem_free(kc, sizeof (*kc));
634 			netstack_rele(keystack->keystack_netstack);
635 			return (ENOMEM);
636 		}
637 
638 		/* If I allocated okay, putnext to what I was pushed atop. */
639 		mp->b_wptr += sizeof (ipsec_info_t);
640 		mp->b_datap->db_type = M_CTL;
641 		ii = (ipsec_info_t *)mp->b_rptr;
642 		ii->ipsec_info_type = KEYSOCK_HELLO;
643 		/* Length only of type/len. */
644 		ii->ipsec_info_len = sizeof (ii->ipsec_allu);
645 		ks2dbg(keystack, ("Ready to putnext KEYSOCK_HELLO.\n"));
646 		putnext(kc->kc_wq, mp);
647 	} else {
648 		minor_t ksminor;
649 
650 		/* Initialize keysock state. */
651 
652 		ks2dbg(keystack, ("Made it into PF_KEY socket open.\n"));
653 
654 		ksminor = (minor_t)(uintptr_t)
655 		    vmem_alloc(keysock_vmem, 1, VM_NOSLEEP);
656 		if (ksminor == 0) {
657 			netstack_rele(keystack->keystack_netstack);
658 			return (ENOMEM);
659 		}
660 		ks = kmem_zalloc(sizeof (keysock_t), KM_NOSLEEP);
661 		if (ks == NULL) {
662 			vmem_free(keysock_vmem, (void *)(uintptr_t)ksminor, 1);
663 			netstack_rele(keystack->keystack_netstack);
664 			return (ENOMEM);
665 		}
666 
667 		mutex_init(&ks->keysock_lock, NULL, MUTEX_DEFAULT, 0);
668 		ks->keysock_rq = q;
669 		ks->keysock_wq = WR(q);
670 		ks->keysock_state = TS_UNBND;
671 		ks->keysock_serial = ksminor;
672 
673 		q->q_ptr = ks;
674 		WR(q)->q_ptr = ks;
675 		ks->keysock_keystack = keystack;
676 
677 		/*
678 		 * The receive hiwat is only looked at on the stream head
679 		 * queue.  Store in q_hiwat in order to return on SO_RCVBUF
680 		 * getsockopts.
681 		 */
682 
683 		q->q_hiwat = keystack->keystack_recv_hiwat;
684 
685 		/*
686 		 * The transmit hiwat/lowat is only looked at on IP's queue.
687 		 * Store in q_hiwat/q_lowat in order to return on
688 		 * SO_SNDBUF/SO_SNDLOWAT getsockopts.
689 		 */
690 
691 		WR(q)->q_hiwat = keystack->keystack_xmit_hiwat;
692 		WR(q)->q_lowat = keystack->keystack_xmit_lowat;
693 
694 		*devp = makedevice(getmajor(*devp), ksminor);
695 
696 		/*
697 		 * Thread keysock into the global keysock list.
698 		 */
699 		mutex_enter(&keystack->keystack_list_lock);
700 		ks->keysock_next = keystack->keystack_list;
701 		ks->keysock_ptpn = &keystack->keystack_list;
702 		if (keystack->keystack_list != NULL) {
703 			keystack->keystack_list->keysock_ptpn =
704 			    &ks->keysock_next;
705 		}
706 		keystack->keystack_list = ks;
707 		mutex_exit(&keystack->keystack_list_lock);
708 
709 		qprocson(q);
710 		(void) proto_set_rx_hiwat(q, NULL,
711 		    keystack->keystack_recv_hiwat);
712 		/*
713 		 * Wait outside the keysock module perimeter for IPsec
714 		 * plumbing to be completed.  If it fails, keysock_close()
715 		 * undoes everything we just did.
716 		 */
717 		if (!ipsec_loader_wait(q,
718 		    keystack->keystack_netstack->netstack_ipsec)) {
719 			(void) keysock_close(q);
720 			return (EPFNOSUPPORT);
721 		}
722 	}
723 
724 	return (0);
725 }
726 
727 /* BELOW THIS LINE ARE ROUTINES INCLUDING AND RELATED TO keysock_wput(). */
728 
729 /*
730  * Copy relevant state bits.
731  */
732 static void
733 keysock_copy_info(struct T_info_ack *tap, keysock_t *ks)
734 {
735 	*tap = keysock_g_t_info_ack;
736 	tap->CURRENT_state = ks->keysock_state;
737 	tap->OPT_size = keysock_max_optsize;
738 }
739 
740 /*
741  * This routine responds to T_CAPABILITY_REQ messages.  It is called by
742  * keysock_wput.  Much of the T_CAPABILITY_ACK information is copied from
743  * keysock_g_t_info_ack.  The current state of the stream is copied from
744  * keysock_state.
745  */
746 static void
747 keysock_capability_req(queue_t *q, mblk_t *mp)
748 {
749 	keysock_t *ks = (keysock_t *)q->q_ptr;
750 	t_uscalar_t cap_bits1;
751 	struct T_capability_ack	*tcap;
752 
753 	cap_bits1 = ((struct T_capability_req *)mp->b_rptr)->CAP_bits1;
754 
755 	mp = tpi_ack_alloc(mp, sizeof (struct T_capability_ack),
756 	    mp->b_datap->db_type, T_CAPABILITY_ACK);
757 	if (mp == NULL)
758 		return;
759 
760 	tcap = (struct T_capability_ack *)mp->b_rptr;
761 	tcap->CAP_bits1 = 0;
762 
763 	if (cap_bits1 & TC1_INFO) {
764 		keysock_copy_info(&tcap->INFO_ack, ks);
765 		tcap->CAP_bits1 |= TC1_INFO;
766 	}
767 
768 	qreply(q, mp);
769 }
770 
771 /*
772  * This routine responds to T_INFO_REQ messages. It is called by
773  * keysock_wput_other.
774  * Most of the T_INFO_ACK information is copied from keysock_g_t_info_ack.
775  * The current state of the stream is copied from keysock_state.
776  */
777 static void
778 keysock_info_req(q, mp)
779 	queue_t	*q;
780 	mblk_t	*mp;
781 {
782 	mp = tpi_ack_alloc(mp, sizeof (struct T_info_ack), M_PCPROTO,
783 	    T_INFO_ACK);
784 	if (mp == NULL)
785 		return;
786 	keysock_copy_info((struct T_info_ack *)mp->b_rptr,
787 	    (keysock_t *)q->q_ptr);
788 	qreply(q, mp);
789 }
790 
791 /*
792  * keysock_err_ack. This routine creates a
793  * T_ERROR_ACK message and passes it
794  * upstream.
795  */
796 static void
797 keysock_err_ack(q, mp, t_error, sys_error)
798 	queue_t	*q;
799 	mblk_t	*mp;
800 	int	t_error;
801 	int	sys_error;
802 {
803 	if ((mp = mi_tpi_err_ack_alloc(mp, t_error, sys_error)) != NULL)
804 		qreply(q, mp);
805 }
806 
807 /*
808  * This routine retrieves the current status of socket options.
809  * It returns the size of the option retrieved.
810  */
811 /* ARGSUSED */
812 int
813 keysock_opt_get(queue_t *q, int level, int name, uchar_t *ptr)
814 {
815 	int *i1 = (int *)ptr;
816 	keysock_t *ks = (keysock_t *)q->q_ptr;
817 
818 	switch (level) {
819 	case SOL_SOCKET:
820 		mutex_enter(&ks->keysock_lock);
821 		switch (name) {
822 		case SO_TYPE:
823 			*i1 = SOCK_RAW;
824 			break;
825 		case SO_USELOOPBACK:
826 			*i1 = (int)(!((ks->keysock_flags & KEYSOCK_NOLOOP) ==
827 			    KEYSOCK_NOLOOP));
828 			break;
829 		/*
830 		 * The following two items can be manipulated,
831 		 * but changing them should do nothing.
832 		 */
833 		case SO_SNDBUF:
834 			*i1 = (int)q->q_hiwat;
835 			break;
836 		case SO_RCVBUF:
837 			*i1 = (int)(RD(q)->q_hiwat);
838 			break;
839 		}
840 		mutex_exit(&ks->keysock_lock);
841 		break;
842 	default:
843 		return (0);
844 	}
845 	return (sizeof (int));
846 }
847 
848 /*
849  * This routine sets socket options.
850  */
851 /* ARGSUSED */
852 int
853 keysock_opt_set(queue_t *q, uint_t mgmt_flags, int level,
854     int name, uint_t inlen, uchar_t *invalp, uint_t *outlenp,
855     uchar_t *outvalp, void *thisdg_attrs, cred_t *cr, mblk_t *mblk)
856 {
857 	int *i1 = (int *)invalp, errno = 0;
858 	keysock_t *ks = (keysock_t *)q->q_ptr;
859 	keysock_stack_t	*keystack = ks->keysock_keystack;
860 
861 	switch (level) {
862 	case SOL_SOCKET:
863 		mutex_enter(&ks->keysock_lock);
864 		switch (name) {
865 		case SO_USELOOPBACK:
866 			if (!(*i1))
867 				ks->keysock_flags |= KEYSOCK_NOLOOP;
868 			else ks->keysock_flags &= ~KEYSOCK_NOLOOP;
869 			break;
870 		case SO_SNDBUF:
871 			if (*i1 > keystack->keystack_max_buf)
872 				errno = ENOBUFS;
873 			else q->q_hiwat = *i1;
874 			break;
875 		case SO_RCVBUF:
876 			if (*i1 > keystack->keystack_max_buf) {
877 				errno = ENOBUFS;
878 			} else {
879 				RD(q)->q_hiwat = *i1;
880 				(void) proto_set_rx_hiwat(RD(q), NULL, *i1);
881 			}
882 			break;
883 		default:
884 			errno = EINVAL;
885 		}
886 		mutex_exit(&ks->keysock_lock);
887 		break;
888 	default:
889 		errno = EINVAL;
890 	}
891 	return (errno);
892 }
893 
894 /*
895  * Handle STREAMS messages.
896  */
897 static void
898 keysock_wput_other(queue_t *q, mblk_t *mp)
899 {
900 	struct iocblk *iocp;
901 	int error;
902 	keysock_t *ks = (keysock_t *)q->q_ptr;
903 	keysock_stack_t	*keystack = ks->keysock_keystack;
904 	cred_t		*cr;
905 
906 	switch (mp->b_datap->db_type) {
907 	case M_PROTO:
908 	case M_PCPROTO:
909 		if ((mp->b_wptr - mp->b_rptr) < sizeof (long)) {
910 			ks3dbg(keystack, (
911 			    "keysock_wput_other: Not big enough M_PROTO\n"));
912 			freemsg(mp);
913 			return;
914 		}
915 		cr = zone_get_kcred(netstackid_to_zoneid(
916 		    keystack->keystack_netstack->netstack_stackid));
917 		ASSERT(cr != NULL);
918 
919 		switch (((union T_primitives *)mp->b_rptr)->type) {
920 		case T_CAPABILITY_REQ:
921 			keysock_capability_req(q, mp);
922 			break;
923 		case T_INFO_REQ:
924 			keysock_info_req(q, mp);
925 			break;
926 		case T_SVR4_OPTMGMT_REQ:
927 			(void) svr4_optcom_req(q, mp, DB_CREDDEF(mp, cr),
928 			    &keysock_opt_obj, B_FALSE);
929 			break;
930 		case T_OPTMGMT_REQ:
931 			(void) tpi_optcom_req(q, mp, DB_CREDDEF(mp, cr),
932 			    &keysock_opt_obj, B_FALSE);
933 			break;
934 		case T_DATA_REQ:
935 		case T_EXDATA_REQ:
936 		case T_ORDREL_REQ:
937 			/* Illegal for keysock. */
938 			freemsg(mp);
939 			(void) putnextctl1(RD(q), M_ERROR, EPROTO);
940 			break;
941 		default:
942 			/* Not supported by keysock. */
943 			keysock_err_ack(q, mp, TNOTSUPPORT, 0);
944 			break;
945 		}
946 		crfree(cr);
947 		return;
948 	case M_IOCTL:
949 		iocp = (struct iocblk *)mp->b_rptr;
950 		error = EINVAL;
951 
952 		switch (iocp->ioc_cmd) {
953 		case ND_SET:
954 		case ND_GET:
955 			if (nd_getset(q, keystack->keystack_g_nd, mp)) {
956 				qreply(q, mp);
957 				return;
958 			} else
959 				error = ENOENT;
960 			/* FALLTHRU */
961 		default:
962 			miocnak(q, mp, 0, error);
963 			return;
964 		}
965 	case M_FLUSH:
966 		if (*mp->b_rptr & FLUSHW) {
967 			flushq(q, FLUSHALL);
968 			*mp->b_rptr &= ~FLUSHW;
969 		}
970 		if (*mp->b_rptr & FLUSHR) {
971 			qreply(q, mp);
972 			return;
973 		}
974 		/* Else FALLTHRU */
975 	}
976 
977 	/* If fell through, just black-hole the message. */
978 	freemsg(mp);
979 }
980 
981 /*
982  * Transmit a PF_KEY error message to the instance either pointed to
983  * by ks, the instance with serial number serial, or more, depending.
984  *
985  * The faulty message (or a reasonable facsimile thereof) is in mp.
986  * This function will free mp or recycle it for delivery, thereby causing
987  * the stream head to free it.
988  */
989 static void
990 keysock_error(keysock_t *ks, mblk_t *mp, int error, int diagnostic)
991 {
992 	sadb_msg_t *samsg = (sadb_msg_t *)mp->b_rptr;
993 	keysock_stack_t	*keystack = ks->keysock_keystack;
994 
995 	ASSERT(mp->b_datap->db_type == M_DATA);
996 
997 	if (samsg->sadb_msg_type < SADB_GETSPI ||
998 	    samsg->sadb_msg_type > SADB_MAX)
999 		samsg->sadb_msg_type = SADB_RESERVED;
1000 
1001 	/*
1002 	 * Strip out extension headers.
1003 	 */
1004 	ASSERT(mp->b_rptr + sizeof (*samsg) <= mp->b_datap->db_lim);
1005 	mp->b_wptr = mp->b_rptr + sizeof (*samsg);
1006 	samsg->sadb_msg_len = SADB_8TO64(sizeof (sadb_msg_t));
1007 	samsg->sadb_msg_errno = (uint8_t)error;
1008 	samsg->sadb_x_msg_diagnostic = (uint16_t)diagnostic;
1009 
1010 	keysock_passup(mp, samsg, ks->keysock_serial, NULL, B_FALSE, keystack);
1011 }
1012 
1013 /*
1014  * Pass down a message to a consumer.  Wrap it in KEYSOCK_IN, and copy
1015  * in the extv if passed in.
1016  */
1017 static void
1018 keysock_passdown(keysock_t *ks, mblk_t *mp, uint8_t satype, sadb_ext_t *extv[],
1019     boolean_t flushmsg)
1020 {
1021 	keysock_consumer_t *kc;
1022 	mblk_t *wrapper;
1023 	keysock_in_t *ksi;
1024 	int i;
1025 	keysock_stack_t	*keystack = ks->keysock_keystack;
1026 
1027 	wrapper = allocb(sizeof (ipsec_info_t), BPRI_HI);
1028 	if (wrapper == NULL) {
1029 		ks3dbg(keystack, ("keysock_passdown: allocb failed.\n"));
1030 		if (extv[SADB_EXT_KEY_ENCRYPT] != NULL)
1031 			bzero(extv[SADB_EXT_KEY_ENCRYPT],
1032 			    SADB_64TO8(
1033 			    extv[SADB_EXT_KEY_ENCRYPT]->sadb_ext_len));
1034 		if (extv[SADB_EXT_KEY_AUTH] != NULL)
1035 			bzero(extv[SADB_EXT_KEY_AUTH],
1036 			    SADB_64TO8(
1037 			    extv[SADB_EXT_KEY_AUTH]->sadb_ext_len));
1038 		if (flushmsg) {
1039 			ks0dbg((
1040 			    "keysock: Downwards flush/dump message failed!\n"));
1041 			/* If this is true, I hold the perimeter. */
1042 			keystack->keystack_flushdump--;
1043 		}
1044 		freemsg(mp);
1045 		return;
1046 	}
1047 
1048 	wrapper->b_datap->db_type = M_CTL;
1049 	ksi = (keysock_in_t *)wrapper->b_rptr;
1050 	ksi->ks_in_type = KEYSOCK_IN;
1051 	ksi->ks_in_len = sizeof (keysock_in_t);
1052 	if (extv[SADB_EXT_ADDRESS_SRC] != NULL)
1053 		ksi->ks_in_srctype = KS_IN_ADDR_UNKNOWN;
1054 	else ksi->ks_in_srctype = KS_IN_ADDR_NOTTHERE;
1055 	if (extv[SADB_EXT_ADDRESS_DST] != NULL)
1056 		ksi->ks_in_dsttype = KS_IN_ADDR_UNKNOWN;
1057 	else ksi->ks_in_dsttype = KS_IN_ADDR_NOTTHERE;
1058 	for (i = 0; i <= SADB_EXT_MAX; i++)
1059 		ksi->ks_in_extv[i] = extv[i];
1060 	ksi->ks_in_serial = ks->keysock_serial;
1061 	wrapper->b_wptr += sizeof (ipsec_info_t);
1062 	wrapper->b_cont = mp;
1063 
1064 	/*
1065 	 * Find the appropriate consumer where the message is passed down.
1066 	 */
1067 	kc = keystack->keystack_consumers[satype];
1068 	if (kc == NULL) {
1069 		freeb(wrapper);
1070 		keysock_error(ks, mp, EINVAL, SADB_X_DIAGNOSTIC_UNKNOWN_SATYPE);
1071 		if (flushmsg) {
1072 			ks0dbg((
1073 			    "keysock: Downwards flush/dump message failed!\n"));
1074 			/* If this is true, I hold the perimeter. */
1075 			keystack->keystack_flushdump--;
1076 		}
1077 		return;
1078 	}
1079 
1080 	/*
1081 	 * NOTE: There used to be code in here to spin while a flush or
1082 	 *	 dump finished.  Keysock now assumes that consumers have enough
1083 	 *	 MT-savviness to deal with that.
1084 	 */
1085 
1086 	/*
1087 	 * Current consumers (AH and ESP) are guaranteed to return a
1088 	 * FLUSH or DUMP message back, so when we reach here, we don't
1089 	 * have to worry about keysock_flushdumps.
1090 	 */
1091 
1092 	putnext(kc->kc_wq, wrapper);
1093 }
1094 
1095 /*
1096  * High-level reality checking of extensions.
1097  */
1098 static boolean_t
1099 ext_check(sadb_ext_t *ext, keysock_stack_t *keystack)
1100 {
1101 	int i;
1102 	uint64_t *lp;
1103 	sadb_ident_t *id;
1104 	char *idstr;
1105 
1106 	switch (ext->sadb_ext_type) {
1107 	case SADB_EXT_ADDRESS_SRC:
1108 	case SADB_EXT_ADDRESS_DST:
1109 	case SADB_X_EXT_ADDRESS_INNER_SRC:
1110 	case SADB_X_EXT_ADDRESS_INNER_DST:
1111 		/* Check for at least enough addtl length for a sockaddr. */
1112 		if (ext->sadb_ext_len <= SADB_8TO64(sizeof (sadb_address_t)))
1113 			return (B_FALSE);
1114 		break;
1115 	case SADB_EXT_LIFETIME_HARD:
1116 	case SADB_EXT_LIFETIME_SOFT:
1117 	case SADB_EXT_LIFETIME_CURRENT:
1118 		if (ext->sadb_ext_len != SADB_8TO64(sizeof (sadb_lifetime_t)))
1119 			return (B_FALSE);
1120 		break;
1121 	case SADB_EXT_SPIRANGE:
1122 		/* See if the SPI range is legit. */
1123 		if (htonl(((sadb_spirange_t *)ext)->sadb_spirange_min) >
1124 		    htonl(((sadb_spirange_t *)ext)->sadb_spirange_max))
1125 			return (B_FALSE);
1126 		break;
1127 	case SADB_EXT_KEY_AUTH:
1128 	case SADB_EXT_KEY_ENCRYPT:
1129 		/* Key length check. */
1130 		if (((sadb_key_t *)ext)->sadb_key_bits == 0)
1131 			return (B_FALSE);
1132 		/*
1133 		 * Check to see if the key length (in bits) is less than the
1134 		 * extension length (in 8-bits words).
1135 		 */
1136 		if ((roundup(SADB_1TO8(((sadb_key_t *)ext)->sadb_key_bits), 8) +
1137 		    sizeof (sadb_key_t)) != SADB_64TO8(ext->sadb_ext_len)) {
1138 			ks1dbg(keystack, (
1139 			    "ext_check:  Key bits/length inconsistent.\n"));
1140 			ks1dbg(keystack, ("%d bits, len is %d bytes.\n",
1141 			    ((sadb_key_t *)ext)->sadb_key_bits,
1142 			    SADB_64TO8(ext->sadb_ext_len)));
1143 			return (B_FALSE);
1144 		}
1145 
1146 		/* All-zeroes key check. */
1147 		lp = (uint64_t *)(((char *)ext) + sizeof (sadb_key_t));
1148 		for (i = 0;
1149 		    i < (ext->sadb_ext_len - SADB_8TO64(sizeof (sadb_key_t)));
1150 		    i++)
1151 			if (lp[i] != 0)
1152 				break;	/* Out of for loop. */
1153 		/* If finished the loop naturally, it's an all zero key. */
1154 		if (lp[i] == 0)
1155 			return (B_FALSE);
1156 		break;
1157 	case SADB_EXT_IDENTITY_SRC:
1158 	case SADB_EXT_IDENTITY_DST:
1159 		/*
1160 		 * Make sure the strings in these identities are
1161 		 * null-terminated.  RFC 2367 underspecified how to handle
1162 		 * such a case.  I "proactively" null-terminate the string
1163 		 * at the last byte if it's not terminated sooner.
1164 		 */
1165 		id = (sadb_ident_t *)ext;
1166 		i = SADB_64TO8(id->sadb_ident_len);
1167 		i -= sizeof (sadb_ident_t);
1168 		idstr = (char *)(id + 1);
1169 		while (*idstr != '\0' && i > 0) {
1170 			i--;
1171 			idstr++;
1172 		}
1173 		if (i == 0) {
1174 			/*
1175 			 * I.e., if the bozo user didn't NULL-terminate the
1176 			 * string...
1177 			 */
1178 			idstr--;
1179 			*idstr = '\0';
1180 		}
1181 		break;
1182 	}
1183 	return (B_TRUE);	/* For now... */
1184 }
1185 
1186 /* Return values for keysock_get_ext(). */
1187 #define	KGE_OK	0
1188 #define	KGE_DUP	1
1189 #define	KGE_UNK	2
1190 #define	KGE_LEN	3
1191 #define	KGE_CHK	4
1192 
1193 /*
1194  * Parse basic extension headers and return in the passed-in pointer vector.
1195  * Return values include:
1196  *
1197  *	KGE_OK	Everything's nice and parsed out.
1198  *		If there are no extensions, place NULL in extv[0].
1199  *	KGE_DUP	There is a duplicate extension.
1200  *		First instance in appropriate bin.  First duplicate in
1201  *		extv[0].
1202  *	KGE_UNK	Unknown extension type encountered.  extv[0] contains
1203  *		unknown header.
1204  *	KGE_LEN	Extension length error.
1205  *	KGE_CHK	High-level reality check failed on specific extension.
1206  *
1207  * My apologies for some of the pointer arithmetic in here.  I'm thinking
1208  * like an assembly programmer, yet trying to make the compiler happy.
1209  */
1210 static int
1211 keysock_get_ext(sadb_ext_t *extv[], sadb_msg_t *basehdr, uint_t msgsize,
1212     keysock_stack_t *keystack)
1213 {
1214 	bzero(extv, sizeof (sadb_ext_t *) * (SADB_EXT_MAX + 1));
1215 
1216 	/* Use extv[0] as the "current working pointer". */
1217 
1218 	extv[0] = (sadb_ext_t *)(basehdr + 1);
1219 
1220 	while (extv[0] < (sadb_ext_t *)(((uint8_t *)basehdr) + msgsize)) {
1221 		/* Check for unknown headers. */
1222 		if (extv[0]->sadb_ext_type == 0 ||
1223 		    extv[0]->sadb_ext_type > SADB_EXT_MAX)
1224 			return (KGE_UNK);
1225 
1226 		/*
1227 		 * Check length.  Use uint64_t because extlen is in units
1228 		 * of 64-bit words.  If length goes beyond the msgsize,
1229 		 * return an error.  (Zero length also qualifies here.)
1230 		 */
1231 		if (extv[0]->sadb_ext_len == 0 ||
1232 		    (void *)((uint64_t *)extv[0] + extv[0]->sadb_ext_len) >
1233 		    (void *)((uint8_t *)basehdr + msgsize))
1234 			return (KGE_LEN);
1235 
1236 		/* Check for redundant headers. */
1237 		if (extv[extv[0]->sadb_ext_type] != NULL)
1238 			return (KGE_DUP);
1239 
1240 		/*
1241 		 * Reality check the extension if possible at the keysock
1242 		 * level.
1243 		 */
1244 		if (!ext_check(extv[0], keystack))
1245 			return (KGE_CHK);
1246 
1247 		/* If I make it here, assign the appropriate bin. */
1248 		extv[extv[0]->sadb_ext_type] = extv[0];
1249 
1250 		/* Advance pointer (See above for uint64_t ptr reasoning.) */
1251 		extv[0] = (sadb_ext_t *)
1252 		    ((uint64_t *)extv[0] + extv[0]->sadb_ext_len);
1253 	}
1254 
1255 	/* Everything's cool. */
1256 
1257 	/*
1258 	 * If extv[0] == NULL, then there are no extension headers in this
1259 	 * message.  Ensure that this is the case.
1260 	 */
1261 	if (extv[0] == (sadb_ext_t *)(basehdr + 1))
1262 		extv[0] = NULL;
1263 
1264 	return (KGE_OK);
1265 }
1266 
1267 /*
1268  * qwriter() callback to handle flushes and dumps.  This routine will hold
1269  * the inner perimeter.
1270  */
1271 void
1272 keysock_do_flushdump(queue_t *q, mblk_t *mp)
1273 {
1274 	int i, start, finish;
1275 	mblk_t *mp1 = NULL;
1276 	keysock_t *ks = (keysock_t *)q->q_ptr;
1277 	sadb_ext_t *extv[SADB_EXT_MAX + 1];
1278 	sadb_msg_t *samsg = (sadb_msg_t *)mp->b_rptr;
1279 	keysock_stack_t	*keystack = ks->keysock_keystack;
1280 
1281 	/*
1282 	 * I am guaranteed this will work.  I did the work in keysock_parse()
1283 	 * already.
1284 	 */
1285 	(void) keysock_get_ext(extv, samsg, SADB_64TO8(samsg->sadb_msg_len),
1286 	    keystack);
1287 
1288 	/*
1289 	 * I hold the perimeter, therefore I don't need to use atomic ops.
1290 	 */
1291 	if (keystack->keystack_flushdump != 0) {
1292 		/* XXX Should I instead use EBUSY? */
1293 		/* XXX Or is there a way to queue these up? */
1294 		keysock_error(ks, mp, ENOMEM, SADB_X_DIAGNOSTIC_NONE);
1295 		return;
1296 	}
1297 
1298 	if (samsg->sadb_msg_satype == SADB_SATYPE_UNSPEC) {
1299 		start = 0;
1300 		finish = KEYSOCK_MAX_CONSUMERS - 1;
1301 	} else {
1302 		start = samsg->sadb_msg_satype;
1303 		finish = samsg->sadb_msg_satype;
1304 	}
1305 
1306 	/*
1307 	 * Fill up keysock_flushdump with the number of outstanding dumps
1308 	 * and/or flushes.
1309 	 */
1310 
1311 	keystack->keystack_flushdump_errno = 0;
1312 
1313 	/*
1314 	 * Okay, I hold the perimeter.  Eventually keysock_flushdump will
1315 	 * contain the number of consumers with outstanding flush operations.
1316 	 *
1317 	 * SO, here's the plan:
1318 	 *	* For each relevant consumer (Might be one, might be all)
1319 	 *		* Twiddle on the FLUSHING flag.
1320 	 *		* Pass down the FLUSH/DUMP message.
1321 	 *
1322 	 * When I see upbound FLUSH/DUMP messages, I will decrement the
1323 	 * keysock_flushdump.  When I decrement it to 0, I will pass the
1324 	 * FLUSH/DUMP message back up to the PF_KEY sockets.  Because I will
1325 	 * pass down the right SA type to the consumer (either its own, or
1326 	 * that of UNSPEC), the right one will be reflected from each consumer,
1327 	 * and accordingly back to the socket.
1328 	 */
1329 
1330 	mutex_enter(&keystack->keystack_consumers_lock);
1331 	for (i = start; i <= finish; i++) {
1332 		if (keystack->keystack_consumers[i] != NULL) {
1333 			mp1 = copymsg(mp);
1334 			if (mp1 == NULL) {
1335 				ks0dbg(("SADB_FLUSH copymsg() failed.\n"));
1336 				/*
1337 				 * Error?  And what about outstanding
1338 				 * flushes?  Oh, yeah, they get sucked up and
1339 				 * the counter is decremented.  Consumers
1340 				 * (see keysock_passdown()) are guaranteed
1341 				 * to deliver back a flush request, even if
1342 				 * it's an error.
1343 				 */
1344 				keysock_error(ks, mp, ENOMEM,
1345 				    SADB_X_DIAGNOSTIC_NONE);
1346 				return;
1347 			}
1348 			/*
1349 			 * Because my entry conditions are met above, the
1350 			 * following assertion should hold true.
1351 			 */
1352 			mutex_enter(&keystack->keystack_consumers[i]->kc_lock);
1353 			ASSERT((keystack->keystack_consumers[i]->kc_flags &
1354 			    KC_FLUSHING) == 0);
1355 			keystack->keystack_consumers[i]->kc_flags |=
1356 			    KC_FLUSHING;
1357 			mutex_exit(&(keystack->keystack_consumers[i]->kc_lock));
1358 			/* Always increment the number of flushes... */
1359 			keystack->keystack_flushdump++;
1360 			/* Guaranteed to return a message. */
1361 			keysock_passdown(ks, mp1, i, extv, B_TRUE);
1362 		} else if (start == finish) {
1363 			/*
1364 			 * In case where start == finish, and there's no
1365 			 * consumer, should we force an error?  Yes.
1366 			 */
1367 			mutex_exit(&keystack->keystack_consumers_lock);
1368 			keysock_error(ks, mp, EINVAL,
1369 			    SADB_X_DIAGNOSTIC_UNKNOWN_SATYPE);
1370 			return;
1371 		}
1372 	}
1373 	mutex_exit(&keystack->keystack_consumers_lock);
1374 
1375 	if (keystack->keystack_flushdump == 0) {
1376 		/*
1377 		 * There were no consumers at all for this message.
1378 		 * XXX For now return ESRCH.
1379 		 */
1380 		keysock_error(ks, mp, ESRCH, SADB_X_DIAGNOSTIC_NO_SADBS);
1381 	} else {
1382 		/* Otherwise, free the original message. */
1383 		freemsg(mp);
1384 	}
1385 }
1386 
1387 /*
1388  * Get the right diagnostic for a duplicate.  Should probably use a static
1389  * table lookup.
1390  */
1391 int
1392 keysock_duplicate(int ext_type)
1393 {
1394 	int rc = 0;
1395 
1396 	switch (ext_type) {
1397 	case SADB_EXT_ADDRESS_SRC:
1398 		rc = SADB_X_DIAGNOSTIC_DUPLICATE_SRC;
1399 		break;
1400 	case SADB_EXT_ADDRESS_DST:
1401 		rc = SADB_X_DIAGNOSTIC_DUPLICATE_DST;
1402 		break;
1403 	case SADB_X_EXT_ADDRESS_INNER_SRC:
1404 		rc = SADB_X_DIAGNOSTIC_DUPLICATE_INNER_SRC;
1405 		break;
1406 	case SADB_X_EXT_ADDRESS_INNER_DST:
1407 		rc = SADB_X_DIAGNOSTIC_DUPLICATE_INNER_DST;
1408 		break;
1409 	case SADB_EXT_SA:
1410 		rc = SADB_X_DIAGNOSTIC_DUPLICATE_SA;
1411 		break;
1412 	case SADB_EXT_SPIRANGE:
1413 		rc = SADB_X_DIAGNOSTIC_DUPLICATE_RANGE;
1414 		break;
1415 	case SADB_EXT_KEY_AUTH:
1416 		rc = SADB_X_DIAGNOSTIC_DUPLICATE_AKEY;
1417 		break;
1418 	case SADB_EXT_KEY_ENCRYPT:
1419 		rc = SADB_X_DIAGNOSTIC_DUPLICATE_EKEY;
1420 		break;
1421 	}
1422 	return (rc);
1423 }
1424 
1425 /*
1426  * Get the right diagnostic for a reality check failure.  Should probably use
1427  * a static table lookup.
1428  */
1429 int
1430 keysock_malformed(int ext_type)
1431 {
1432 	int rc = 0;
1433 
1434 	switch (ext_type) {
1435 	case SADB_EXT_ADDRESS_SRC:
1436 		rc = SADB_X_DIAGNOSTIC_MALFORMED_SRC;
1437 		break;
1438 	case SADB_EXT_ADDRESS_DST:
1439 		rc = SADB_X_DIAGNOSTIC_MALFORMED_DST;
1440 		break;
1441 	case SADB_X_EXT_ADDRESS_INNER_SRC:
1442 		rc = SADB_X_DIAGNOSTIC_MALFORMED_INNER_SRC;
1443 		break;
1444 	case SADB_X_EXT_ADDRESS_INNER_DST:
1445 		rc = SADB_X_DIAGNOSTIC_MALFORMED_INNER_DST;
1446 		break;
1447 	case SADB_EXT_SA:
1448 		rc = SADB_X_DIAGNOSTIC_MALFORMED_SA;
1449 		break;
1450 	case SADB_EXT_SPIRANGE:
1451 		rc = SADB_X_DIAGNOSTIC_MALFORMED_RANGE;
1452 		break;
1453 	case SADB_EXT_KEY_AUTH:
1454 		rc = SADB_X_DIAGNOSTIC_MALFORMED_AKEY;
1455 		break;
1456 	case SADB_EXT_KEY_ENCRYPT:
1457 		rc = SADB_X_DIAGNOSTIC_MALFORMED_EKEY;
1458 		break;
1459 	}
1460 	return (rc);
1461 }
1462 
1463 /*
1464  * Keysock massaging of an inverse ACQUIRE.  Consult policy,
1465  * and construct an appropriate response.
1466  */
1467 static void
1468 keysock_inverse_acquire(mblk_t *mp, sadb_msg_t *samsg, sadb_ext_t *extv[],
1469     keysock_t *ks)
1470 {
1471 	mblk_t *reply_mp;
1472 	keysock_stack_t	*keystack = ks->keysock_keystack;
1473 
1474 	/*
1475 	 * Reality check things...
1476 	 */
1477 	if (extv[SADB_EXT_ADDRESS_SRC] == NULL) {
1478 		keysock_error(ks, mp, EINVAL, SADB_X_DIAGNOSTIC_MISSING_SRC);
1479 		return;
1480 	}
1481 	if (extv[SADB_EXT_ADDRESS_DST] == NULL) {
1482 		keysock_error(ks, mp, EINVAL, SADB_X_DIAGNOSTIC_MISSING_DST);
1483 		return;
1484 	}
1485 
1486 	if (extv[SADB_X_EXT_ADDRESS_INNER_SRC] != NULL &&
1487 	    extv[SADB_X_EXT_ADDRESS_INNER_DST] == NULL) {
1488 		keysock_error(ks, mp, EINVAL,
1489 		    SADB_X_DIAGNOSTIC_MISSING_INNER_DST);
1490 		return;
1491 	}
1492 
1493 	if (extv[SADB_X_EXT_ADDRESS_INNER_SRC] == NULL &&
1494 	    extv[SADB_X_EXT_ADDRESS_INNER_DST] != NULL) {
1495 		keysock_error(ks, mp, EINVAL,
1496 		    SADB_X_DIAGNOSTIC_MISSING_INNER_SRC);
1497 		return;
1498 	}
1499 
1500 	reply_mp = ipsec_construct_inverse_acquire(samsg, extv,
1501 	    keystack->keystack_netstack);
1502 
1503 	if (reply_mp != NULL) {
1504 		freemsg(mp);
1505 		keysock_passup(reply_mp, (sadb_msg_t *)reply_mp->b_rptr,
1506 		    ks->keysock_serial, NULL, B_FALSE, keystack);
1507 	} else {
1508 		keysock_error(ks, mp, samsg->sadb_msg_errno,
1509 		    samsg->sadb_x_msg_diagnostic);
1510 	}
1511 }
1512 
1513 /*
1514  * Spew an extended REGISTER down to the relevant consumers.
1515  */
1516 static void
1517 keysock_extended_register(keysock_t *ks, mblk_t *mp, sadb_ext_t *extv[])
1518 {
1519 	sadb_x_ereg_t *ereg = (sadb_x_ereg_t *)extv[SADB_X_EXT_EREG];
1520 	uint8_t *satypes, *fencepost;
1521 	mblk_t *downmp;
1522 	sadb_ext_t *downextv[SADB_EXT_MAX + 1];
1523 	keysock_stack_t	*keystack = ks->keysock_keystack;
1524 
1525 	if (ks->keysock_registered[0] != 0 || ks->keysock_registered[1] != 0 ||
1526 	    ks->keysock_registered[2] != 0 || ks->keysock_registered[3] != 0) {
1527 		keysock_error(ks, mp, EBUSY, 0);
1528 	}
1529 
1530 	ks->keysock_flags |= KEYSOCK_EXTENDED;
1531 	if (ereg == NULL) {
1532 		keysock_error(ks, mp, EINVAL, SADB_X_DIAGNOSTIC_SATYPE_NEEDED);
1533 	} else {
1534 		ASSERT(mp->b_rptr + msgdsize(mp) == mp->b_wptr);
1535 		fencepost = (uint8_t *)mp->b_wptr;
1536 		satypes = ereg->sadb_x_ereg_satypes;
1537 		while (*satypes != SADB_SATYPE_UNSPEC && satypes != fencepost) {
1538 			downmp = copymsg(mp);
1539 			if (downmp == NULL) {
1540 				keysock_error(ks, mp, ENOMEM, 0);
1541 				return;
1542 			}
1543 			/*
1544 			 * Since we've made it here, keysock_get_ext will work!
1545 			 */
1546 			(void) keysock_get_ext(downextv,
1547 			    (sadb_msg_t *)downmp->b_rptr, msgdsize(downmp),
1548 			    keystack);
1549 			keysock_passdown(ks, downmp, *satypes, downextv,
1550 			    B_FALSE);
1551 			++satypes;
1552 		}
1553 		freemsg(mp);
1554 	}
1555 
1556 	/*
1557 	 * Set global to indicate we prefer an extended ACQUIRE.
1558 	 */
1559 	atomic_add_32(&keystack->keystack_num_extended, 1);
1560 }
1561 
1562 static void
1563 keysock_delpair_all(keysock_t *ks, mblk_t *mp, sadb_ext_t *extv[])
1564 {
1565 	int i, start, finish;
1566 	mblk_t *mp1 = NULL;
1567 	keysock_stack_t *keystack = ks->keysock_keystack;
1568 
1569 	start = 0;
1570 	finish = KEYSOCK_MAX_CONSUMERS - 1;
1571 
1572 	for (i = start; i <= finish; i++) {
1573 		if (keystack->keystack_consumers[i] != NULL) {
1574 			mp1 = copymsg(mp);
1575 			if (mp1 == NULL) {
1576 				keysock_error(ks, mp, ENOMEM,
1577 				    SADB_X_DIAGNOSTIC_NONE);
1578 				return;
1579 			}
1580 			keysock_passdown(ks, mp1, i, extv, B_FALSE);
1581 		}
1582 	}
1583 }
1584 
1585 /*
1586  * Handle PF_KEY messages.
1587  */
1588 static void
1589 keysock_parse(queue_t *q, mblk_t *mp)
1590 {
1591 	sadb_msg_t *samsg;
1592 	sadb_ext_t *extv[SADB_EXT_MAX + 1];
1593 	keysock_t *ks = (keysock_t *)q->q_ptr;
1594 	uint_t msgsize;
1595 	uint8_t satype;
1596 	keysock_stack_t	*keystack = ks->keysock_keystack;
1597 
1598 	/* Make sure I'm a PF_KEY socket.  (i.e. nothing's below me) */
1599 	ASSERT(WR(q)->q_next == NULL);
1600 
1601 	samsg = (sadb_msg_t *)mp->b_rptr;
1602 	ks2dbg(keystack, ("Received possible PF_KEY message, type %d.\n",
1603 	    samsg->sadb_msg_type));
1604 
1605 	msgsize = SADB_64TO8(samsg->sadb_msg_len);
1606 
1607 	if (msgdsize(mp) != msgsize) {
1608 		/*
1609 		 * Message len incorrect w.r.t. actual size.  Send an error
1610 		 * (EMSGSIZE).	It may be necessary to massage things a
1611 		 * bit.	 For example, if the sadb_msg_type is hosed,
1612 		 * I need to set it to SADB_RESERVED to get delivery to
1613 		 * do the right thing.	Then again, maybe just letting
1614 		 * the error delivery do the right thing.
1615 		 */
1616 		ks2dbg(keystack,
1617 		    ("mblk (%lu) and base (%d) message sizes don't jibe.\n",
1618 		    msgdsize(mp), msgsize));
1619 		keysock_error(ks, mp, EMSGSIZE, SADB_X_DIAGNOSTIC_NONE);
1620 		return;
1621 	}
1622 
1623 	if (msgsize > (uint_t)(mp->b_wptr - mp->b_rptr)) {
1624 		/* Get all message into one mblk. */
1625 		if (pullupmsg(mp, -1) == 0) {
1626 			/*
1627 			 * Something screwy happened.
1628 			 */
1629 			ks3dbg(keystack,
1630 			    ("keysock_parse: pullupmsg() failed.\n"));
1631 			return;
1632 		} else {
1633 			samsg = (sadb_msg_t *)mp->b_rptr;
1634 		}
1635 	}
1636 
1637 	switch (keysock_get_ext(extv, samsg, msgsize, keystack)) {
1638 	case KGE_DUP:
1639 		/* Handle duplicate extension. */
1640 		ks1dbg(keystack, ("Got duplicate extension of type %d.\n",
1641 		    extv[0]->sadb_ext_type));
1642 		keysock_error(ks, mp, EINVAL,
1643 		    keysock_duplicate(extv[0]->sadb_ext_type));
1644 		return;
1645 	case KGE_UNK:
1646 		/* Handle unknown extension. */
1647 		ks1dbg(keystack, ("Got unknown extension of type %d.\n",
1648 		    extv[0]->sadb_ext_type));
1649 		keysock_error(ks, mp, EINVAL, SADB_X_DIAGNOSTIC_UNKNOWN_EXT);
1650 		return;
1651 	case KGE_LEN:
1652 		/* Length error. */
1653 		ks1dbg(keystack,
1654 		    ("Length %d on extension type %d overrun or 0.\n",
1655 		    extv[0]->sadb_ext_len, extv[0]->sadb_ext_type));
1656 		keysock_error(ks, mp, EINVAL, SADB_X_DIAGNOSTIC_BAD_EXTLEN);
1657 		return;
1658 	case KGE_CHK:
1659 		/* Reality check failed. */
1660 		ks1dbg(keystack,
1661 		    ("Reality check failed on extension type %d.\n",
1662 		    extv[0]->sadb_ext_type));
1663 		keysock_error(ks, mp, EINVAL,
1664 		    keysock_malformed(extv[0]->sadb_ext_type));
1665 		return;
1666 	default:
1667 		/* Default case is no errors. */
1668 		break;
1669 	}
1670 
1671 	switch (samsg->sadb_msg_type) {
1672 	case SADB_REGISTER:
1673 		/*
1674 		 * There's a semantic weirdness in that a message OTHER than
1675 		 * the return REGISTER message may be passed up if I set the
1676 		 * registered bit BEFORE I pass it down.
1677 		 *
1678 		 * SOOOO, I'll not twiddle any registered bits until I see
1679 		 * the upbound REGISTER (with a serial number in it).
1680 		 */
1681 		if (samsg->sadb_msg_satype == SADB_SATYPE_UNSPEC) {
1682 			/* Handle extended register here. */
1683 			keysock_extended_register(ks, mp, extv);
1684 			return;
1685 		} else if (ks->keysock_flags & KEYSOCK_EXTENDED) {
1686 			keysock_error(ks, mp, EBUSY, 0);
1687 			return;
1688 		}
1689 		/* FALLTHRU */
1690 	case SADB_GETSPI:
1691 	case SADB_ADD:
1692 	case SADB_UPDATE:
1693 	case SADB_X_UPDATEPAIR:
1694 	case SADB_DELETE:
1695 	case SADB_X_DELPAIR:
1696 	case SADB_GET:
1697 		/*
1698 		 * Pass down to appropriate consumer.
1699 		 */
1700 		if (samsg->sadb_msg_satype != SADB_SATYPE_UNSPEC)
1701 			keysock_passdown(ks, mp, samsg->sadb_msg_satype, extv,
1702 			    B_FALSE);
1703 		else keysock_error(ks, mp, EINVAL,
1704 		    SADB_X_DIAGNOSTIC_SATYPE_NEEDED);
1705 		return;
1706 	case SADB_X_DELPAIR_STATE:
1707 		if (samsg->sadb_msg_satype == SADB_SATYPE_UNSPEC) {
1708 			keysock_delpair_all(ks, mp, extv);
1709 		} else {
1710 			keysock_passdown(ks, mp, samsg->sadb_msg_satype, extv,
1711 			    B_FALSE);
1712 		}
1713 		return;
1714 	case SADB_ACQUIRE:
1715 		/*
1716 		 * If I _receive_ an acquire, this means I should spread it
1717 		 * out to registered sockets.  Unless there's an errno...
1718 		 *
1719 		 * Need ADDRESS, may have ID, SENS, and PROP, unless errno,
1720 		 * in which case there should be NO extensions.
1721 		 *
1722 		 * Return to registered.
1723 		 */
1724 		if (samsg->sadb_msg_errno != 0) {
1725 			satype = samsg->sadb_msg_satype;
1726 			if (satype == SADB_SATYPE_UNSPEC) {
1727 				if (!(ks->keysock_flags & KEYSOCK_EXTENDED)) {
1728 					keysock_error(ks, mp, EINVAL,
1729 					    SADB_X_DIAGNOSTIC_SATYPE_NEEDED);
1730 					return;
1731 				}
1732 				/*
1733 				 * Reassign satype based on the first
1734 				 * flags that KEYSOCK_SETREG says.
1735 				 */
1736 				while (satype <= SADB_SATYPE_MAX) {
1737 					if (KEYSOCK_ISREG(ks, satype))
1738 						break;
1739 					satype++;
1740 				}
1741 				if (satype > SADB_SATYPE_MAX) {
1742 					keysock_error(ks, mp, EBUSY, 0);
1743 					return;
1744 				}
1745 			}
1746 			keysock_passdown(ks, mp, satype, extv, B_FALSE);
1747 		} else {
1748 			if (samsg->sadb_msg_satype == SADB_SATYPE_UNSPEC) {
1749 				keysock_error(ks, mp, EINVAL,
1750 				    SADB_X_DIAGNOSTIC_SATYPE_NEEDED);
1751 			} else {
1752 				keysock_passup(mp, samsg, 0, NULL, B_FALSE,
1753 				    keystack);
1754 			}
1755 		}
1756 		return;
1757 	case SADB_EXPIRE:
1758 		/*
1759 		 * If someone sends this in, then send out to all senders.
1760 		 * (Save maybe ESP or AH, I have to be careful here.)
1761 		 *
1762 		 * Need ADDRESS, may have ID and SENS.
1763 		 *
1764 		 * XXX for now this is unsupported.
1765 		 */
1766 		break;
1767 	case SADB_FLUSH:
1768 		/*
1769 		 * Nuke all SAs.
1770 		 *
1771 		 * No extensions at all.  Return to all listeners.
1772 		 *
1773 		 * Question:	Should I hold a lock here to prevent
1774 		 *		additions/deletions while flushing?
1775 		 * Answer:	No.  (See keysock_passdown() for details.)
1776 		 */
1777 		if (extv[0] != NULL) {
1778 			/*
1779 			 * FLUSH messages shouldn't have extensions.
1780 			 * Return EINVAL.
1781 			 */
1782 			ks2dbg(keystack, ("FLUSH message with extension.\n"));
1783 			keysock_error(ks, mp, EINVAL, SADB_X_DIAGNOSTIC_NO_EXT);
1784 			return;
1785 		}
1786 
1787 		/* Passing down of DUMP/FLUSH messages are special. */
1788 		qwriter(q, mp, keysock_do_flushdump, PERIM_INNER);
1789 		return;
1790 	case SADB_DUMP:	 /* not used by normal applications */
1791 		if ((extv[0] != NULL) &&
1792 		    ((msgsize >
1793 		    (sizeof (sadb_msg_t) + sizeof (sadb_x_edump_t))) ||
1794 		    (extv[SADB_X_EXT_EDUMP] == NULL))) {
1795 				keysock_error(ks, mp, EINVAL,
1796 				    SADB_X_DIAGNOSTIC_NO_EXT);
1797 				return;
1798 		}
1799 		qwriter(q, mp, keysock_do_flushdump, PERIM_INNER);
1800 		return;
1801 	case SADB_X_PROMISC:
1802 		/*
1803 		 * Promiscuous processing message.
1804 		 */
1805 		if (samsg->sadb_msg_satype == 0)
1806 			ks->keysock_flags &= ~KEYSOCK_PROMISC;
1807 		else
1808 			ks->keysock_flags |= KEYSOCK_PROMISC;
1809 		keysock_passup(mp, samsg, ks->keysock_serial, NULL, B_FALSE,
1810 		    keystack);
1811 		return;
1812 	case SADB_X_INVERSE_ACQUIRE:
1813 		keysock_inverse_acquire(mp, samsg, extv, ks);
1814 		return;
1815 	default:
1816 		ks2dbg(keystack, ("Got unknown message type %d.\n",
1817 		    samsg->sadb_msg_type));
1818 		keysock_error(ks, mp, EINVAL, SADB_X_DIAGNOSTIC_UNKNOWN_MSG);
1819 		return;
1820 	}
1821 
1822 	/* As a placeholder... */
1823 	ks0dbg(("keysock_parse():  Hit EOPNOTSUPP\n"));
1824 	keysock_error(ks, mp, EOPNOTSUPP, SADB_X_DIAGNOSTIC_NONE);
1825 }
1826 
1827 /*
1828  * wput routing for PF_KEY/keysock/whatever.  Unlike the routing socket,
1829  * I don't convert to ioctl()'s for IP.  I am the end-all driver as far
1830  * as PF_KEY sockets are concerned.  I do some conversion, but not as much
1831  * as IP/rts does.
1832  */
1833 static void
1834 keysock_wput(queue_t *q, mblk_t *mp)
1835 {
1836 	uchar_t *rptr = mp->b_rptr;
1837 	mblk_t *mp1;
1838 	keysock_t *ks;
1839 	keysock_stack_t	*keystack;
1840 
1841 	if (WR(q)->q_next) {
1842 		keysock_consumer_t *kc = (keysock_consumer_t *)q->q_ptr;
1843 		keystack = kc->kc_keystack;
1844 
1845 		ks3dbg(keystack, ("In keysock_wput\n"));
1846 
1847 		/*
1848 		 * We shouldn't get writes on a consumer instance.
1849 		 * But for now, just passthru.
1850 		 */
1851 		ks1dbg(keystack, ("Huh?  wput for an consumer instance (%d)?\n",
1852 		    kc->kc_sa_type));
1853 		putnext(q, mp);
1854 		return;
1855 	}
1856 	ks = (keysock_t *)q->q_ptr;
1857 	keystack = ks->keysock_keystack;
1858 
1859 	ks3dbg(keystack, ("In keysock_wput\n"));
1860 
1861 	switch (mp->b_datap->db_type) {
1862 	case M_DATA:
1863 		/*
1864 		 * Silently discard.
1865 		 */
1866 		ks2dbg(keystack, ("raw M_DATA in keysock.\n"));
1867 		freemsg(mp);
1868 		return;
1869 	case M_PROTO:
1870 	case M_PCPROTO:
1871 		if ((mp->b_wptr - rptr) >= sizeof (struct T_data_req)) {
1872 			if (((union T_primitives *)rptr)->type == T_DATA_REQ) {
1873 				if ((mp1 = mp->b_cont) == NULL) {
1874 					/* No data after T_DATA_REQ. */
1875 					ks2dbg(keystack,
1876 					    ("No data after DATA_REQ.\n"));
1877 					freemsg(mp);
1878 					return;
1879 				}
1880 				freeb(mp);
1881 				mp = mp1;
1882 				ks2dbg(keystack, ("T_DATA_REQ\n"));
1883 				break;	/* Out of switch. */
1884 			}
1885 		}
1886 		/* FALLTHRU */
1887 	default:
1888 		ks3dbg(keystack, ("In default wput case (%d %d).\n",
1889 		    mp->b_datap->db_type, ((union T_primitives *)rptr)->type));
1890 		keysock_wput_other(q, mp);
1891 		return;
1892 	}
1893 
1894 	/* I now have a PF_KEY message in an M_DATA block, pointed to by mp. */
1895 	keysock_parse(q, mp);
1896 }
1897 
1898 /* BELOW THIS LINE ARE ROUTINES INCLUDING AND RELATED TO keysock_rput(). */
1899 
1900 /*
1901  * Called upon receipt of a KEYSOCK_HELLO_ACK to set up the appropriate
1902  * state vectors.
1903  */
1904 static void
1905 keysock_link_consumer(uint8_t satype, keysock_consumer_t *kc)
1906 {
1907 	keysock_t *ks;
1908 	keysock_stack_t	*keystack = kc->kc_keystack;
1909 
1910 	mutex_enter(&keystack->keystack_consumers_lock);
1911 	mutex_enter(&kc->kc_lock);
1912 	if (keystack->keystack_consumers[satype] != NULL) {
1913 		ks0dbg((
1914 		    "Hmmmm, someone closed %d before the HELLO_ACK happened.\n",
1915 		    satype));
1916 		/*
1917 		 * Perhaps updating the new below-me consumer with what I have
1918 		 * so far would work too?
1919 		 */
1920 		mutex_exit(&kc->kc_lock);
1921 		mutex_exit(&keystack->keystack_consumers_lock);
1922 	} else {
1923 		/* Add new below-me consumer. */
1924 		keystack->keystack_consumers[satype] = kc;
1925 
1926 		kc->kc_flags = 0;
1927 		kc->kc_sa_type = satype;
1928 		mutex_exit(&kc->kc_lock);
1929 		mutex_exit(&keystack->keystack_consumers_lock);
1930 
1931 		/* Scan the keysock list. */
1932 		mutex_enter(&keystack->keystack_list_lock);
1933 		for (ks = keystack->keystack_list; ks != NULL;
1934 		    ks = ks->keysock_next) {
1935 			if (KEYSOCK_ISREG(ks, satype)) {
1936 				/*
1937 				 * XXX Perhaps send an SADB_REGISTER down on
1938 				 * the socket's behalf.
1939 				 */
1940 				ks1dbg(keystack,
1941 				    ("Socket %u registered already for "
1942 				    "new consumer.\n", ks->keysock_serial));
1943 			}
1944 		}
1945 		mutex_exit(&keystack->keystack_list_lock);
1946 	}
1947 }
1948 
1949 /*
1950  * Generate a KEYSOCK_OUT_ERR message for my consumer.
1951  */
1952 static void
1953 keysock_out_err(keysock_consumer_t *kc, int ks_errno, mblk_t *mp)
1954 {
1955 	keysock_out_err_t *kse;
1956 	mblk_t *imp;
1957 	keysock_stack_t	*keystack = kc->kc_keystack;
1958 
1959 	imp = allocb(sizeof (ipsec_info_t), BPRI_HI);
1960 	if (imp == NULL) {
1961 		ks1dbg(keystack, ("keysock_out_err:  Can't alloc message.\n"));
1962 		return;
1963 	}
1964 
1965 	imp->b_datap->db_type = M_CTL;
1966 	imp->b_wptr += sizeof (ipsec_info_t);
1967 
1968 	kse = (keysock_out_err_t *)imp->b_rptr;
1969 	imp->b_cont = mp;
1970 	kse->ks_err_type = KEYSOCK_OUT_ERR;
1971 	kse->ks_err_len = sizeof (*kse);
1972 	/* Is serial necessary? */
1973 	kse->ks_err_serial = 0;
1974 	kse->ks_err_errno = ks_errno;
1975 
1976 	/*
1977 	 * XXX What else do I need to do here w.r.t. information
1978 	 * to tell the consumer what caused this error?
1979 	 *
1980 	 * I believe the answer is the PF_KEY ACQUIRE (or other) message
1981 	 * attached in mp, which is appended at the end.  I believe the
1982 	 * db_ref won't matter here, because the PF_KEY message is only read
1983 	 * for KEYSOCK_OUT_ERR.
1984 	 */
1985 
1986 	putnext(kc->kc_wq, imp);
1987 }
1988 
1989 /* XXX this is a hack errno. */
1990 #define	EIPSECNOSA 255
1991 
1992 /*
1993  * Route message (pointed by mp, header in samsg) toward appropriate
1994  * sockets.  Assume the message's creator did its job correctly.
1995  *
1996  * This should be a function that is followed by a return in its caller.
1997  * The compiler _should_ be able to use tail-call optimizations to make the
1998  * large ## of parameters not a huge deal.
1999  */
2000 static void
2001 keysock_passup(mblk_t *mp, sadb_msg_t *samsg, minor_t serial,
2002     keysock_consumer_t *kc, boolean_t persistent, keysock_stack_t *keystack)
2003 {
2004 	keysock_t *ks;
2005 	uint8_t satype = samsg->sadb_msg_satype;
2006 	boolean_t toall = B_FALSE, allreg = B_FALSE, allereg = B_FALSE,
2007 	    setalg = B_FALSE;
2008 	mblk_t *mp1;
2009 	int err = EIPSECNOSA;
2010 
2011 	/* Convert mp, which is M_DATA, into an M_PROTO of type T_DATA_IND */
2012 	mp1 = allocb(sizeof (struct T_data_req), BPRI_HI);
2013 	if (mp1 == NULL) {
2014 		err = ENOMEM;
2015 		goto error;
2016 	}
2017 	mp1->b_wptr += sizeof (struct T_data_req);
2018 	((struct T_data_ind *)mp1->b_rptr)->PRIM_type = T_DATA_IND;
2019 	((struct T_data_ind *)mp1->b_rptr)->MORE_flag = 0;
2020 	mp1->b_datap->db_type = M_PROTO;
2021 	mp1->b_cont = mp;
2022 	mp = mp1;
2023 
2024 	switch (samsg->sadb_msg_type) {
2025 	case SADB_FLUSH:
2026 	case SADB_GETSPI:
2027 	case SADB_UPDATE:
2028 	case SADB_X_UPDATEPAIR:
2029 	case SADB_ADD:
2030 	case SADB_DELETE:
2031 	case SADB_X_DELPAIR:
2032 	case SADB_EXPIRE:
2033 		/*
2034 		 * These are most likely replies.  Don't worry about
2035 		 * KEYSOCK_OUT_ERR handling.  Deliver to all sockets.
2036 		 */
2037 		ks3dbg(keystack,
2038 		    ("Delivering normal message (%d) to all sockets.\n",
2039 		    samsg->sadb_msg_type));
2040 		toall = B_TRUE;
2041 		break;
2042 	case SADB_REGISTER:
2043 		/*
2044 		 * REGISTERs come up for one of three reasons:
2045 		 *
2046 		 *	1.) In response to a normal SADB_REGISTER
2047 		 *		(samsg->sadb_msg_satype != SADB_SATYPE_UNSPEC &&
2048 		 *		    serial != 0)
2049 		 *		Deliver to normal SADB_REGISTERed sockets.
2050 		 *	2.) In response to an extended REGISTER
2051 		 *		(samsg->sadb_msg_satype == SADB_SATYPE_UNSPEC)
2052 		 *		Deliver to extended REGISTERed socket.
2053 		 *	3.) Spontaneous algorithm changes
2054 		 *		(samsg->sadb_msg_satype != SADB_SATYPE_UNSPEC &&
2055 		 *		    serial == 0)
2056 		 *		Deliver to REGISTERed sockets of all sorts.
2057 		 */
2058 		if (kc == NULL) {
2059 			/* Here because of keysock_error() call. */
2060 			ASSERT(samsg->sadb_msg_errno != 0);
2061 			break;	/* Out of switch. */
2062 		}
2063 		ks3dbg(keystack, ("Delivering REGISTER.\n"));
2064 		if (satype == SADB_SATYPE_UNSPEC) {
2065 			/* REGISTER Reason #2 */
2066 			allereg = B_TRUE;
2067 			/*
2068 			 * Rewhack SA type so PF_KEY socket holder knows what
2069 			 * consumer generated this algorithm list.
2070 			 */
2071 			satype = kc->kc_sa_type;
2072 			samsg->sadb_msg_satype = satype;
2073 			setalg = B_TRUE;
2074 		} else if (serial == 0) {
2075 			/* REGISTER Reason #3 */
2076 			allreg = B_TRUE;
2077 			allereg = B_TRUE;
2078 		} else {
2079 			/* REGISTER Reason #1 */
2080 			allreg = B_TRUE;
2081 			setalg = B_TRUE;
2082 		}
2083 		break;
2084 	case SADB_ACQUIRE:
2085 		/*
2086 		 * ACQUIREs are either extended (sadb_msg_satype == 0) or
2087 		 * regular (sadb_msg_satype != 0).  And we're guaranteed
2088 		 * that serial == 0 for an ACQUIRE.
2089 		 */
2090 		ks3dbg(keystack, ("Delivering ACQUIRE.\n"));
2091 		allereg = (satype == SADB_SATYPE_UNSPEC);
2092 		allreg = !allereg;
2093 		/*
2094 		 * Corner case - if we send a regular ACQUIRE and there's
2095 		 * extended ones registered, don't send an error down to
2096 		 * consumers if nobody's listening and prematurely destroy
2097 		 * their ACQUIRE record.  This might be too hackish of a
2098 		 * solution.
2099 		 */
2100 		if (allreg && keystack->keystack_num_extended > 0)
2101 			err = 0;
2102 		break;
2103 	case SADB_X_PROMISC:
2104 	case SADB_X_INVERSE_ACQUIRE:
2105 	case SADB_DUMP:
2106 	case SADB_GET:
2107 	default:
2108 		/*
2109 		 * Deliver to the sender and promiscuous only.
2110 		 */
2111 		ks3dbg(keystack, ("Delivering sender/promisc only (%d).\n",
2112 		    samsg->sadb_msg_type));
2113 		break;
2114 	}
2115 
2116 	mutex_enter(&keystack->keystack_list_lock);
2117 	for (ks = keystack->keystack_list; ks != NULL; ks = ks->keysock_next) {
2118 		/* Delivery loop. */
2119 
2120 		/*
2121 		 * Check special keysock-setting cases (REGISTER replies)
2122 		 * here.
2123 		 */
2124 		if (setalg && serial == ks->keysock_serial) {
2125 			ASSERT(kc != NULL);
2126 			ASSERT(kc->kc_sa_type == satype);
2127 			KEYSOCK_SETREG(ks, satype);
2128 		}
2129 
2130 		/*
2131 		 * NOLOOP takes precedence over PROMISC.  So if you've set
2132 		 * !SO_USELOOPBACK, don't expect to see any data...
2133 		 */
2134 		if (ks->keysock_flags & KEYSOCK_NOLOOP)
2135 			continue;
2136 
2137 		/*
2138 		 * Messages to all, or promiscuous sockets just GET the
2139 		 * message.  Perform rules-type checking iff it's not for all
2140 		 * listeners or the socket is in promiscuous mode.
2141 		 *
2142 		 * NOTE:Because of the (kc != NULL && ISREG()), make sure
2143 		 *	extended ACQUIREs arrive off a consumer that is
2144 		 *	part of the extended REGISTER set of consumers.
2145 		 */
2146 		if (serial != ks->keysock_serial &&
2147 		    !toall &&
2148 		    !(ks->keysock_flags & KEYSOCK_PROMISC) &&
2149 		    !((ks->keysock_flags & KEYSOCK_EXTENDED) ?
2150 		    allereg : allreg && kc != NULL &&
2151 		    KEYSOCK_ISREG(ks, kc->kc_sa_type)))
2152 			continue;
2153 
2154 		mp1 = dupmsg(mp);
2155 		if (mp1 == NULL) {
2156 			ks2dbg(keystack, (
2157 			    "keysock_passup():  dupmsg() failed.\n"));
2158 			mp1 = mp;
2159 			mp = NULL;
2160 			err = ENOMEM;
2161 		}
2162 
2163 		/*
2164 		 * At this point, we can deliver or attempt to deliver
2165 		 * this message.  We're free of obligation to report
2166 		 * no listening PF_KEY sockets.  So set err to 0.
2167 		 */
2168 		err = 0;
2169 
2170 		/*
2171 		 * See if we canputnext(), as well as see if the message
2172 		 * needs to be queued if we can't.
2173 		 */
2174 		if (!canputnext(ks->keysock_rq)) {
2175 			if (persistent) {
2176 				if (putq(ks->keysock_rq, mp1) == 0) {
2177 					ks1dbg(keystack, (
2178 					    "keysock_passup: putq failed.\n"));
2179 				} else {
2180 					continue;
2181 				}
2182 			}
2183 			freemsg(mp1);
2184 			continue;
2185 		}
2186 
2187 		ks3dbg(keystack,
2188 		    ("Putting to serial %d.\n", ks->keysock_serial));
2189 		/*
2190 		 * Unlike the specific keysock instance case, this
2191 		 * will only hit for listeners, so we will only
2192 		 * putnext() if we can.
2193 		 */
2194 		putnext(ks->keysock_rq, mp1);
2195 		if (mp == NULL)
2196 			break;	/* out of for loop. */
2197 	}
2198 	mutex_exit(&keystack->keystack_list_lock);
2199 
2200 error:
2201 	if ((err != 0) && (kc != NULL)) {
2202 		/*
2203 		 * Generate KEYSOCK_OUT_ERR for consumer.
2204 		 * Basically, I send this back if I have not been able to
2205 		 * transmit (for whatever reason)
2206 		 */
2207 		ks1dbg(keystack,
2208 		    ("keysock_passup():  No registered of type %d.\n",
2209 		    satype));
2210 		if (mp != NULL) {
2211 			if (mp->b_datap->db_type == M_PROTO) {
2212 				mp1 = mp;
2213 				mp = mp->b_cont;
2214 				freeb(mp1);
2215 			}
2216 			/*
2217 			 * Do a copymsg() because people who get
2218 			 * KEYSOCK_OUT_ERR may alter the message contents.
2219 			 */
2220 			mp1 = copymsg(mp);
2221 			if (mp1 == NULL) {
2222 				ks2dbg(keystack,
2223 				    ("keysock_passup: copymsg() failed.\n"));
2224 				mp1 = mp;
2225 				mp = NULL;
2226 			}
2227 			keysock_out_err(kc, err, mp1);
2228 		}
2229 	}
2230 
2231 	/*
2232 	 * XXX Blank the message somehow.  This is difficult because we don't
2233 	 * know at this point if the message has db_ref > 1, etc.
2234 	 *
2235 	 * Optimally, keysock messages containing actual keying material would
2236 	 * be allocated with esballoc(), with a zeroing free function.
2237 	 */
2238 	if (mp != NULL)
2239 		freemsg(mp);
2240 }
2241 
2242 /*
2243  * Keysock's read service procedure is there only for PF_KEY reply
2244  * messages that really need to reach the top.
2245  */
2246 static void
2247 keysock_rsrv(queue_t *q)
2248 {
2249 	mblk_t *mp;
2250 
2251 	while ((mp = getq(q)) != NULL) {
2252 		if (canputnext(q)) {
2253 			putnext(q, mp);
2254 		} else {
2255 			(void) putbq(q, mp);
2256 			return;
2257 		}
2258 	}
2259 }
2260 
2261 /*
2262  * The read procedure should only be invoked by a keysock consumer, like
2263  * ESP, AH, etc.  I should only see KEYSOCK_OUT and KEYSOCK_HELLO_ACK
2264  * messages on my read queues.
2265  */
2266 static void
2267 keysock_rput(queue_t *q, mblk_t *mp)
2268 {
2269 	keysock_consumer_t *kc = (keysock_consumer_t *)q->q_ptr;
2270 	ipsec_info_t *ii;
2271 	keysock_hello_ack_t *ksa;
2272 	minor_t serial;
2273 	mblk_t *mp1;
2274 	sadb_msg_t *samsg;
2275 	keysock_stack_t	*keystack = kc->kc_keystack;
2276 
2277 	/* Make sure I'm a consumer instance.  (i.e. something's below me) */
2278 	ASSERT(WR(q)->q_next != NULL);
2279 
2280 	if (mp->b_datap->db_type != M_CTL) {
2281 		/*
2282 		 * Keysock should only see keysock consumer interface
2283 		 * messages (see ipsec_info.h) on its read procedure.
2284 		 * To be robust, however, putnext() up so the STREAM head can
2285 		 * deal with it appropriately.
2286 		 */
2287 		ks1dbg(keystack,
2288 		    ("Hmmm, a non M_CTL (%d, 0x%x) on keysock_rput.\n",
2289 		    mp->b_datap->db_type, mp->b_datap->db_type));
2290 		putnext(q, mp);
2291 		return;
2292 	}
2293 
2294 	ii = (ipsec_info_t *)mp->b_rptr;
2295 
2296 	switch (ii->ipsec_info_type) {
2297 	case KEYSOCK_OUT:
2298 		/*
2299 		 * A consumer needs to pass a response message or an ACQUIRE
2300 		 * UP.  I assume that the consumer has done the right
2301 		 * thing w.r.t. message creation, etc.
2302 		 */
2303 		serial = ((keysock_out_t *)mp->b_rptr)->ks_out_serial;
2304 		mp1 = mp->b_cont;	/* Get M_DATA portion. */
2305 		freeb(mp);
2306 		samsg = (sadb_msg_t *)mp1->b_rptr;
2307 		if (samsg->sadb_msg_type == SADB_FLUSH ||
2308 		    (samsg->sadb_msg_type == SADB_DUMP &&
2309 		    samsg->sadb_msg_len == SADB_8TO64(sizeof (*samsg)))) {
2310 			/*
2311 			 * If I'm an end-of-FLUSH or an end-of-DUMP marker...
2312 			 */
2313 			ASSERT(keystack->keystack_flushdump != 0);
2314 						/* Am I flushing? */
2315 
2316 			mutex_enter(&kc->kc_lock);
2317 			kc->kc_flags &= ~KC_FLUSHING;
2318 			mutex_exit(&kc->kc_lock);
2319 
2320 			if (samsg->sadb_msg_errno != 0)
2321 				keystack->keystack_flushdump_errno =
2322 				    samsg->sadb_msg_errno;
2323 
2324 			/*
2325 			 * Lower the atomic "flushing" count.  If it's
2326 			 * the last one, send up the end-of-{FLUSH,DUMP} to
2327 			 * the appropriate PF_KEY socket.
2328 			 */
2329 			if (atomic_add_32_nv(&keystack->keystack_flushdump,
2330 			    -1) != 0) {
2331 				ks1dbg(keystack,
2332 				    ("One flush/dump message back from %d,"
2333 				    " more to go.\n", samsg->sadb_msg_satype));
2334 				freemsg(mp1);
2335 				return;
2336 			}
2337 
2338 			samsg->sadb_msg_errno =
2339 			    (uint8_t)keystack->keystack_flushdump_errno;
2340 			if (samsg->sadb_msg_type == SADB_DUMP) {
2341 				samsg->sadb_msg_seq = 0;
2342 			}
2343 		}
2344 		keysock_passup(mp1, samsg, serial, kc,
2345 		    (samsg->sadb_msg_type == SADB_DUMP), keystack);
2346 		return;
2347 	case KEYSOCK_HELLO_ACK:
2348 		/* Aha, now we can link in the consumer! */
2349 		ksa = (keysock_hello_ack_t *)ii;
2350 		keysock_link_consumer(ksa->ks_hello_satype, kc);
2351 		freemsg(mp);
2352 		return;
2353 	default:
2354 		ks1dbg(keystack, ("Hmmm, an IPsec info I'm not used to, 0x%x\n",
2355 		    ii->ipsec_info_type));
2356 		putnext(q, mp);
2357 	}
2358 }
2359 
2360 /*
2361  * So we can avoid external linking problems....
2362  */
2363 boolean_t
2364 keysock_extended_reg(netstack_t *ns)
2365 {
2366 	keysock_stack_t	*keystack = ns->netstack_keysock;
2367 
2368 	return (keystack->keystack_num_extended != 0);
2369 }
2370 
2371 uint32_t
2372 keysock_next_seq(netstack_t *ns)
2373 {
2374 	keysock_stack_t	*keystack = ns->netstack_keysock;
2375 
2376 	return (atomic_add_32_nv(&keystack->keystack_acquire_seq, -1));
2377 }
2378