xref: /titanic_41/usr/src/uts/common/inet/udp/udp.c (revision c39526b769298791ff5b0b6c5e761f49aabaeb4e)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 /* Copyright (c) 1990 Mentat Inc. */
26 
27 #include <sys/types.h>
28 #include <sys/stream.h>
29 #include <sys/stropts.h>
30 #include <sys/strlog.h>
31 #include <sys/strsun.h>
32 #define	_SUN_TPI_VERSION 2
33 #include <sys/tihdr.h>
34 #include <sys/timod.h>
35 #include <sys/ddi.h>
36 #include <sys/sunddi.h>
37 #include <sys/strsubr.h>
38 #include <sys/suntpi.h>
39 #include <sys/xti_inet.h>
40 #include <sys/kmem.h>
41 #include <sys/cred_impl.h>
42 #include <sys/policy.h>
43 #include <sys/priv.h>
44 #include <sys/ucred.h>
45 #include <sys/zone.h>
46 
47 #include <sys/socket.h>
48 #include <sys/socketvar.h>
49 #include <sys/sockio.h>
50 #include <sys/vtrace.h>
51 #include <sys/sdt.h>
52 #include <sys/debug.h>
53 #include <sys/isa_defs.h>
54 #include <sys/random.h>
55 #include <netinet/in.h>
56 #include <netinet/ip6.h>
57 #include <netinet/icmp6.h>
58 #include <netinet/udp.h>
59 
60 #include <inet/common.h>
61 #include <inet/ip.h>
62 #include <inet/ip_impl.h>
63 #include <inet/ipsec_impl.h>
64 #include <inet/ip6.h>
65 #include <inet/ip_ire.h>
66 #include <inet/ip_if.h>
67 #include <inet/ip_multi.h>
68 #include <inet/ip_ndp.h>
69 #include <inet/proto_set.h>
70 #include <inet/mib2.h>
71 #include <inet/optcom.h>
72 #include <inet/snmpcom.h>
73 #include <inet/kstatcom.h>
74 #include <inet/ipclassifier.h>
75 #include <sys/squeue_impl.h>
76 #include <inet/ipnet.h>
77 #include <sys/ethernet.h>
78 
79 #include <sys/tsol/label.h>
80 #include <sys/tsol/tnet.h>
81 #include <rpc/pmap_prot.h>
82 
83 #include <inet/udp_impl.h>
84 
85 /*
86  * Synchronization notes:
87  *
88  * UDP is MT and uses the usual kernel synchronization primitives. There are 2
89  * locks, the fanout lock (uf_lock) and conn_lock. conn_lock
90  * protects the contents of the udp_t. uf_lock protects the address and the
91  * fanout information.
92  * The lock order is conn_lock -> uf_lock.
93  *
94  * The fanout lock uf_lock:
95  * When a UDP endpoint is bound to a local port, it is inserted into
96  * a bind hash list.  The list consists of an array of udp_fanout_t buckets.
97  * The size of the array is controlled by the udp_bind_fanout_size variable.
98  * This variable can be changed in /etc/system if the default value is
99  * not large enough.  Each bind hash bucket is protected by a per bucket
100  * lock.  It protects the udp_bind_hash and udp_ptpbhn fields in the udp_t
101  * structure and a few other fields in the udp_t. A UDP endpoint is removed
102  * from the bind hash list only when it is being unbound or being closed.
103  * The per bucket lock also protects a UDP endpoint's state changes.
104  *
105  * Plumbing notes:
106  * UDP is always a device driver. For compatibility with mibopen() code
107  * it is possible to I_PUSH "udp", but that results in pushing a passthrough
108  * dummy module.
109  *
110  * The above implies that we don't support any intermediate module to
111  * reside in between /dev/ip and udp -- in fact, we never supported such
112  * scenario in the past as the inter-layer communication semantics have
113  * always been private.
114  */
115 
116 /* For /etc/system control */
117 uint_t udp_bind_fanout_size = UDP_BIND_FANOUT_SIZE;
118 
119 static void	udp_addr_req(queue_t *q, mblk_t *mp);
120 static void	udp_tpi_bind(queue_t *q, mblk_t *mp);
121 static void	udp_bind_hash_insert(udp_fanout_t *uf, udp_t *udp);
122 static void	udp_bind_hash_remove(udp_t *udp, boolean_t caller_holds_lock);
123 static int	udp_build_hdr_template(conn_t *, const in6_addr_t *,
124     const in6_addr_t *, in_port_t, uint32_t);
125 static void	udp_capability_req(queue_t *q, mblk_t *mp);
126 static int	udp_tpi_close(queue_t *q, int flags);
127 static void	udp_close_free(conn_t *);
128 static void	udp_tpi_connect(queue_t *q, mblk_t *mp);
129 static void	udp_tpi_disconnect(queue_t *q, mblk_t *mp);
130 static void	udp_err_ack(queue_t *q, mblk_t *mp, t_scalar_t t_error,
131     int sys_error);
132 static void	udp_err_ack_prim(queue_t *q, mblk_t *mp, t_scalar_t primitive,
133     t_scalar_t tlierr, int sys_error);
134 static int	udp_extra_priv_ports_get(queue_t *q, mblk_t *mp, caddr_t cp,
135 		    cred_t *cr);
136 static int	udp_extra_priv_ports_add(queue_t *q, mblk_t *mp,
137 		    char *value, caddr_t cp, cred_t *cr);
138 static int	udp_extra_priv_ports_del(queue_t *q, mblk_t *mp,
139 		    char *value, caddr_t cp, cred_t *cr);
140 static void	udp_icmp_input(void *, mblk_t *, void *, ip_recv_attr_t *);
141 static void	udp_icmp_error_ipv6(conn_t *connp, mblk_t *mp,
142     ip_recv_attr_t *ira);
143 static void	udp_info_req(queue_t *q, mblk_t *mp);
144 static void	udp_input(void *, mblk_t *, void *, ip_recv_attr_t *);
145 static void	udp_lrput(queue_t *, mblk_t *);
146 static void	udp_lwput(queue_t *, mblk_t *);
147 static int	udp_open(queue_t *q, dev_t *devp, int flag, int sflag,
148 		    cred_t *credp, boolean_t isv6);
149 static int	udp_openv4(queue_t *q, dev_t *devp, int flag, int sflag,
150 		    cred_t *credp);
151 static int	udp_openv6(queue_t *q, dev_t *devp, int flag, int sflag,
152 		    cred_t *credp);
153 static boolean_t udp_opt_allow_udr_set(t_scalar_t level, t_scalar_t name);
154 int		udp_opt_set(conn_t *connp, uint_t optset_context,
155 		    int level, int name, uint_t inlen,
156 		    uchar_t *invalp, uint_t *outlenp, uchar_t *outvalp,
157 		    void *thisdg_attrs, cred_t *cr);
158 int		udp_opt_get(conn_t *connp, int level, int name,
159 		    uchar_t *ptr);
160 static int	udp_output_connected(conn_t *connp, mblk_t *mp, cred_t *cr,
161 		    pid_t pid);
162 static int	udp_output_lastdst(conn_t *connp, mblk_t *mp, cred_t *cr,
163     pid_t pid, ip_xmit_attr_t *ixa);
164 static int	udp_output_newdst(conn_t *connp, mblk_t *data_mp, sin_t *sin,
165 		    sin6_t *sin6, ushort_t ipversion, cred_t *cr, pid_t,
166 		    ip_xmit_attr_t *ixa);
167 static mblk_t	*udp_prepend_hdr(conn_t *, ip_xmit_attr_t *, const ip_pkt_t *,
168     const in6_addr_t *, const in6_addr_t *, in_port_t, uint32_t, mblk_t *,
169     int *);
170 static mblk_t	*udp_prepend_header_template(conn_t *, ip_xmit_attr_t *,
171     mblk_t *, const in6_addr_t *, in_port_t, uint32_t, int *);
172 static void	udp_ud_err(queue_t *q, mblk_t *mp, t_scalar_t err);
173 static void	udp_ud_err_connected(conn_t *, t_scalar_t);
174 static void	udp_tpi_unbind(queue_t *q, mblk_t *mp);
175 static in_port_t udp_update_next_port(udp_t *udp, in_port_t port,
176     boolean_t random);
177 static void	udp_wput_other(queue_t *q, mblk_t *mp);
178 static void	udp_wput_iocdata(queue_t *q, mblk_t *mp);
179 static void	udp_wput_fallback(queue_t *q, mblk_t *mp);
180 static size_t	udp_set_rcv_hiwat(udp_t *udp, size_t size);
181 
182 static void	*udp_stack_init(netstackid_t stackid, netstack_t *ns);
183 static void	udp_stack_fini(netstackid_t stackid, void *arg);
184 
185 static void	*udp_kstat_init(netstackid_t stackid);
186 static void	udp_kstat_fini(netstackid_t stackid, kstat_t *ksp);
187 static void	*udp_kstat2_init(netstackid_t, udp_stat_t *);
188 static void	udp_kstat2_fini(netstackid_t, kstat_t *);
189 static int	udp_kstat_update(kstat_t *kp, int rw);
190 
191 
192 /* Common routines for TPI and socket module */
193 static void	udp_ulp_recv(conn_t *, mblk_t *, uint_t, ip_recv_attr_t *);
194 
195 /* Common routine for TPI and socket module */
196 static conn_t	*udp_do_open(cred_t *, boolean_t, int, int *);
197 static void	udp_do_close(conn_t *);
198 static int	udp_do_bind(conn_t *, struct sockaddr *, socklen_t, cred_t *,
199     boolean_t);
200 static int	udp_do_unbind(conn_t *);
201 
202 int		udp_getsockname(sock_lower_handle_t,
203     struct sockaddr *, socklen_t *, cred_t *);
204 int		udp_getpeername(sock_lower_handle_t,
205     struct sockaddr *, socklen_t *, cred_t *);
206 static int	udp_do_connect(conn_t *, const struct sockaddr *, socklen_t,
207     cred_t *, pid_t);
208 
209 #pragma inline(udp_output_connected, udp_output_newdst, udp_output_lastdst)
210 
211 /*
212  * Checks if the given destination addr/port is allowed out.
213  * If allowed, registers the (dest_addr/port, node_ID) mapping at Cluster.
214  * Called for each connect() and for sendto()/sendmsg() to a different
215  * destination.
216  * For connect(), called in udp_connect().
217  * For sendto()/sendmsg(), called in udp_output_newdst().
218  *
219  * This macro assumes that the cl_inet_connect2 hook is not NULL.
220  * Please check this before calling this macro.
221  *
222  * void
223  * CL_INET_UDP_CONNECT(conn_t cp, udp_t *udp, boolean_t is_outgoing,
224  *     in6_addr_t *faddrp, in_port_t (or uint16_t) fport, int err);
225  */
226 #define	CL_INET_UDP_CONNECT(cp, is_outgoing, faddrp, fport, err) {	\
227 	(err) = 0;							\
228 	/*								\
229 	 * Running in cluster mode - check and register active		\
230 	 * "connection" information					\
231 	 */								\
232 	if ((cp)->conn_ipversion == IPV4_VERSION)			\
233 		(err) = (*cl_inet_connect2)(				\
234 		    (cp)->conn_netstack->netstack_stackid,		\
235 		    IPPROTO_UDP, is_outgoing, AF_INET,			\
236 		    (uint8_t *)&((cp)->conn_laddr_v4),			\
237 		    (cp)->conn_lport,					\
238 		    (uint8_t *)&(V4_PART_OF_V6(*faddrp)),		\
239 		    (in_port_t)(fport), NULL);				\
240 	else								\
241 		(err) = (*cl_inet_connect2)(				\
242 		    (cp)->conn_netstack->netstack_stackid,		\
243 		    IPPROTO_UDP, is_outgoing, AF_INET6,			\
244 		    (uint8_t *)&((cp)->conn_laddr_v6),			\
245 		    (cp)->conn_lport,					\
246 		    (uint8_t *)(faddrp), (in_port_t)(fport), NULL);	\
247 }
248 
249 static struct module_info udp_mod_info =  {
250 	UDP_MOD_ID, UDP_MOD_NAME, 1, INFPSZ, UDP_RECV_HIWATER, UDP_RECV_LOWATER
251 };
252 
253 /*
254  * Entry points for UDP as a device.
255  * We have separate open functions for the /dev/udp and /dev/udp6 devices.
256  */
257 static struct qinit udp_rinitv4 = {
258 	NULL, NULL, udp_openv4, udp_tpi_close, NULL, &udp_mod_info, NULL
259 };
260 
261 static struct qinit udp_rinitv6 = {
262 	NULL, NULL, udp_openv6, udp_tpi_close, NULL, &udp_mod_info, NULL
263 };
264 
265 static struct qinit udp_winit = {
266 	(pfi_t)udp_wput, (pfi_t)ip_wsrv, NULL, NULL, NULL, &udp_mod_info
267 };
268 
269 /* UDP entry point during fallback */
270 struct qinit udp_fallback_sock_winit = {
271 	(pfi_t)udp_wput_fallback, NULL, NULL, NULL, NULL, &udp_mod_info
272 };
273 
274 /*
275  * UDP needs to handle I_LINK and I_PLINK since ifconfig
276  * likes to use it as a place to hang the various streams.
277  */
278 static struct qinit udp_lrinit = {
279 	(pfi_t)udp_lrput, NULL, udp_openv4, udp_tpi_close, NULL, &udp_mod_info
280 };
281 
282 static struct qinit udp_lwinit = {
283 	(pfi_t)udp_lwput, NULL, udp_openv4, udp_tpi_close, NULL, &udp_mod_info
284 };
285 
286 /* For AF_INET aka /dev/udp */
287 struct streamtab udpinfov4 = {
288 	&udp_rinitv4, &udp_winit, &udp_lrinit, &udp_lwinit
289 };
290 
291 /* For AF_INET6 aka /dev/udp6 */
292 struct streamtab udpinfov6 = {
293 	&udp_rinitv6, &udp_winit, &udp_lrinit, &udp_lwinit
294 };
295 
296 #define	UDP_MAXPACKET_IPV4 (IP_MAXPACKET - UDPH_SIZE - IP_SIMPLE_HDR_LENGTH)
297 
298 /* Default structure copied into T_INFO_ACK messages */
299 static struct T_info_ack udp_g_t_info_ack_ipv4 = {
300 	T_INFO_ACK,
301 	UDP_MAXPACKET_IPV4,	/* TSDU_size. Excl. headers */
302 	T_INVALID,	/* ETSU_size.  udp does not support expedited data. */
303 	T_INVALID,	/* CDATA_size. udp does not support connect data. */
304 	T_INVALID,	/* DDATA_size. udp does not support disconnect data. */
305 	sizeof (sin_t),	/* ADDR_size. */
306 	0,		/* OPT_size - not initialized here */
307 	UDP_MAXPACKET_IPV4,	/* TIDU_size.  Excl. headers */
308 	T_CLTS,		/* SERV_type.  udp supports connection-less. */
309 	TS_UNBND,	/* CURRENT_state.  This is set from udp_state. */
310 	(XPG4_1|SENDZERO) /* PROVIDER_flag */
311 };
312 
313 #define	UDP_MAXPACKET_IPV6 (IP_MAXPACKET - UDPH_SIZE - IPV6_HDR_LEN)
314 
315 static	struct T_info_ack udp_g_t_info_ack_ipv6 = {
316 	T_INFO_ACK,
317 	UDP_MAXPACKET_IPV6,	/* TSDU_size.  Excl. headers */
318 	T_INVALID,	/* ETSU_size.  udp does not support expedited data. */
319 	T_INVALID,	/* CDATA_size. udp does not support connect data. */
320 	T_INVALID,	/* DDATA_size. udp does not support disconnect data. */
321 	sizeof (sin6_t), /* ADDR_size. */
322 	0,		/* OPT_size - not initialized here */
323 	UDP_MAXPACKET_IPV6,	/* TIDU_size. Excl. headers */
324 	T_CLTS,		/* SERV_type.  udp supports connection-less. */
325 	TS_UNBND,	/* CURRENT_state.  This is set from udp_state. */
326 	(XPG4_1|SENDZERO) /* PROVIDER_flag */
327 };
328 
329 /*
330  * UDP tunables related declarations. Definitions are in udp_tunables.c
331  */
332 extern mod_prop_info_t udp_propinfo_tbl[];
333 extern int udp_propinfo_count;
334 
335 /* Setable in /etc/system */
336 /* If set to 0, pick ephemeral port sequentially; otherwise randomly. */
337 uint32_t udp_random_anon_port = 1;
338 
339 /*
340  * Hook functions to enable cluster networking.
341  * On non-clustered systems these vectors must always be NULL
342  */
343 
344 void (*cl_inet_bind)(netstackid_t stack_id, uchar_t protocol,
345     sa_family_t addr_family, uint8_t *laddrp, in_port_t lport,
346     void *args) = NULL;
347 void (*cl_inet_unbind)(netstackid_t stack_id, uint8_t protocol,
348     sa_family_t addr_family, uint8_t *laddrp, in_port_t lport,
349     void *args) = NULL;
350 
351 typedef union T_primitives *t_primp_t;
352 
353 /*
354  * Return the next anonymous port in the privileged port range for
355  * bind checking.
356  *
357  * Trusted Extension (TX) notes: TX allows administrator to mark or
358  * reserve ports as Multilevel ports (MLP). MLP has special function
359  * on TX systems. Once a port is made MLP, it's not available as
360  * ordinary port. This creates "holes" in the port name space. It
361  * may be necessary to skip the "holes" find a suitable anon port.
362  */
363 static in_port_t
364 udp_get_next_priv_port(udp_t *udp)
365 {
366 	static in_port_t next_priv_port = IPPORT_RESERVED - 1;
367 	in_port_t nextport;
368 	boolean_t restart = B_FALSE;
369 	udp_stack_t *us = udp->udp_us;
370 
371 retry:
372 	if (next_priv_port < us->us_min_anonpriv_port ||
373 	    next_priv_port >= IPPORT_RESERVED) {
374 		next_priv_port = IPPORT_RESERVED - 1;
375 		if (restart)
376 			return (0);
377 		restart = B_TRUE;
378 	}
379 
380 	if (is_system_labeled() &&
381 	    (nextport = tsol_next_port(crgetzone(udp->udp_connp->conn_cred),
382 	    next_priv_port, IPPROTO_UDP, B_FALSE)) != 0) {
383 		next_priv_port = nextport;
384 		goto retry;
385 	}
386 
387 	return (next_priv_port--);
388 }
389 
390 /*
391  * Hash list removal routine for udp_t structures.
392  */
393 static void
394 udp_bind_hash_remove(udp_t *udp, boolean_t caller_holds_lock)
395 {
396 	udp_t		*udpnext;
397 	kmutex_t	*lockp;
398 	udp_stack_t	*us = udp->udp_us;
399 	conn_t		*connp = udp->udp_connp;
400 
401 	if (udp->udp_ptpbhn == NULL)
402 		return;
403 
404 	/*
405 	 * Extract the lock pointer in case there are concurrent
406 	 * hash_remove's for this instance.
407 	 */
408 	ASSERT(connp->conn_lport != 0);
409 	if (!caller_holds_lock) {
410 		lockp = &us->us_bind_fanout[UDP_BIND_HASH(connp->conn_lport,
411 		    us->us_bind_fanout_size)].uf_lock;
412 		ASSERT(lockp != NULL);
413 		mutex_enter(lockp);
414 	}
415 	if (udp->udp_ptpbhn != NULL) {
416 		udpnext = udp->udp_bind_hash;
417 		if (udpnext != NULL) {
418 			udpnext->udp_ptpbhn = udp->udp_ptpbhn;
419 			udp->udp_bind_hash = NULL;
420 		}
421 		*udp->udp_ptpbhn = udpnext;
422 		udp->udp_ptpbhn = NULL;
423 	}
424 	if (!caller_holds_lock) {
425 		mutex_exit(lockp);
426 	}
427 }
428 
429 static void
430 udp_bind_hash_insert(udp_fanout_t *uf, udp_t *udp)
431 {
432 	conn_t	*connp = udp->udp_connp;
433 	udp_t	**udpp;
434 	udp_t	*udpnext;
435 	conn_t	*connext;
436 
437 	ASSERT(MUTEX_HELD(&uf->uf_lock));
438 	ASSERT(udp->udp_ptpbhn == NULL);
439 	udpp = &uf->uf_udp;
440 	udpnext = udpp[0];
441 	if (udpnext != NULL) {
442 		/*
443 		 * If the new udp bound to the INADDR_ANY address
444 		 * and the first one in the list is not bound to
445 		 * INADDR_ANY we skip all entries until we find the
446 		 * first one bound to INADDR_ANY.
447 		 * This makes sure that applications binding to a
448 		 * specific address get preference over those binding to
449 		 * INADDR_ANY.
450 		 */
451 		connext = udpnext->udp_connp;
452 		if (V6_OR_V4_INADDR_ANY(connp->conn_bound_addr_v6) &&
453 		    !V6_OR_V4_INADDR_ANY(connext->conn_bound_addr_v6)) {
454 			while ((udpnext = udpp[0]) != NULL &&
455 			    !V6_OR_V4_INADDR_ANY(connext->conn_bound_addr_v6)) {
456 				udpp = &(udpnext->udp_bind_hash);
457 			}
458 			if (udpnext != NULL)
459 				udpnext->udp_ptpbhn = &udp->udp_bind_hash;
460 		} else {
461 			udpnext->udp_ptpbhn = &udp->udp_bind_hash;
462 		}
463 	}
464 	udp->udp_bind_hash = udpnext;
465 	udp->udp_ptpbhn = udpp;
466 	udpp[0] = udp;
467 }
468 
469 /*
470  * This routine is called to handle each O_T_BIND_REQ/T_BIND_REQ message
471  * passed to udp_wput.
472  * It associates a port number and local address with the stream.
473  * It calls IP to verify the local IP address, and calls IP to insert
474  * the conn_t in the fanout table.
475  * If everything is ok it then sends the T_BIND_ACK back up.
476  *
477  * Note that UDP over IPv4 and IPv6 sockets can use the same port number
478  * without setting SO_REUSEADDR. This is needed so that they
479  * can be viewed as two independent transport protocols.
480  * However, anonymouns ports are allocated from the same range to avoid
481  * duplicating the us->us_next_port_to_try.
482  */
483 static void
484 udp_tpi_bind(queue_t *q, mblk_t *mp)
485 {
486 	sin_t		*sin;
487 	sin6_t		*sin6;
488 	mblk_t		*mp1;
489 	struct T_bind_req *tbr;
490 	conn_t		*connp;
491 	udp_t		*udp;
492 	int		error;
493 	struct sockaddr	*sa;
494 	cred_t		*cr;
495 
496 	/*
497 	 * All Solaris components should pass a db_credp
498 	 * for this TPI message, hence we ASSERT.
499 	 * But in case there is some other M_PROTO that looks
500 	 * like a TPI message sent by some other kernel
501 	 * component, we check and return an error.
502 	 */
503 	cr = msg_getcred(mp, NULL);
504 	ASSERT(cr != NULL);
505 	if (cr == NULL) {
506 		udp_err_ack(q, mp, TSYSERR, EINVAL);
507 		return;
508 	}
509 
510 	connp = Q_TO_CONN(q);
511 	udp = connp->conn_udp;
512 	if ((mp->b_wptr - mp->b_rptr) < sizeof (*tbr)) {
513 		(void) mi_strlog(q, 1, SL_ERROR|SL_TRACE,
514 		    "udp_bind: bad req, len %u",
515 		    (uint_t)(mp->b_wptr - mp->b_rptr));
516 		udp_err_ack(q, mp, TPROTO, 0);
517 		return;
518 	}
519 	if (udp->udp_state != TS_UNBND) {
520 		(void) mi_strlog(q, 1, SL_ERROR|SL_TRACE,
521 		    "udp_bind: bad state, %u", udp->udp_state);
522 		udp_err_ack(q, mp, TOUTSTATE, 0);
523 		return;
524 	}
525 	/*
526 	 * Reallocate the message to make sure we have enough room for an
527 	 * address.
528 	 */
529 	mp1 = reallocb(mp, sizeof (struct T_bind_ack) + sizeof (sin6_t), 1);
530 	if (mp1 == NULL) {
531 		udp_err_ack(q, mp, TSYSERR, ENOMEM);
532 		return;
533 	}
534 
535 	mp = mp1;
536 
537 	/* Reset the message type in preparation for shipping it back. */
538 	DB_TYPE(mp) = M_PCPROTO;
539 
540 	tbr = (struct T_bind_req *)mp->b_rptr;
541 	switch (tbr->ADDR_length) {
542 	case 0:			/* Request for a generic port */
543 		tbr->ADDR_offset = sizeof (struct T_bind_req);
544 		if (connp->conn_family == AF_INET) {
545 			tbr->ADDR_length = sizeof (sin_t);
546 			sin = (sin_t *)&tbr[1];
547 			*sin = sin_null;
548 			sin->sin_family = AF_INET;
549 			mp->b_wptr = (uchar_t *)&sin[1];
550 			sa = (struct sockaddr *)sin;
551 		} else {
552 			ASSERT(connp->conn_family == AF_INET6);
553 			tbr->ADDR_length = sizeof (sin6_t);
554 			sin6 = (sin6_t *)&tbr[1];
555 			*sin6 = sin6_null;
556 			sin6->sin6_family = AF_INET6;
557 			mp->b_wptr = (uchar_t *)&sin6[1];
558 			sa = (struct sockaddr *)sin6;
559 		}
560 		break;
561 
562 	case sizeof (sin_t):	/* Complete IPv4 address */
563 		sa = (struct sockaddr *)mi_offset_param(mp, tbr->ADDR_offset,
564 		    sizeof (sin_t));
565 		if (sa == NULL || !OK_32PTR((char *)sa)) {
566 			udp_err_ack(q, mp, TSYSERR, EINVAL);
567 			return;
568 		}
569 		if (connp->conn_family != AF_INET ||
570 		    sa->sa_family != AF_INET) {
571 			udp_err_ack(q, mp, TSYSERR, EAFNOSUPPORT);
572 			return;
573 		}
574 		break;
575 
576 	case sizeof (sin6_t):	/* complete IPv6 address */
577 		sa = (struct sockaddr *)mi_offset_param(mp, tbr->ADDR_offset,
578 		    sizeof (sin6_t));
579 		if (sa == NULL || !OK_32PTR((char *)sa)) {
580 			udp_err_ack(q, mp, TSYSERR, EINVAL);
581 			return;
582 		}
583 		if (connp->conn_family != AF_INET6 ||
584 		    sa->sa_family != AF_INET6) {
585 			udp_err_ack(q, mp, TSYSERR, EAFNOSUPPORT);
586 			return;
587 		}
588 		break;
589 
590 	default:		/* Invalid request */
591 		(void) mi_strlog(q, 1, SL_ERROR|SL_TRACE,
592 		    "udp_bind: bad ADDR_length length %u", tbr->ADDR_length);
593 		udp_err_ack(q, mp, TBADADDR, 0);
594 		return;
595 	}
596 
597 	error = udp_do_bind(connp, sa, tbr->ADDR_length, cr,
598 	    tbr->PRIM_type != O_T_BIND_REQ);
599 
600 	if (error != 0) {
601 		if (error > 0) {
602 			udp_err_ack(q, mp, TSYSERR, error);
603 		} else {
604 			udp_err_ack(q, mp, -error, 0);
605 		}
606 	} else {
607 		tbr->PRIM_type = T_BIND_ACK;
608 		qreply(q, mp);
609 	}
610 }
611 
612 /*
613  * This routine handles each T_CONN_REQ message passed to udp.  It
614  * associates a default destination address with the stream.
615  *
616  * After various error checks are completed, udp_connect() lays
617  * the target address and port into the composite header template.
618  * Then we ask IP for information, including a source address if we didn't
619  * already have one. Finally we send up the T_OK_ACK reply message.
620  */
621 static void
622 udp_tpi_connect(queue_t *q, mblk_t *mp)
623 {
624 	conn_t	*connp = Q_TO_CONN(q);
625 	int	error;
626 	socklen_t	len;
627 	struct sockaddr		*sa;
628 	struct T_conn_req	*tcr;
629 	cred_t		*cr;
630 	pid_t		pid;
631 	/*
632 	 * All Solaris components should pass a db_credp
633 	 * for this TPI message, hence we ASSERT.
634 	 * But in case there is some other M_PROTO that looks
635 	 * like a TPI message sent by some other kernel
636 	 * component, we check and return an error.
637 	 */
638 	cr = msg_getcred(mp, &pid);
639 	ASSERT(cr != NULL);
640 	if (cr == NULL) {
641 		udp_err_ack(q, mp, TSYSERR, EINVAL);
642 		return;
643 	}
644 
645 	tcr = (struct T_conn_req *)mp->b_rptr;
646 
647 	/* A bit of sanity checking */
648 	if ((mp->b_wptr - mp->b_rptr) < sizeof (struct T_conn_req)) {
649 		udp_err_ack(q, mp, TPROTO, 0);
650 		return;
651 	}
652 
653 	if (tcr->OPT_length != 0) {
654 		udp_err_ack(q, mp, TBADOPT, 0);
655 		return;
656 	}
657 
658 	/*
659 	 * Determine packet type based on type of address passed in
660 	 * the request should contain an IPv4 or IPv6 address.
661 	 * Make sure that address family matches the type of
662 	 * family of the address passed down.
663 	 */
664 	len = tcr->DEST_length;
665 	switch (tcr->DEST_length) {
666 	default:
667 		udp_err_ack(q, mp, TBADADDR, 0);
668 		return;
669 
670 	case sizeof (sin_t):
671 		sa = (struct sockaddr *)mi_offset_param(mp, tcr->DEST_offset,
672 		    sizeof (sin_t));
673 		break;
674 
675 	case sizeof (sin6_t):
676 		sa = (struct sockaddr *)mi_offset_param(mp, tcr->DEST_offset,
677 		    sizeof (sin6_t));
678 		break;
679 	}
680 
681 	error = proto_verify_ip_addr(connp->conn_family, sa, len);
682 	if (error != 0) {
683 		udp_err_ack(q, mp, TSYSERR, error);
684 		return;
685 	}
686 
687 	error = udp_do_connect(connp, sa, len, cr, pid);
688 	if (error != 0) {
689 		if (error < 0)
690 			udp_err_ack(q, mp, -error, 0);
691 		else
692 			udp_err_ack(q, mp, TSYSERR, error);
693 	} else {
694 		mblk_t	*mp1;
695 		/*
696 		 * We have to send a connection confirmation to
697 		 * keep TLI happy.
698 		 */
699 		if (connp->conn_family == AF_INET) {
700 			mp1 = mi_tpi_conn_con(NULL, (char *)sa,
701 			    sizeof (sin_t), NULL, 0);
702 		} else {
703 			mp1 = mi_tpi_conn_con(NULL, (char *)sa,
704 			    sizeof (sin6_t), NULL, 0);
705 		}
706 		if (mp1 == NULL) {
707 			udp_err_ack(q, mp, TSYSERR, ENOMEM);
708 			return;
709 		}
710 
711 		/*
712 		 * Send ok_ack for T_CONN_REQ
713 		 */
714 		mp = mi_tpi_ok_ack_alloc(mp);
715 		if (mp == NULL) {
716 			/* Unable to reuse the T_CONN_REQ for the ack. */
717 			udp_err_ack_prim(q, mp1, T_CONN_REQ, TSYSERR, ENOMEM);
718 			return;
719 		}
720 
721 		putnext(connp->conn_rq, mp);
722 		putnext(connp->conn_rq, mp1);
723 	}
724 }
725 
726 static int
727 udp_tpi_close(queue_t *q, int flags)
728 {
729 	conn_t	*connp;
730 
731 	if (flags & SO_FALLBACK) {
732 		/*
733 		 * stream is being closed while in fallback
734 		 * simply free the resources that were allocated
735 		 */
736 		inet_minor_free(WR(q)->q_ptr, (dev_t)(RD(q)->q_ptr));
737 		qprocsoff(q);
738 		goto done;
739 	}
740 
741 	connp = Q_TO_CONN(q);
742 	udp_do_close(connp);
743 done:
744 	q->q_ptr = WR(q)->q_ptr = NULL;
745 	return (0);
746 }
747 
748 static void
749 udp_close_free(conn_t *connp)
750 {
751 	udp_t *udp = connp->conn_udp;
752 
753 	/* If there are any options associated with the stream, free them. */
754 	if (udp->udp_recv_ipp.ipp_fields != 0)
755 		ip_pkt_free(&udp->udp_recv_ipp);
756 
757 	/*
758 	 * Clear any fields which the kmem_cache constructor clears.
759 	 * Only udp_connp needs to be preserved.
760 	 * TBD: We should make this more efficient to avoid clearing
761 	 * everything.
762 	 */
763 	ASSERT(udp->udp_connp == connp);
764 	bzero(udp, sizeof (udp_t));
765 	udp->udp_connp = connp;
766 }
767 
768 static int
769 udp_do_disconnect(conn_t *connp)
770 {
771 	udp_t	*udp;
772 	udp_fanout_t *udpf;
773 	udp_stack_t *us;
774 	int	error;
775 
776 	udp = connp->conn_udp;
777 	us = udp->udp_us;
778 	mutex_enter(&connp->conn_lock);
779 	if (udp->udp_state != TS_DATA_XFER) {
780 		mutex_exit(&connp->conn_lock);
781 		return (-TOUTSTATE);
782 	}
783 	udpf = &us->us_bind_fanout[UDP_BIND_HASH(connp->conn_lport,
784 	    us->us_bind_fanout_size)];
785 	mutex_enter(&udpf->uf_lock);
786 	if (connp->conn_mcbc_bind)
787 		connp->conn_saddr_v6 = ipv6_all_zeros;
788 	else
789 		connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
790 	connp->conn_laddr_v6 = connp->conn_bound_addr_v6;
791 	connp->conn_faddr_v6 = ipv6_all_zeros;
792 	connp->conn_fport = 0;
793 	udp->udp_state = TS_IDLE;
794 	mutex_exit(&udpf->uf_lock);
795 
796 	/* Remove any remnants of mapped address binding */
797 	if (connp->conn_family == AF_INET6)
798 		connp->conn_ipversion = IPV6_VERSION;
799 
800 	connp->conn_v6lastdst = ipv6_all_zeros;
801 	error = udp_build_hdr_template(connp, &connp->conn_saddr_v6,
802 	    &connp->conn_faddr_v6, connp->conn_fport, connp->conn_flowinfo);
803 	mutex_exit(&connp->conn_lock);
804 	if (error != 0)
805 		return (error);
806 
807 	/*
808 	 * Tell IP to remove the full binding and revert
809 	 * to the local address binding.
810 	 */
811 	return (ip_laddr_fanout_insert(connp));
812 }
813 
814 static void
815 udp_tpi_disconnect(queue_t *q, mblk_t *mp)
816 {
817 	conn_t	*connp = Q_TO_CONN(q);
818 	int	error;
819 
820 	/*
821 	 * Allocate the largest primitive we need to send back
822 	 * T_error_ack is > than T_ok_ack
823 	 */
824 	mp = reallocb(mp, sizeof (struct T_error_ack), 1);
825 	if (mp == NULL) {
826 		/* Unable to reuse the T_DISCON_REQ for the ack. */
827 		udp_err_ack_prim(q, mp, T_DISCON_REQ, TSYSERR, ENOMEM);
828 		return;
829 	}
830 
831 	error = udp_do_disconnect(connp);
832 
833 	if (error != 0) {
834 		if (error < 0) {
835 			udp_err_ack(q, mp, -error, 0);
836 		} else {
837 			udp_err_ack(q, mp, TSYSERR, error);
838 		}
839 	} else {
840 		mp = mi_tpi_ok_ack_alloc(mp);
841 		ASSERT(mp != NULL);
842 		qreply(q, mp);
843 	}
844 }
845 
846 int
847 udp_disconnect(conn_t *connp)
848 {
849 	int error;
850 
851 	connp->conn_dgram_errind = B_FALSE;
852 	error = udp_do_disconnect(connp);
853 	if (error < 0)
854 		error = proto_tlitosyserr(-error);
855 
856 	return (error);
857 }
858 
859 /* This routine creates a T_ERROR_ACK message and passes it upstream. */
860 static void
861 udp_err_ack(queue_t *q, mblk_t *mp, t_scalar_t t_error, int sys_error)
862 {
863 	if ((mp = mi_tpi_err_ack_alloc(mp, t_error, sys_error)) != NULL)
864 		qreply(q, mp);
865 }
866 
867 /* Shorthand to generate and send TPI error acks to our client */
868 static void
869 udp_err_ack_prim(queue_t *q, mblk_t *mp, t_scalar_t primitive,
870     t_scalar_t t_error, int sys_error)
871 {
872 	struct T_error_ack	*teackp;
873 
874 	if ((mp = tpi_ack_alloc(mp, sizeof (struct T_error_ack),
875 	    M_PCPROTO, T_ERROR_ACK)) != NULL) {
876 		teackp = (struct T_error_ack *)mp->b_rptr;
877 		teackp->ERROR_prim = primitive;
878 		teackp->TLI_error = t_error;
879 		teackp->UNIX_error = sys_error;
880 		qreply(q, mp);
881 	}
882 }
883 
884 /* At minimum we need 4 bytes of UDP header */
885 #define	ICMP_MIN_UDP_HDR	4
886 
887 /*
888  * udp_icmp_input is called as conn_recvicmp to process ICMP messages.
889  * Generates the appropriate T_UDERROR_IND for permanent (non-transient) errors.
890  * Assumes that IP has pulled up everything up to and including the ICMP header.
891  */
892 /* ARGSUSED2 */
893 static void
894 udp_icmp_input(void *arg1, mblk_t *mp, void *arg2, ip_recv_attr_t *ira)
895 {
896 	conn_t		*connp = (conn_t *)arg1;
897 	icmph_t		*icmph;
898 	ipha_t		*ipha;
899 	int		iph_hdr_length;
900 	udpha_t		*udpha;
901 	sin_t		sin;
902 	sin6_t		sin6;
903 	mblk_t		*mp1;
904 	int		error = 0;
905 	udp_t		*udp = connp->conn_udp;
906 
907 	ipha = (ipha_t *)mp->b_rptr;
908 
909 	ASSERT(OK_32PTR(mp->b_rptr));
910 
911 	if (IPH_HDR_VERSION(ipha) != IPV4_VERSION) {
912 		ASSERT(IPH_HDR_VERSION(ipha) == IPV6_VERSION);
913 		udp_icmp_error_ipv6(connp, mp, ira);
914 		return;
915 	}
916 	ASSERT(IPH_HDR_VERSION(ipha) == IPV4_VERSION);
917 
918 	/* Skip past the outer IP and ICMP headers */
919 	ASSERT(IPH_HDR_LENGTH(ipha) == ira->ira_ip_hdr_length);
920 	iph_hdr_length = ira->ira_ip_hdr_length;
921 	icmph = (icmph_t *)&mp->b_rptr[iph_hdr_length];
922 	ipha = (ipha_t *)&icmph[1];	/* Inner IP header */
923 
924 	/* Skip past the inner IP and find the ULP header */
925 	iph_hdr_length = IPH_HDR_LENGTH(ipha);
926 	udpha = (udpha_t *)((char *)ipha + iph_hdr_length);
927 
928 	switch (icmph->icmph_type) {
929 	case ICMP_DEST_UNREACHABLE:
930 		switch (icmph->icmph_code) {
931 		case ICMP_FRAGMENTATION_NEEDED: {
932 			ipha_t		*ipha;
933 			ip_xmit_attr_t	*ixa;
934 			/*
935 			 * IP has already adjusted the path MTU.
936 			 * But we need to adjust DF for IPv4.
937 			 */
938 			if (connp->conn_ipversion != IPV4_VERSION)
939 				break;
940 
941 			ixa = conn_get_ixa(connp, B_FALSE);
942 			if (ixa == NULL || ixa->ixa_ire == NULL) {
943 				/*
944 				 * Some other thread holds conn_ixa. We will
945 				 * redo this on the next ICMP too big.
946 				 */
947 				if (ixa != NULL)
948 					ixa_refrele(ixa);
949 				break;
950 			}
951 			(void) ip_get_pmtu(ixa);
952 
953 			mutex_enter(&connp->conn_lock);
954 			ipha = (ipha_t *)connp->conn_ht_iphc;
955 			if (ixa->ixa_flags & IXAF_PMTU_IPV4_DF) {
956 				ipha->ipha_fragment_offset_and_flags |=
957 				    IPH_DF_HTONS;
958 			} else {
959 				ipha->ipha_fragment_offset_and_flags &=
960 				    ~IPH_DF_HTONS;
961 			}
962 			mutex_exit(&connp->conn_lock);
963 			ixa_refrele(ixa);
964 			break;
965 		}
966 		case ICMP_PORT_UNREACHABLE:
967 		case ICMP_PROTOCOL_UNREACHABLE:
968 			error = ECONNREFUSED;
969 			break;
970 		default:
971 			/* Transient errors */
972 			break;
973 		}
974 		break;
975 	default:
976 		/* Transient errors */
977 		break;
978 	}
979 	if (error == 0) {
980 		freemsg(mp);
981 		return;
982 	}
983 
984 	/*
985 	 * Deliver T_UDERROR_IND when the application has asked for it.
986 	 * The socket layer enables this automatically when connected.
987 	 */
988 	if (!connp->conn_dgram_errind) {
989 		freemsg(mp);
990 		return;
991 	}
992 
993 	switch (connp->conn_family) {
994 	case AF_INET:
995 		sin = sin_null;
996 		sin.sin_family = AF_INET;
997 		sin.sin_addr.s_addr = ipha->ipha_dst;
998 		sin.sin_port = udpha->uha_dst_port;
999 		if (IPCL_IS_NONSTR(connp)) {
1000 			mutex_enter(&connp->conn_lock);
1001 			if (udp->udp_state == TS_DATA_XFER) {
1002 				if (sin.sin_port == connp->conn_fport &&
1003 				    sin.sin_addr.s_addr ==
1004 				    connp->conn_faddr_v4) {
1005 					mutex_exit(&connp->conn_lock);
1006 					(*connp->conn_upcalls->su_set_error)
1007 					    (connp->conn_upper_handle, error);
1008 					goto done;
1009 				}
1010 			} else {
1011 				udp->udp_delayed_error = error;
1012 				*((sin_t *)&udp->udp_delayed_addr) = sin;
1013 			}
1014 			mutex_exit(&connp->conn_lock);
1015 		} else {
1016 			mp1 = mi_tpi_uderror_ind((char *)&sin, sizeof (sin_t),
1017 			    NULL, 0, error);
1018 			if (mp1 != NULL)
1019 				putnext(connp->conn_rq, mp1);
1020 		}
1021 		break;
1022 	case AF_INET6:
1023 		sin6 = sin6_null;
1024 		sin6.sin6_family = AF_INET6;
1025 		IN6_IPADDR_TO_V4MAPPED(ipha->ipha_dst, &sin6.sin6_addr);
1026 		sin6.sin6_port = udpha->uha_dst_port;
1027 		if (IPCL_IS_NONSTR(connp)) {
1028 			mutex_enter(&connp->conn_lock);
1029 			if (udp->udp_state == TS_DATA_XFER) {
1030 				if (sin6.sin6_port == connp->conn_fport &&
1031 				    IN6_ARE_ADDR_EQUAL(&sin6.sin6_addr,
1032 				    &connp->conn_faddr_v6)) {
1033 					mutex_exit(&connp->conn_lock);
1034 					(*connp->conn_upcalls->su_set_error)
1035 					    (connp->conn_upper_handle, error);
1036 					goto done;
1037 				}
1038 			} else {
1039 				udp->udp_delayed_error = error;
1040 				*((sin6_t *)&udp->udp_delayed_addr) = sin6;
1041 			}
1042 			mutex_exit(&connp->conn_lock);
1043 		} else {
1044 			mp1 = mi_tpi_uderror_ind((char *)&sin6, sizeof (sin6_t),
1045 			    NULL, 0, error);
1046 			if (mp1 != NULL)
1047 				putnext(connp->conn_rq, mp1);
1048 		}
1049 		break;
1050 	}
1051 done:
1052 	freemsg(mp);
1053 }
1054 
1055 /*
1056  * udp_icmp_error_ipv6 is called by udp_icmp_error to process ICMP for IPv6.
1057  * Generates the appropriate T_UDERROR_IND for permanent (non-transient) errors.
1058  * Assumes that IP has pulled up all the extension headers as well as the
1059  * ICMPv6 header.
1060  */
1061 static void
1062 udp_icmp_error_ipv6(conn_t *connp, mblk_t *mp, ip_recv_attr_t *ira)
1063 {
1064 	icmp6_t		*icmp6;
1065 	ip6_t		*ip6h, *outer_ip6h;
1066 	uint16_t	iph_hdr_length;
1067 	uint8_t		*nexthdrp;
1068 	udpha_t		*udpha;
1069 	sin6_t		sin6;
1070 	mblk_t		*mp1;
1071 	int		error = 0;
1072 	udp_t		*udp = connp->conn_udp;
1073 	udp_stack_t	*us = udp->udp_us;
1074 
1075 	outer_ip6h = (ip6_t *)mp->b_rptr;
1076 #ifdef DEBUG
1077 	if (outer_ip6h->ip6_nxt != IPPROTO_ICMPV6)
1078 		iph_hdr_length = ip_hdr_length_v6(mp, outer_ip6h);
1079 	else
1080 		iph_hdr_length = IPV6_HDR_LEN;
1081 	ASSERT(iph_hdr_length == ira->ira_ip_hdr_length);
1082 #endif
1083 	/* Skip past the outer IP and ICMP headers */
1084 	iph_hdr_length = ira->ira_ip_hdr_length;
1085 	icmp6 = (icmp6_t *)&mp->b_rptr[iph_hdr_length];
1086 
1087 	/* Skip past the inner IP and find the ULP header */
1088 	ip6h = (ip6_t *)&icmp6[1];	/* Inner IP header */
1089 	if (!ip_hdr_length_nexthdr_v6(mp, ip6h, &iph_hdr_length, &nexthdrp)) {
1090 		freemsg(mp);
1091 		return;
1092 	}
1093 	udpha = (udpha_t *)((char *)ip6h + iph_hdr_length);
1094 
1095 	switch (icmp6->icmp6_type) {
1096 	case ICMP6_DST_UNREACH:
1097 		switch (icmp6->icmp6_code) {
1098 		case ICMP6_DST_UNREACH_NOPORT:
1099 			error = ECONNREFUSED;
1100 			break;
1101 		case ICMP6_DST_UNREACH_ADMIN:
1102 		case ICMP6_DST_UNREACH_NOROUTE:
1103 		case ICMP6_DST_UNREACH_BEYONDSCOPE:
1104 		case ICMP6_DST_UNREACH_ADDR:
1105 			/* Transient errors */
1106 			break;
1107 		default:
1108 			break;
1109 		}
1110 		break;
1111 	case ICMP6_PACKET_TOO_BIG: {
1112 		struct T_unitdata_ind	*tudi;
1113 		struct T_opthdr		*toh;
1114 		size_t			udi_size;
1115 		mblk_t			*newmp;
1116 		t_scalar_t		opt_length = sizeof (struct T_opthdr) +
1117 		    sizeof (struct ip6_mtuinfo);
1118 		sin6_t			*sin6;
1119 		struct ip6_mtuinfo	*mtuinfo;
1120 
1121 		/*
1122 		 * If the application has requested to receive path mtu
1123 		 * information, send up an empty message containing an
1124 		 * IPV6_PATHMTU ancillary data item.
1125 		 */
1126 		if (!connp->conn_ipv6_recvpathmtu)
1127 			break;
1128 
1129 		udi_size = sizeof (struct T_unitdata_ind) + sizeof (sin6_t) +
1130 		    opt_length;
1131 		if ((newmp = allocb(udi_size, BPRI_MED)) == NULL) {
1132 			BUMP_MIB(&us->us_udp_mib, udpInErrors);
1133 			break;
1134 		}
1135 
1136 		/*
1137 		 * newmp->b_cont is left to NULL on purpose.  This is an
1138 		 * empty message containing only ancillary data.
1139 		 */
1140 		newmp->b_datap->db_type = M_PROTO;
1141 		tudi = (struct T_unitdata_ind *)newmp->b_rptr;
1142 		newmp->b_wptr = (uchar_t *)tudi + udi_size;
1143 		tudi->PRIM_type = T_UNITDATA_IND;
1144 		tudi->SRC_length = sizeof (sin6_t);
1145 		tudi->SRC_offset = sizeof (struct T_unitdata_ind);
1146 		tudi->OPT_offset = tudi->SRC_offset + sizeof (sin6_t);
1147 		tudi->OPT_length = opt_length;
1148 
1149 		sin6 = (sin6_t *)&tudi[1];
1150 		bzero(sin6, sizeof (sin6_t));
1151 		sin6->sin6_family = AF_INET6;
1152 		sin6->sin6_addr = connp->conn_faddr_v6;
1153 
1154 		toh = (struct T_opthdr *)&sin6[1];
1155 		toh->level = IPPROTO_IPV6;
1156 		toh->name = IPV6_PATHMTU;
1157 		toh->len = opt_length;
1158 		toh->status = 0;
1159 
1160 		mtuinfo = (struct ip6_mtuinfo *)&toh[1];
1161 		bzero(mtuinfo, sizeof (struct ip6_mtuinfo));
1162 		mtuinfo->ip6m_addr.sin6_family = AF_INET6;
1163 		mtuinfo->ip6m_addr.sin6_addr = ip6h->ip6_dst;
1164 		mtuinfo->ip6m_mtu = icmp6->icmp6_mtu;
1165 		/*
1166 		 * We've consumed everything we need from the original
1167 		 * message.  Free it, then send our empty message.
1168 		 */
1169 		freemsg(mp);
1170 		udp_ulp_recv(connp, newmp, msgdsize(newmp), ira);
1171 		return;
1172 	}
1173 	case ICMP6_TIME_EXCEEDED:
1174 		/* Transient errors */
1175 		break;
1176 	case ICMP6_PARAM_PROB:
1177 		/* If this corresponds to an ICMP_PROTOCOL_UNREACHABLE */
1178 		if (icmp6->icmp6_code == ICMP6_PARAMPROB_NEXTHEADER &&
1179 		    (uchar_t *)ip6h + icmp6->icmp6_pptr ==
1180 		    (uchar_t *)nexthdrp) {
1181 			error = ECONNREFUSED;
1182 			break;
1183 		}
1184 		break;
1185 	}
1186 	if (error == 0) {
1187 		freemsg(mp);
1188 		return;
1189 	}
1190 
1191 	/*
1192 	 * Deliver T_UDERROR_IND when the application has asked for it.
1193 	 * The socket layer enables this automatically when connected.
1194 	 */
1195 	if (!connp->conn_dgram_errind) {
1196 		freemsg(mp);
1197 		return;
1198 	}
1199 
1200 	sin6 = sin6_null;
1201 	sin6.sin6_family = AF_INET6;
1202 	sin6.sin6_addr = ip6h->ip6_dst;
1203 	sin6.sin6_port = udpha->uha_dst_port;
1204 	sin6.sin6_flowinfo = ip6h->ip6_vcf & ~IPV6_VERS_AND_FLOW_MASK;
1205 
1206 	if (IPCL_IS_NONSTR(connp)) {
1207 		mutex_enter(&connp->conn_lock);
1208 		if (udp->udp_state == TS_DATA_XFER) {
1209 			if (sin6.sin6_port == connp->conn_fport &&
1210 			    IN6_ARE_ADDR_EQUAL(&sin6.sin6_addr,
1211 			    &connp->conn_faddr_v6)) {
1212 				mutex_exit(&connp->conn_lock);
1213 				(*connp->conn_upcalls->su_set_error)
1214 				    (connp->conn_upper_handle, error);
1215 				goto done;
1216 			}
1217 		} else {
1218 			udp->udp_delayed_error = error;
1219 			*((sin6_t *)&udp->udp_delayed_addr) = sin6;
1220 		}
1221 		mutex_exit(&connp->conn_lock);
1222 	} else {
1223 		mp1 = mi_tpi_uderror_ind((char *)&sin6, sizeof (sin6_t),
1224 		    NULL, 0, error);
1225 		if (mp1 != NULL)
1226 			putnext(connp->conn_rq, mp1);
1227 	}
1228 done:
1229 	freemsg(mp);
1230 }
1231 
1232 /*
1233  * This routine responds to T_ADDR_REQ messages.  It is called by udp_wput.
1234  * The local address is filled in if endpoint is bound. The remote address
1235  * is filled in if remote address has been precified ("connected endpoint")
1236  * (The concept of connected CLTS sockets is alien to published TPI
1237  *  but we support it anyway).
1238  */
1239 static void
1240 udp_addr_req(queue_t *q, mblk_t *mp)
1241 {
1242 	struct sockaddr *sa;
1243 	mblk_t	*ackmp;
1244 	struct T_addr_ack *taa;
1245 	udp_t	*udp = Q_TO_UDP(q);
1246 	conn_t	*connp = udp->udp_connp;
1247 	uint_t	addrlen;
1248 
1249 	/* Make it large enough for worst case */
1250 	ackmp = reallocb(mp, sizeof (struct T_addr_ack) +
1251 	    2 * sizeof (sin6_t), 1);
1252 	if (ackmp == NULL) {
1253 		udp_err_ack(q, mp, TSYSERR, ENOMEM);
1254 		return;
1255 	}
1256 	taa = (struct T_addr_ack *)ackmp->b_rptr;
1257 
1258 	bzero(taa, sizeof (struct T_addr_ack));
1259 	ackmp->b_wptr = (uchar_t *)&taa[1];
1260 
1261 	taa->PRIM_type = T_ADDR_ACK;
1262 	ackmp->b_datap->db_type = M_PCPROTO;
1263 
1264 	if (connp->conn_family == AF_INET)
1265 		addrlen = sizeof (sin_t);
1266 	else
1267 		addrlen = sizeof (sin6_t);
1268 
1269 	mutex_enter(&connp->conn_lock);
1270 	/*
1271 	 * Note: Following code assumes 32 bit alignment of basic
1272 	 * data structures like sin_t and struct T_addr_ack.
1273 	 */
1274 	if (udp->udp_state != TS_UNBND) {
1275 		/*
1276 		 * Fill in local address first
1277 		 */
1278 		taa->LOCADDR_offset = sizeof (*taa);
1279 		taa->LOCADDR_length = addrlen;
1280 		sa = (struct sockaddr *)&taa[1];
1281 		(void) conn_getsockname(connp, sa, &addrlen);
1282 		ackmp->b_wptr += addrlen;
1283 	}
1284 	if (udp->udp_state == TS_DATA_XFER) {
1285 		/*
1286 		 * connected, fill remote address too
1287 		 */
1288 		taa->REMADDR_length = addrlen;
1289 		/* assumed 32-bit alignment */
1290 		taa->REMADDR_offset = taa->LOCADDR_offset + taa->LOCADDR_length;
1291 		sa = (struct sockaddr *)(ackmp->b_rptr + taa->REMADDR_offset);
1292 		(void) conn_getpeername(connp, sa, &addrlen);
1293 		ackmp->b_wptr += addrlen;
1294 	}
1295 	mutex_exit(&connp->conn_lock);
1296 	ASSERT(ackmp->b_wptr <= ackmp->b_datap->db_lim);
1297 	qreply(q, ackmp);
1298 }
1299 
1300 static void
1301 udp_copy_info(struct T_info_ack *tap, udp_t *udp)
1302 {
1303 	conn_t		*connp = udp->udp_connp;
1304 
1305 	if (connp->conn_family == AF_INET) {
1306 		*tap = udp_g_t_info_ack_ipv4;
1307 	} else {
1308 		*tap = udp_g_t_info_ack_ipv6;
1309 	}
1310 	tap->CURRENT_state = udp->udp_state;
1311 	tap->OPT_size = udp_max_optsize;
1312 }
1313 
1314 static void
1315 udp_do_capability_ack(udp_t *udp, struct T_capability_ack *tcap,
1316     t_uscalar_t cap_bits1)
1317 {
1318 	tcap->CAP_bits1 = 0;
1319 
1320 	if (cap_bits1 & TC1_INFO) {
1321 		udp_copy_info(&tcap->INFO_ack, udp);
1322 		tcap->CAP_bits1 |= TC1_INFO;
1323 	}
1324 }
1325 
1326 /*
1327  * This routine responds to T_CAPABILITY_REQ messages.  It is called by
1328  * udp_wput.  Much of the T_CAPABILITY_ACK information is copied from
1329  * udp_g_t_info_ack.  The current state of the stream is copied from
1330  * udp_state.
1331  */
1332 static void
1333 udp_capability_req(queue_t *q, mblk_t *mp)
1334 {
1335 	t_uscalar_t		cap_bits1;
1336 	struct T_capability_ack	*tcap;
1337 	udp_t	*udp = Q_TO_UDP(q);
1338 
1339 	cap_bits1 = ((struct T_capability_req *)mp->b_rptr)->CAP_bits1;
1340 
1341 	mp = tpi_ack_alloc(mp, sizeof (struct T_capability_ack),
1342 	    mp->b_datap->db_type, T_CAPABILITY_ACK);
1343 	if (!mp)
1344 		return;
1345 
1346 	tcap = (struct T_capability_ack *)mp->b_rptr;
1347 	udp_do_capability_ack(udp, tcap, cap_bits1);
1348 
1349 	qreply(q, mp);
1350 }
1351 
1352 /*
1353  * This routine responds to T_INFO_REQ messages.  It is called by udp_wput.
1354  * Most of the T_INFO_ACK information is copied from udp_g_t_info_ack.
1355  * The current state of the stream is copied from udp_state.
1356  */
1357 static void
1358 udp_info_req(queue_t *q, mblk_t *mp)
1359 {
1360 	udp_t *udp = Q_TO_UDP(q);
1361 
1362 	/* Create a T_INFO_ACK message. */
1363 	mp = tpi_ack_alloc(mp, sizeof (struct T_info_ack), M_PCPROTO,
1364 	    T_INFO_ACK);
1365 	if (!mp)
1366 		return;
1367 	udp_copy_info((struct T_info_ack *)mp->b_rptr, udp);
1368 	qreply(q, mp);
1369 }
1370 
1371 /* For /dev/udp aka AF_INET open */
1372 static int
1373 udp_openv4(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
1374 {
1375 	return (udp_open(q, devp, flag, sflag, credp, B_FALSE));
1376 }
1377 
1378 /* For /dev/udp6 aka AF_INET6 open */
1379 static int
1380 udp_openv6(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
1381 {
1382 	return (udp_open(q, devp, flag, sflag, credp, B_TRUE));
1383 }
1384 
1385 /*
1386  * This is the open routine for udp.  It allocates a udp_t structure for
1387  * the stream and, on the first open of the module, creates an ND table.
1388  */
1389 static int
1390 udp_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp,
1391     boolean_t isv6)
1392 {
1393 	udp_t		*udp;
1394 	conn_t		*connp;
1395 	dev_t		conn_dev;
1396 	vmem_t		*minor_arena;
1397 	int		err;
1398 
1399 	/* If the stream is already open, return immediately. */
1400 	if (q->q_ptr != NULL)
1401 		return (0);
1402 
1403 	if (sflag == MODOPEN)
1404 		return (EINVAL);
1405 
1406 	if ((ip_minor_arena_la != NULL) && (flag & SO_SOCKSTR) &&
1407 	    ((conn_dev = inet_minor_alloc(ip_minor_arena_la)) != 0)) {
1408 		minor_arena = ip_minor_arena_la;
1409 	} else {
1410 		/*
1411 		 * Either minor numbers in the large arena were exhausted
1412 		 * or a non socket application is doing the open.
1413 		 * Try to allocate from the small arena.
1414 		 */
1415 		if ((conn_dev = inet_minor_alloc(ip_minor_arena_sa)) == 0)
1416 			return (EBUSY);
1417 
1418 		minor_arena = ip_minor_arena_sa;
1419 	}
1420 
1421 	if (flag & SO_FALLBACK) {
1422 		/*
1423 		 * Non streams socket needs a stream to fallback to
1424 		 */
1425 		RD(q)->q_ptr = (void *)conn_dev;
1426 		WR(q)->q_qinfo = &udp_fallback_sock_winit;
1427 		WR(q)->q_ptr = (void *)minor_arena;
1428 		qprocson(q);
1429 		return (0);
1430 	}
1431 
1432 	connp = udp_do_open(credp, isv6, KM_SLEEP, &err);
1433 	if (connp == NULL) {
1434 		inet_minor_free(minor_arena, conn_dev);
1435 		return (err);
1436 	}
1437 	udp = connp->conn_udp;
1438 
1439 	*devp = makedevice(getemajor(*devp), (minor_t)conn_dev);
1440 	connp->conn_dev = conn_dev;
1441 	connp->conn_minor_arena = minor_arena;
1442 
1443 	/*
1444 	 * Initialize the udp_t structure for this stream.
1445 	 */
1446 	q->q_ptr = connp;
1447 	WR(q)->q_ptr = connp;
1448 	connp->conn_rq = q;
1449 	connp->conn_wq = WR(q);
1450 
1451 	/*
1452 	 * Since this conn_t/udp_t is not yet visible to anybody else we don't
1453 	 * need to lock anything.
1454 	 */
1455 	ASSERT(connp->conn_proto == IPPROTO_UDP);
1456 	ASSERT(connp->conn_udp == udp);
1457 	ASSERT(udp->udp_connp == connp);
1458 
1459 	if (flag & SO_SOCKSTR) {
1460 		udp->udp_issocket = B_TRUE;
1461 	}
1462 
1463 	WR(q)->q_hiwat = connp->conn_sndbuf;
1464 	WR(q)->q_lowat = connp->conn_sndlowat;
1465 
1466 	qprocson(q);
1467 
1468 	/* Set the Stream head write offset and high watermark. */
1469 	(void) proto_set_tx_wroff(q, connp, connp->conn_wroff);
1470 	(void) proto_set_rx_hiwat(q, connp,
1471 	    udp_set_rcv_hiwat(udp, connp->conn_rcvbuf));
1472 
1473 	mutex_enter(&connp->conn_lock);
1474 	connp->conn_state_flags &= ~CONN_INCIPIENT;
1475 	mutex_exit(&connp->conn_lock);
1476 	return (0);
1477 }
1478 
1479 /*
1480  * Which UDP options OK to set through T_UNITDATA_REQ...
1481  */
1482 /* ARGSUSED */
1483 static boolean_t
1484 udp_opt_allow_udr_set(t_scalar_t level, t_scalar_t name)
1485 {
1486 	return (B_TRUE);
1487 }
1488 
1489 /*
1490  * This routine gets default values of certain options whose default
1491  * values are maintained by protcol specific code
1492  */
1493 int
1494 udp_opt_default(queue_t *q, t_scalar_t level, t_scalar_t name, uchar_t *ptr)
1495 {
1496 	udp_t		*udp = Q_TO_UDP(q);
1497 	udp_stack_t *us = udp->udp_us;
1498 	int *i1 = (int *)ptr;
1499 
1500 	switch (level) {
1501 	case IPPROTO_IP:
1502 		switch (name) {
1503 		case IP_MULTICAST_TTL:
1504 			*ptr = (uchar_t)IP_DEFAULT_MULTICAST_TTL;
1505 			return (sizeof (uchar_t));
1506 		case IP_MULTICAST_LOOP:
1507 			*ptr = (uchar_t)IP_DEFAULT_MULTICAST_LOOP;
1508 			return (sizeof (uchar_t));
1509 		}
1510 		break;
1511 	case IPPROTO_IPV6:
1512 		switch (name) {
1513 		case IPV6_MULTICAST_HOPS:
1514 			*i1 = IP_DEFAULT_MULTICAST_TTL;
1515 			return (sizeof (int));
1516 		case IPV6_MULTICAST_LOOP:
1517 			*i1 = IP_DEFAULT_MULTICAST_LOOP;
1518 			return (sizeof (int));
1519 		case IPV6_UNICAST_HOPS:
1520 			*i1 = us->us_ipv6_hoplimit;
1521 			return (sizeof (int));
1522 		}
1523 		break;
1524 	}
1525 	return (-1);
1526 }
1527 
1528 /*
1529  * This routine retrieves the current status of socket options.
1530  * It returns the size of the option retrieved, or -1.
1531  */
1532 int
1533 udp_opt_get(conn_t *connp, t_scalar_t level, t_scalar_t name,
1534     uchar_t *ptr)
1535 {
1536 	int		*i1 = (int *)ptr;
1537 	udp_t		*udp = connp->conn_udp;
1538 	int		len;
1539 	conn_opt_arg_t	coas;
1540 	int		retval;
1541 
1542 	coas.coa_connp = connp;
1543 	coas.coa_ixa = connp->conn_ixa;
1544 	coas.coa_ipp = &connp->conn_xmit_ipp;
1545 	coas.coa_ancillary = B_FALSE;
1546 	coas.coa_changed = 0;
1547 
1548 	/*
1549 	 * We assume that the optcom framework has checked for the set
1550 	 * of levels and names that are supported, hence we don't worry
1551 	 * about rejecting based on that.
1552 	 * First check for UDP specific handling, then pass to common routine.
1553 	 */
1554 	switch (level) {
1555 	case IPPROTO_IP:
1556 		/*
1557 		 * Only allow IPv4 option processing on IPv4 sockets.
1558 		 */
1559 		if (connp->conn_family != AF_INET)
1560 			return (-1);
1561 
1562 		switch (name) {
1563 		case IP_OPTIONS:
1564 		case T_IP_OPTIONS:
1565 			mutex_enter(&connp->conn_lock);
1566 			if (!(udp->udp_recv_ipp.ipp_fields &
1567 			    IPPF_IPV4_OPTIONS)) {
1568 				mutex_exit(&connp->conn_lock);
1569 				return (0);
1570 			}
1571 
1572 			len = udp->udp_recv_ipp.ipp_ipv4_options_len;
1573 			ASSERT(len != 0);
1574 			bcopy(udp->udp_recv_ipp.ipp_ipv4_options, ptr, len);
1575 			mutex_exit(&connp->conn_lock);
1576 			return (len);
1577 		}
1578 		break;
1579 	case IPPROTO_UDP:
1580 		switch (name) {
1581 		case UDP_NAT_T_ENDPOINT:
1582 			mutex_enter(&connp->conn_lock);
1583 			*i1 = udp->udp_nat_t_endpoint;
1584 			mutex_exit(&connp->conn_lock);
1585 			return (sizeof (int));
1586 		case UDP_RCVHDR:
1587 			mutex_enter(&connp->conn_lock);
1588 			*i1 = udp->udp_rcvhdr ? 1 : 0;
1589 			mutex_exit(&connp->conn_lock);
1590 			return (sizeof (int));
1591 		}
1592 	}
1593 	mutex_enter(&connp->conn_lock);
1594 	retval = conn_opt_get(&coas, level, name, ptr);
1595 	mutex_exit(&connp->conn_lock);
1596 	return (retval);
1597 }
1598 
1599 /*
1600  * This routine retrieves the current status of socket options.
1601  * It returns the size of the option retrieved, or -1.
1602  */
1603 int
1604 udp_tpi_opt_get(queue_t *q, t_scalar_t level, t_scalar_t name, uchar_t *ptr)
1605 {
1606 	conn_t		*connp = Q_TO_CONN(q);
1607 	int		err;
1608 
1609 	err = udp_opt_get(connp, level, name, ptr);
1610 	return (err);
1611 }
1612 
1613 /*
1614  * This routine sets socket options.
1615  */
1616 int
1617 udp_do_opt_set(conn_opt_arg_t *coa, int level, int name,
1618     uint_t inlen, uchar_t *invalp, cred_t *cr, boolean_t checkonly)
1619 {
1620 	conn_t		*connp = coa->coa_connp;
1621 	ip_xmit_attr_t	*ixa = coa->coa_ixa;
1622 	udp_t		*udp = connp->conn_udp;
1623 	udp_stack_t	*us = udp->udp_us;
1624 	int		*i1 = (int *)invalp;
1625 	boolean_t 	onoff = (*i1 == 0) ? 0 : 1;
1626 	int		error;
1627 
1628 	ASSERT(MUTEX_NOT_HELD(&coa->coa_connp->conn_lock));
1629 	/*
1630 	 * First do UDP specific sanity checks and handle UDP specific
1631 	 * options. Note that some IPPROTO_UDP options are handled
1632 	 * by conn_opt_set.
1633 	 */
1634 	switch (level) {
1635 	case SOL_SOCKET:
1636 		switch (name) {
1637 		case SO_SNDBUF:
1638 			if (*i1 > us->us_max_buf) {
1639 				return (ENOBUFS);
1640 			}
1641 			break;
1642 		case SO_RCVBUF:
1643 			if (*i1 > us->us_max_buf) {
1644 				return (ENOBUFS);
1645 			}
1646 			break;
1647 
1648 		case SCM_UCRED: {
1649 			struct ucred_s *ucr;
1650 			cred_t *newcr;
1651 			ts_label_t *tsl;
1652 
1653 			/*
1654 			 * Only sockets that have proper privileges and are
1655 			 * bound to MLPs will have any other value here, so
1656 			 * this implicitly tests for privilege to set label.
1657 			 */
1658 			if (connp->conn_mlp_type == mlptSingle)
1659 				break;
1660 
1661 			ucr = (struct ucred_s *)invalp;
1662 			if (inlen < sizeof (*ucr) + sizeof (bslabel_t) ||
1663 			    ucr->uc_labeloff < sizeof (*ucr) ||
1664 			    ucr->uc_labeloff + sizeof (bslabel_t) > inlen)
1665 				return (EINVAL);
1666 			if (!checkonly) {
1667 				/*
1668 				 * Set ixa_tsl to the new label.
1669 				 * We assume that crgetzoneid doesn't change
1670 				 * as part of the SCM_UCRED.
1671 				 */
1672 				ASSERT(cr != NULL);
1673 				if ((tsl = crgetlabel(cr)) == NULL)
1674 					return (EINVAL);
1675 				newcr = copycred_from_bslabel(cr, UCLABEL(ucr),
1676 				    tsl->tsl_doi, KM_NOSLEEP);
1677 				if (newcr == NULL)
1678 					return (ENOSR);
1679 				ASSERT(newcr->cr_label != NULL);
1680 				/*
1681 				 * Move the hold on the cr_label to ixa_tsl by
1682 				 * setting cr_label to NULL. Then release newcr.
1683 				 */
1684 				ip_xmit_attr_replace_tsl(ixa, newcr->cr_label);
1685 				ixa->ixa_flags |= IXAF_UCRED_TSL;
1686 				newcr->cr_label = NULL;
1687 				crfree(newcr);
1688 				coa->coa_changed |= COA_HEADER_CHANGED;
1689 				coa->coa_changed |= COA_WROFF_CHANGED;
1690 			}
1691 			/* Fully handled this option. */
1692 			return (0);
1693 		}
1694 		}
1695 		break;
1696 	case IPPROTO_UDP:
1697 		switch (name) {
1698 		case UDP_NAT_T_ENDPOINT:
1699 			if ((error = secpolicy_ip_config(cr, B_FALSE)) != 0) {
1700 				return (error);
1701 			}
1702 
1703 			/*
1704 			 * Use conn_family instead so we can avoid ambiguitites
1705 			 * with AF_INET6 sockets that may switch from IPv4
1706 			 * to IPv6.
1707 			 */
1708 			if (connp->conn_family != AF_INET) {
1709 				return (EAFNOSUPPORT);
1710 			}
1711 
1712 			if (!checkonly) {
1713 				mutex_enter(&connp->conn_lock);
1714 				udp->udp_nat_t_endpoint = onoff;
1715 				mutex_exit(&connp->conn_lock);
1716 				coa->coa_changed |= COA_HEADER_CHANGED;
1717 				coa->coa_changed |= COA_WROFF_CHANGED;
1718 			}
1719 			/* Fully handled this option. */
1720 			return (0);
1721 		case UDP_RCVHDR:
1722 			mutex_enter(&connp->conn_lock);
1723 			udp->udp_rcvhdr = onoff;
1724 			mutex_exit(&connp->conn_lock);
1725 			return (0);
1726 		}
1727 		break;
1728 	}
1729 	error = conn_opt_set(coa, level, name, inlen, invalp,
1730 	    checkonly, cr);
1731 	return (error);
1732 }
1733 
1734 /*
1735  * This routine sets socket options.
1736  */
1737 int
1738 udp_opt_set(conn_t *connp, uint_t optset_context, int level,
1739     int name, uint_t inlen, uchar_t *invalp, uint_t *outlenp,
1740     uchar_t *outvalp, void *thisdg_attrs, cred_t *cr)
1741 {
1742 	udp_t		*udp = connp->conn_udp;
1743 	int		err;
1744 	conn_opt_arg_t	coas, *coa;
1745 	boolean_t	checkonly;
1746 	udp_stack_t	*us = udp->udp_us;
1747 
1748 	switch (optset_context) {
1749 	case SETFN_OPTCOM_CHECKONLY:
1750 		checkonly = B_TRUE;
1751 		/*
1752 		 * Note: Implies T_CHECK semantics for T_OPTCOM_REQ
1753 		 * inlen != 0 implies value supplied and
1754 		 * 	we have to "pretend" to set it.
1755 		 * inlen == 0 implies that there is no
1756 		 * 	value part in T_CHECK request and just validation
1757 		 * done elsewhere should be enough, we just return here.
1758 		 */
1759 		if (inlen == 0) {
1760 			*outlenp = 0;
1761 			return (0);
1762 		}
1763 		break;
1764 	case SETFN_OPTCOM_NEGOTIATE:
1765 		checkonly = B_FALSE;
1766 		break;
1767 	case SETFN_UD_NEGOTIATE:
1768 	case SETFN_CONN_NEGOTIATE:
1769 		checkonly = B_FALSE;
1770 		/*
1771 		 * Negotiating local and "association-related" options
1772 		 * through T_UNITDATA_REQ.
1773 		 *
1774 		 * Following routine can filter out ones we do not
1775 		 * want to be "set" this way.
1776 		 */
1777 		if (!udp_opt_allow_udr_set(level, name)) {
1778 			*outlenp = 0;
1779 			return (EINVAL);
1780 		}
1781 		break;
1782 	default:
1783 		/*
1784 		 * We should never get here
1785 		 */
1786 		*outlenp = 0;
1787 		return (EINVAL);
1788 	}
1789 
1790 	ASSERT((optset_context != SETFN_OPTCOM_CHECKONLY) ||
1791 	    (optset_context == SETFN_OPTCOM_CHECKONLY && inlen != 0));
1792 
1793 	if (thisdg_attrs != NULL) {
1794 		/* Options from T_UNITDATA_REQ */
1795 		coa = (conn_opt_arg_t *)thisdg_attrs;
1796 		ASSERT(coa->coa_connp == connp);
1797 		ASSERT(coa->coa_ixa != NULL);
1798 		ASSERT(coa->coa_ipp != NULL);
1799 		ASSERT(coa->coa_ancillary);
1800 	} else {
1801 		coa = &coas;
1802 		coas.coa_connp = connp;
1803 		/* Get a reference on conn_ixa to prevent concurrent mods */
1804 		coas.coa_ixa = conn_get_ixa(connp, B_TRUE);
1805 		if (coas.coa_ixa == NULL) {
1806 			*outlenp = 0;
1807 			return (ENOMEM);
1808 		}
1809 		coas.coa_ipp = &connp->conn_xmit_ipp;
1810 		coas.coa_ancillary = B_FALSE;
1811 		coas.coa_changed = 0;
1812 	}
1813 
1814 	err = udp_do_opt_set(coa, level, name, inlen, invalp,
1815 	    cr, checkonly);
1816 	if (err != 0) {
1817 errout:
1818 		if (!coa->coa_ancillary)
1819 			ixa_refrele(coa->coa_ixa);
1820 		*outlenp = 0;
1821 		return (err);
1822 	}
1823 	/* Handle DHCPINIT here outside of lock */
1824 	if (level == IPPROTO_IP && name == IP_DHCPINIT_IF) {
1825 		uint_t	ifindex;
1826 		ill_t	*ill;
1827 
1828 		ifindex = *(uint_t *)invalp;
1829 		if (ifindex == 0) {
1830 			ill = NULL;
1831 		} else {
1832 			ill = ill_lookup_on_ifindex(ifindex, B_FALSE,
1833 			    coa->coa_ixa->ixa_ipst);
1834 			if (ill == NULL) {
1835 				err = ENXIO;
1836 				goto errout;
1837 			}
1838 
1839 			mutex_enter(&ill->ill_lock);
1840 			if (ill->ill_state_flags & ILL_CONDEMNED) {
1841 				mutex_exit(&ill->ill_lock);
1842 				ill_refrele(ill);
1843 				err = ENXIO;
1844 				goto errout;
1845 			}
1846 			if (IS_VNI(ill)) {
1847 				mutex_exit(&ill->ill_lock);
1848 				ill_refrele(ill);
1849 				err = EINVAL;
1850 				goto errout;
1851 			}
1852 		}
1853 		mutex_enter(&connp->conn_lock);
1854 
1855 		if (connp->conn_dhcpinit_ill != NULL) {
1856 			/*
1857 			 * We've locked the conn so conn_cleanup_ill()
1858 			 * cannot clear conn_dhcpinit_ill -- so it's
1859 			 * safe to access the ill.
1860 			 */
1861 			ill_t *oill = connp->conn_dhcpinit_ill;
1862 
1863 			ASSERT(oill->ill_dhcpinit != 0);
1864 			atomic_dec_32(&oill->ill_dhcpinit);
1865 			ill_set_inputfn(connp->conn_dhcpinit_ill);
1866 			connp->conn_dhcpinit_ill = NULL;
1867 		}
1868 
1869 		if (ill != NULL) {
1870 			connp->conn_dhcpinit_ill = ill;
1871 			atomic_inc_32(&ill->ill_dhcpinit);
1872 			ill_set_inputfn(ill);
1873 			mutex_exit(&connp->conn_lock);
1874 			mutex_exit(&ill->ill_lock);
1875 			ill_refrele(ill);
1876 		} else {
1877 			mutex_exit(&connp->conn_lock);
1878 		}
1879 	}
1880 
1881 	/*
1882 	 * Common case of OK return with outval same as inval.
1883 	 */
1884 	if (invalp != outvalp) {
1885 		/* don't trust bcopy for identical src/dst */
1886 		(void) bcopy(invalp, outvalp, inlen);
1887 	}
1888 	*outlenp = inlen;
1889 
1890 	/*
1891 	 * If this was not ancillary data, then we rebuild the headers,
1892 	 * update the IRE/NCE, and IPsec as needed.
1893 	 * Since the label depends on the destination we go through
1894 	 * ip_set_destination first.
1895 	 */
1896 	if (coa->coa_ancillary) {
1897 		return (0);
1898 	}
1899 
1900 	if (coa->coa_changed & COA_ROUTE_CHANGED) {
1901 		in6_addr_t saddr, faddr, nexthop;
1902 		in_port_t fport;
1903 
1904 		/*
1905 		 * We clear lastdst to make sure we pick up the change
1906 		 * next time sending.
1907 		 * If we are connected we re-cache the information.
1908 		 * We ignore errors to preserve BSD behavior.
1909 		 * Note that we don't redo IPsec policy lookup here
1910 		 * since the final destination (or source) didn't change.
1911 		 */
1912 		mutex_enter(&connp->conn_lock);
1913 		connp->conn_v6lastdst = ipv6_all_zeros;
1914 
1915 		ip_attr_nexthop(coa->coa_ipp, coa->coa_ixa,
1916 		    &connp->conn_faddr_v6, &nexthop);
1917 		saddr = connp->conn_saddr_v6;
1918 		faddr = connp->conn_faddr_v6;
1919 		fport = connp->conn_fport;
1920 		mutex_exit(&connp->conn_lock);
1921 
1922 		if (!IN6_IS_ADDR_UNSPECIFIED(&faddr) &&
1923 		    !IN6_IS_ADDR_V4MAPPED_ANY(&faddr)) {
1924 			(void) ip_attr_connect(connp, coa->coa_ixa,
1925 			    &saddr, &faddr, &nexthop, fport, NULL, NULL,
1926 			    IPDF_ALLOW_MCBC | IPDF_VERIFY_DST);
1927 		}
1928 	}
1929 
1930 	ixa_refrele(coa->coa_ixa);
1931 
1932 	if (coa->coa_changed & COA_HEADER_CHANGED) {
1933 		/*
1934 		 * Rebuild the header template if we are connected.
1935 		 * Otherwise clear conn_v6lastdst so we rebuild the header
1936 		 * in the data path.
1937 		 */
1938 		mutex_enter(&connp->conn_lock);
1939 		if (!IN6_IS_ADDR_UNSPECIFIED(&connp->conn_faddr_v6) &&
1940 		    !IN6_IS_ADDR_V4MAPPED_ANY(&connp->conn_faddr_v6)) {
1941 			err = udp_build_hdr_template(connp,
1942 			    &connp->conn_saddr_v6, &connp->conn_faddr_v6,
1943 			    connp->conn_fport, connp->conn_flowinfo);
1944 			if (err != 0) {
1945 				mutex_exit(&connp->conn_lock);
1946 				return (err);
1947 			}
1948 		} else {
1949 			connp->conn_v6lastdst = ipv6_all_zeros;
1950 		}
1951 		mutex_exit(&connp->conn_lock);
1952 	}
1953 	if (coa->coa_changed & COA_RCVBUF_CHANGED) {
1954 		(void) proto_set_rx_hiwat(connp->conn_rq, connp,
1955 		    connp->conn_rcvbuf);
1956 	}
1957 	if ((coa->coa_changed & COA_SNDBUF_CHANGED) && !IPCL_IS_NONSTR(connp)) {
1958 		connp->conn_wq->q_hiwat = connp->conn_sndbuf;
1959 	}
1960 	if (coa->coa_changed & COA_WROFF_CHANGED) {
1961 		/* Increase wroff if needed */
1962 		uint_t wroff;
1963 
1964 		mutex_enter(&connp->conn_lock);
1965 		wroff = connp->conn_ht_iphc_allocated + us->us_wroff_extra;
1966 		if (udp->udp_nat_t_endpoint)
1967 			wroff += sizeof (uint32_t);
1968 		if (wroff > connp->conn_wroff) {
1969 			connp->conn_wroff = wroff;
1970 			mutex_exit(&connp->conn_lock);
1971 			(void) proto_set_tx_wroff(connp->conn_rq, connp, wroff);
1972 		} else {
1973 			mutex_exit(&connp->conn_lock);
1974 		}
1975 	}
1976 	return (err);
1977 }
1978 
1979 /* This routine sets socket options. */
1980 int
1981 udp_tpi_opt_set(queue_t *q, uint_t optset_context, int level, int name,
1982     uint_t inlen, uchar_t *invalp, uint_t *outlenp, uchar_t *outvalp,
1983     void *thisdg_attrs, cred_t *cr)
1984 {
1985 	conn_t	*connp = Q_TO_CONN(q);
1986 	int error;
1987 
1988 	error = udp_opt_set(connp, optset_context, level, name, inlen, invalp,
1989 	    outlenp, outvalp, thisdg_attrs, cr);
1990 	return (error);
1991 }
1992 
1993 /*
1994  * Setup IP and UDP headers.
1995  * Returns NULL on allocation failure, in which case data_mp is freed.
1996  */
1997 mblk_t *
1998 udp_prepend_hdr(conn_t *connp, ip_xmit_attr_t *ixa, const ip_pkt_t *ipp,
1999     const in6_addr_t *v6src, const in6_addr_t *v6dst, in_port_t dstport,
2000     uint32_t flowinfo, mblk_t *data_mp, int *errorp)
2001 {
2002 	mblk_t		*mp;
2003 	udpha_t		*udpha;
2004 	udp_stack_t	*us = connp->conn_netstack->netstack_udp;
2005 	uint_t		data_len;
2006 	uint32_t	cksum;
2007 	udp_t		*udp = connp->conn_udp;
2008 	boolean_t	insert_spi = udp->udp_nat_t_endpoint;
2009 	uint_t		ulp_hdr_len;
2010 
2011 	data_len = msgdsize(data_mp);
2012 	ulp_hdr_len = UDPH_SIZE;
2013 	if (insert_spi)
2014 		ulp_hdr_len += sizeof (uint32_t);
2015 
2016 	mp = conn_prepend_hdr(ixa, ipp, v6src, v6dst, IPPROTO_UDP, flowinfo,
2017 	    ulp_hdr_len, data_mp, data_len, us->us_wroff_extra, &cksum, errorp);
2018 	if (mp == NULL) {
2019 		ASSERT(*errorp != 0);
2020 		return (NULL);
2021 	}
2022 
2023 	data_len += ulp_hdr_len;
2024 	ixa->ixa_pktlen = data_len + ixa->ixa_ip_hdr_length;
2025 
2026 	udpha = (udpha_t *)(mp->b_rptr + ixa->ixa_ip_hdr_length);
2027 	udpha->uha_src_port = connp->conn_lport;
2028 	udpha->uha_dst_port = dstport;
2029 	udpha->uha_checksum = 0;
2030 	udpha->uha_length = htons(data_len);
2031 
2032 	/*
2033 	 * If there was a routing option/header then conn_prepend_hdr
2034 	 * has massaged it and placed the pseudo-header checksum difference
2035 	 * in the cksum argument.
2036 	 *
2037 	 * Setup header length and prepare for ULP checksum done in IP.
2038 	 *
2039 	 * We make it easy for IP to include our pseudo header
2040 	 * by putting our length in uha_checksum.
2041 	 * The IP source, destination, and length have already been set by
2042 	 * conn_prepend_hdr.
2043 	 */
2044 	cksum += data_len;
2045 	cksum = (cksum >> 16) + (cksum & 0xFFFF);
2046 	ASSERT(cksum < 0x10000);
2047 
2048 	if (ixa->ixa_flags & IXAF_IS_IPV4) {
2049 		ipha_t	*ipha = (ipha_t *)mp->b_rptr;
2050 
2051 		ASSERT(ntohs(ipha->ipha_length) == ixa->ixa_pktlen);
2052 
2053 		/* IP does the checksum if uha_checksum is non-zero */
2054 		if (us->us_do_checksum) {
2055 			if (cksum == 0)
2056 				udpha->uha_checksum = 0xffff;
2057 			else
2058 				udpha->uha_checksum = htons(cksum);
2059 		} else {
2060 			udpha->uha_checksum = 0;
2061 		}
2062 	} else {
2063 		ip6_t *ip6h = (ip6_t *)mp->b_rptr;
2064 
2065 		ASSERT(ntohs(ip6h->ip6_plen) + IPV6_HDR_LEN == ixa->ixa_pktlen);
2066 		if (cksum == 0)
2067 			udpha->uha_checksum = 0xffff;
2068 		else
2069 			udpha->uha_checksum = htons(cksum);
2070 	}
2071 
2072 	/* Insert all-0s SPI now. */
2073 	if (insert_spi)
2074 		*((uint32_t *)(udpha + 1)) = 0;
2075 
2076 	return (mp);
2077 }
2078 
2079 static int
2080 udp_build_hdr_template(conn_t *connp, const in6_addr_t *v6src,
2081     const in6_addr_t *v6dst, in_port_t dstport, uint32_t flowinfo)
2082 {
2083 	udpha_t		*udpha;
2084 	int		error;
2085 
2086 	ASSERT(MUTEX_HELD(&connp->conn_lock));
2087 	/*
2088 	 * We clear lastdst to make sure we don't use the lastdst path
2089 	 * next time sending since we might not have set v6dst yet.
2090 	 */
2091 	connp->conn_v6lastdst = ipv6_all_zeros;
2092 
2093 	error = conn_build_hdr_template(connp, UDPH_SIZE, 0, v6src, v6dst,
2094 	    flowinfo);
2095 	if (error != 0)
2096 		return (error);
2097 
2098 	/*
2099 	 * Any routing header/option has been massaged. The checksum difference
2100 	 * is stored in conn_sum.
2101 	 */
2102 	udpha = (udpha_t *)connp->conn_ht_ulp;
2103 	udpha->uha_src_port = connp->conn_lport;
2104 	udpha->uha_dst_port = dstport;
2105 	udpha->uha_checksum = 0;
2106 	udpha->uha_length = htons(UDPH_SIZE);	/* Filled in later */
2107 	return (0);
2108 }
2109 
2110 static mblk_t *
2111 udp_queue_fallback(udp_t *udp, mblk_t *mp)
2112 {
2113 	ASSERT(MUTEX_HELD(&udp->udp_recv_lock));
2114 	if (IPCL_IS_NONSTR(udp->udp_connp)) {
2115 		/*
2116 		 * fallback has started but messages have not been moved yet
2117 		 */
2118 		if (udp->udp_fallback_queue_head == NULL) {
2119 			ASSERT(udp->udp_fallback_queue_tail == NULL);
2120 			udp->udp_fallback_queue_head = mp;
2121 			udp->udp_fallback_queue_tail = mp;
2122 		} else {
2123 			ASSERT(udp->udp_fallback_queue_tail != NULL);
2124 			udp->udp_fallback_queue_tail->b_next = mp;
2125 			udp->udp_fallback_queue_tail = mp;
2126 		}
2127 		return (NULL);
2128 	} else {
2129 		/*
2130 		 * Fallback completed, let the caller putnext() the mblk.
2131 		 */
2132 		return (mp);
2133 	}
2134 }
2135 
2136 /*
2137  * Deliver data to ULP. In case we have a socket, and it's falling back to
2138  * TPI, then we'll queue the mp for later processing.
2139  */
2140 static void
2141 udp_ulp_recv(conn_t *connp, mblk_t *mp, uint_t len, ip_recv_attr_t *ira)
2142 {
2143 	if (IPCL_IS_NONSTR(connp)) {
2144 		udp_t *udp = connp->conn_udp;
2145 		int error;
2146 
2147 		ASSERT(len == msgdsize(mp));
2148 		if ((*connp->conn_upcalls->su_recv)
2149 		    (connp->conn_upper_handle, mp, len, 0, &error, NULL) < 0) {
2150 			mutex_enter(&udp->udp_recv_lock);
2151 			if (error == ENOSPC) {
2152 				/*
2153 				 * let's confirm while holding the lock
2154 				 */
2155 				if ((*connp->conn_upcalls->su_recv)
2156 				    (connp->conn_upper_handle, NULL, 0, 0,
2157 				    &error, NULL) < 0) {
2158 					ASSERT(error == ENOSPC);
2159 					if (error == ENOSPC) {
2160 						connp->conn_flow_cntrld =
2161 						    B_TRUE;
2162 					}
2163 				}
2164 				mutex_exit(&udp->udp_recv_lock);
2165 			} else {
2166 				ASSERT(error == EOPNOTSUPP);
2167 				mp = udp_queue_fallback(udp, mp);
2168 				mutex_exit(&udp->udp_recv_lock);
2169 				if (mp != NULL)
2170 					putnext(connp->conn_rq, mp);
2171 			}
2172 		}
2173 		ASSERT(MUTEX_NOT_HELD(&udp->udp_recv_lock));
2174 	} else {
2175 		if (is_system_labeled()) {
2176 			ASSERT(ira->ira_cred != NULL);
2177 			/*
2178 			 * Provide for protocols above UDP such as RPC
2179 			 * NOPID leaves db_cpid unchanged.
2180 			 */
2181 			mblk_setcred(mp, ira->ira_cred, NOPID);
2182 		}
2183 
2184 		putnext(connp->conn_rq, mp);
2185 	}
2186 }
2187 
2188 /*
2189  * This is the inbound data path.
2190  * IP has already pulled up the IP plus UDP headers and verified alignment
2191  * etc.
2192  */
2193 /* ARGSUSED2 */
2194 static void
2195 udp_input(void *arg1, mblk_t *mp, void *arg2, ip_recv_attr_t *ira)
2196 {
2197 	conn_t			*connp = (conn_t *)arg1;
2198 	struct T_unitdata_ind	*tudi;
2199 	uchar_t			*rptr;		/* Pointer to IP header */
2200 	int			hdr_length;	/* Length of IP+UDP headers */
2201 	int			udi_size;	/* Size of T_unitdata_ind */
2202 	int			pkt_len;
2203 	udp_t			*udp;
2204 	udpha_t			*udpha;
2205 	ip_pkt_t		ipps;
2206 	ip6_t			*ip6h;
2207 	mblk_t			*mp1;
2208 	uint32_t		udp_ipv4_options_len;
2209 	crb_t			recv_ancillary;
2210 	udp_stack_t		*us;
2211 
2212 	ASSERT(connp->conn_flags & IPCL_UDPCONN);
2213 
2214 	udp = connp->conn_udp;
2215 	us = udp->udp_us;
2216 	rptr = mp->b_rptr;
2217 
2218 	ASSERT(DB_TYPE(mp) == M_DATA);
2219 	ASSERT(OK_32PTR(rptr));
2220 	ASSERT(ira->ira_pktlen == msgdsize(mp));
2221 	pkt_len = ira->ira_pktlen;
2222 
2223 	/*
2224 	 * Get a snapshot of these and allow other threads to change
2225 	 * them after that. We need the same recv_ancillary when determining
2226 	 * the size as when adding the ancillary data items.
2227 	 */
2228 	mutex_enter(&connp->conn_lock);
2229 	udp_ipv4_options_len = udp->udp_recv_ipp.ipp_ipv4_options_len;
2230 	recv_ancillary = connp->conn_recv_ancillary;
2231 	mutex_exit(&connp->conn_lock);
2232 
2233 	hdr_length = ira->ira_ip_hdr_length;
2234 
2235 	/*
2236 	 * IP inspected the UDP header thus all of it must be in the mblk.
2237 	 * UDP length check is performed for IPv6 packets and IPv4 packets
2238 	 * to check if the size of the packet as specified
2239 	 * by the UDP header is the same as the length derived from the IP
2240 	 * header.
2241 	 */
2242 	udpha = (udpha_t *)(rptr + hdr_length);
2243 	if (pkt_len != ntohs(udpha->uha_length) + hdr_length)
2244 		goto tossit;
2245 
2246 	hdr_length += UDPH_SIZE;
2247 	ASSERT(MBLKL(mp) >= hdr_length);	/* IP did a pullup */
2248 
2249 	/* Initialize regardless of IP version */
2250 	ipps.ipp_fields = 0;
2251 
2252 	if (((ira->ira_flags & IRAF_IPV4_OPTIONS) ||
2253 	    udp_ipv4_options_len > 0) &&
2254 	    connp->conn_family == AF_INET) {
2255 		int	err;
2256 
2257 		/*
2258 		 * Record/update udp_recv_ipp with the lock
2259 		 * held. Not needed for AF_INET6 sockets
2260 		 * since they don't support a getsockopt of IP_OPTIONS.
2261 		 */
2262 		mutex_enter(&connp->conn_lock);
2263 		err = ip_find_hdr_v4((ipha_t *)rptr, &udp->udp_recv_ipp,
2264 		    B_TRUE);
2265 		if (err != 0) {
2266 			/* Allocation failed. Drop packet */
2267 			mutex_exit(&connp->conn_lock);
2268 			freemsg(mp);
2269 			BUMP_MIB(&us->us_udp_mib, udpInErrors);
2270 			return;
2271 		}
2272 		mutex_exit(&connp->conn_lock);
2273 	}
2274 
2275 	if (recv_ancillary.crb_all != 0) {
2276 		/*
2277 		 * Record packet information in the ip_pkt_t
2278 		 */
2279 		if (ira->ira_flags & IRAF_IS_IPV4) {
2280 			ASSERT(IPH_HDR_VERSION(rptr) == IPV4_VERSION);
2281 			ASSERT(MBLKL(mp) >= sizeof (ipha_t));
2282 			ASSERT(((ipha_t *)rptr)->ipha_protocol == IPPROTO_UDP);
2283 			ASSERT(ira->ira_ip_hdr_length == IPH_HDR_LENGTH(rptr));
2284 
2285 			(void) ip_find_hdr_v4((ipha_t *)rptr, &ipps, B_FALSE);
2286 		} else {
2287 			uint8_t nexthdrp;
2288 
2289 			ASSERT(IPH_HDR_VERSION(rptr) == IPV6_VERSION);
2290 			/*
2291 			 * IPv6 packets can only be received by applications
2292 			 * that are prepared to receive IPv6 addresses.
2293 			 * The IP fanout must ensure this.
2294 			 */
2295 			ASSERT(connp->conn_family == AF_INET6);
2296 
2297 			ip6h = (ip6_t *)rptr;
2298 
2299 			/* We don't care about the length, but need the ipp */
2300 			hdr_length = ip_find_hdr_v6(mp, ip6h, B_TRUE, &ipps,
2301 			    &nexthdrp);
2302 			ASSERT(hdr_length == ira->ira_ip_hdr_length);
2303 			/* Restore */
2304 			hdr_length = ira->ira_ip_hdr_length + UDPH_SIZE;
2305 			ASSERT(nexthdrp == IPPROTO_UDP);
2306 		}
2307 	}
2308 
2309 	/*
2310 	 * This is the inbound data path.  Packets are passed upstream as
2311 	 * T_UNITDATA_IND messages.
2312 	 */
2313 	if (connp->conn_family == AF_INET) {
2314 		sin_t *sin;
2315 
2316 		ASSERT(IPH_HDR_VERSION((ipha_t *)rptr) == IPV4_VERSION);
2317 
2318 		/*
2319 		 * Normally only send up the source address.
2320 		 * If any ancillary data items are wanted we add those.
2321 		 */
2322 		udi_size = sizeof (struct T_unitdata_ind) + sizeof (sin_t);
2323 		if (recv_ancillary.crb_all != 0) {
2324 			udi_size += conn_recvancillary_size(connp,
2325 			    recv_ancillary, ira, mp, &ipps);
2326 		}
2327 
2328 		/* Allocate a message block for the T_UNITDATA_IND structure. */
2329 		mp1 = allocb(udi_size, BPRI_MED);
2330 		if (mp1 == NULL) {
2331 			freemsg(mp);
2332 			BUMP_MIB(&us->us_udp_mib, udpInErrors);
2333 			return;
2334 		}
2335 		mp1->b_cont = mp;
2336 		mp1->b_datap->db_type = M_PROTO;
2337 		tudi = (struct T_unitdata_ind *)mp1->b_rptr;
2338 		mp1->b_wptr = (uchar_t *)tudi + udi_size;
2339 		tudi->PRIM_type = T_UNITDATA_IND;
2340 		tudi->SRC_length = sizeof (sin_t);
2341 		tudi->SRC_offset = sizeof (struct T_unitdata_ind);
2342 		tudi->OPT_offset = sizeof (struct T_unitdata_ind) +
2343 		    sizeof (sin_t);
2344 		udi_size -= (sizeof (struct T_unitdata_ind) + sizeof (sin_t));
2345 		tudi->OPT_length = udi_size;
2346 		sin = (sin_t *)&tudi[1];
2347 		sin->sin_addr.s_addr = ((ipha_t *)rptr)->ipha_src;
2348 		sin->sin_port =	udpha->uha_src_port;
2349 		sin->sin_family = connp->conn_family;
2350 		*(uint32_t *)&sin->sin_zero[0] = 0;
2351 		*(uint32_t *)&sin->sin_zero[4] = 0;
2352 
2353 		/*
2354 		 * Add options if IP_RECVDSTADDR, IP_RECVIF, IP_RECVSLLA or
2355 		 * IP_RECVTTL has been set.
2356 		 */
2357 		if (udi_size != 0) {
2358 			conn_recvancillary_add(connp, recv_ancillary, ira,
2359 			    &ipps, (uchar_t *)&sin[1], udi_size);
2360 		}
2361 	} else {
2362 		sin6_t *sin6;
2363 
2364 		/*
2365 		 * Handle both IPv4 and IPv6 packets for IPv6 sockets.
2366 		 *
2367 		 * Normally we only send up the address. If receiving of any
2368 		 * optional receive side information is enabled, we also send
2369 		 * that up as options.
2370 		 */
2371 		udi_size = sizeof (struct T_unitdata_ind) + sizeof (sin6_t);
2372 
2373 		if (recv_ancillary.crb_all != 0) {
2374 			udi_size += conn_recvancillary_size(connp,
2375 			    recv_ancillary, ira, mp, &ipps);
2376 		}
2377 
2378 		mp1 = allocb(udi_size, BPRI_MED);
2379 		if (mp1 == NULL) {
2380 			freemsg(mp);
2381 			BUMP_MIB(&us->us_udp_mib, udpInErrors);
2382 			return;
2383 		}
2384 		mp1->b_cont = mp;
2385 		mp1->b_datap->db_type = M_PROTO;
2386 		tudi = (struct T_unitdata_ind *)mp1->b_rptr;
2387 		mp1->b_wptr = (uchar_t *)tudi + udi_size;
2388 		tudi->PRIM_type = T_UNITDATA_IND;
2389 		tudi->SRC_length = sizeof (sin6_t);
2390 		tudi->SRC_offset = sizeof (struct T_unitdata_ind);
2391 		tudi->OPT_offset = sizeof (struct T_unitdata_ind) +
2392 		    sizeof (sin6_t);
2393 		udi_size -= (sizeof (struct T_unitdata_ind) + sizeof (sin6_t));
2394 		tudi->OPT_length = udi_size;
2395 		sin6 = (sin6_t *)&tudi[1];
2396 		if (ira->ira_flags & IRAF_IS_IPV4) {
2397 			in6_addr_t v6dst;
2398 
2399 			IN6_IPADDR_TO_V4MAPPED(((ipha_t *)rptr)->ipha_src,
2400 			    &sin6->sin6_addr);
2401 			IN6_IPADDR_TO_V4MAPPED(((ipha_t *)rptr)->ipha_dst,
2402 			    &v6dst);
2403 			sin6->sin6_flowinfo = 0;
2404 			sin6->sin6_scope_id = 0;
2405 			sin6->__sin6_src_id = ip_srcid_find_addr(&v6dst,
2406 			    IPCL_ZONEID(connp), us->us_netstack);
2407 		} else {
2408 			ip6h = (ip6_t *)rptr;
2409 
2410 			sin6->sin6_addr = ip6h->ip6_src;
2411 			/* No sin6_flowinfo per API */
2412 			sin6->sin6_flowinfo = 0;
2413 			/* For link-scope pass up scope id */
2414 			if (IN6_IS_ADDR_LINKSCOPE(&ip6h->ip6_src))
2415 				sin6->sin6_scope_id = ira->ira_ruifindex;
2416 			else
2417 				sin6->sin6_scope_id = 0;
2418 			sin6->__sin6_src_id = ip_srcid_find_addr(
2419 			    &ip6h->ip6_dst, IPCL_ZONEID(connp),
2420 			    us->us_netstack);
2421 		}
2422 		sin6->sin6_port = udpha->uha_src_port;
2423 		sin6->sin6_family = connp->conn_family;
2424 
2425 		if (udi_size != 0) {
2426 			conn_recvancillary_add(connp, recv_ancillary, ira,
2427 			    &ipps, (uchar_t *)&sin6[1], udi_size);
2428 		}
2429 	}
2430 
2431 	/* Walk past the headers unless IP_RECVHDR was set. */
2432 	if (!udp->udp_rcvhdr) {
2433 		mp->b_rptr = rptr + hdr_length;
2434 		pkt_len -= hdr_length;
2435 	}
2436 
2437 	BUMP_MIB(&us->us_udp_mib, udpHCInDatagrams);
2438 	udp_ulp_recv(connp, mp1, pkt_len, ira);
2439 	return;
2440 
2441 tossit:
2442 	freemsg(mp);
2443 	BUMP_MIB(&us->us_udp_mib, udpInErrors);
2444 }
2445 
2446 /*
2447  * return SNMP stuff in buffer in mpdata. We don't hold any lock and report
2448  * information that can be changing beneath us.
2449  */
2450 mblk_t *
2451 udp_snmp_get(queue_t *q, mblk_t *mpctl)
2452 {
2453 	mblk_t			*mpdata;
2454 	mblk_t			*mp_conn_ctl;
2455 	mblk_t			*mp_attr_ctl;
2456 	mblk_t			*mp6_conn_ctl;
2457 	mblk_t			*mp6_attr_ctl;
2458 	mblk_t			*mp_conn_tail;
2459 	mblk_t			*mp_attr_tail;
2460 	mblk_t			*mp6_conn_tail;
2461 	mblk_t			*mp6_attr_tail;
2462 	struct opthdr		*optp;
2463 	mib2_udpEntry_t		ude;
2464 	mib2_udp6Entry_t	ude6;
2465 	mib2_transportMLPEntry_t mlp;
2466 	int			state;
2467 	zoneid_t		zoneid;
2468 	int			i;
2469 	connf_t			*connfp;
2470 	conn_t			*connp = Q_TO_CONN(q);
2471 	int			v4_conn_idx;
2472 	int			v6_conn_idx;
2473 	boolean_t		needattr;
2474 	udp_t			*udp;
2475 	ip_stack_t		*ipst = connp->conn_netstack->netstack_ip;
2476 	udp_stack_t		*us = connp->conn_netstack->netstack_udp;
2477 	mblk_t			*mp2ctl;
2478 
2479 	/*
2480 	 * make a copy of the original message
2481 	 */
2482 	mp2ctl = copymsg(mpctl);
2483 
2484 	mp_conn_ctl = mp_attr_ctl = mp6_conn_ctl = NULL;
2485 	if (mpctl == NULL ||
2486 	    (mpdata = mpctl->b_cont) == NULL ||
2487 	    (mp_conn_ctl = copymsg(mpctl)) == NULL ||
2488 	    (mp_attr_ctl = copymsg(mpctl)) == NULL ||
2489 	    (mp6_conn_ctl = copymsg(mpctl)) == NULL ||
2490 	    (mp6_attr_ctl = copymsg(mpctl)) == NULL) {
2491 		freemsg(mp_conn_ctl);
2492 		freemsg(mp_attr_ctl);
2493 		freemsg(mp6_conn_ctl);
2494 		freemsg(mpctl);
2495 		freemsg(mp2ctl);
2496 		return (0);
2497 	}
2498 
2499 	zoneid = connp->conn_zoneid;
2500 
2501 	/* fixed length structure for IPv4 and IPv6 counters */
2502 	SET_MIB(us->us_udp_mib.udpEntrySize, sizeof (mib2_udpEntry_t));
2503 	SET_MIB(us->us_udp_mib.udp6EntrySize, sizeof (mib2_udp6Entry_t));
2504 	/* synchronize 64- and 32-bit counters */
2505 	SYNC32_MIB(&us->us_udp_mib, udpInDatagrams, udpHCInDatagrams);
2506 	SYNC32_MIB(&us->us_udp_mib, udpOutDatagrams, udpHCOutDatagrams);
2507 
2508 	optp = (struct opthdr *)&mpctl->b_rptr[sizeof (struct T_optmgmt_ack)];
2509 	optp->level = MIB2_UDP;
2510 	optp->name = 0;
2511 	(void) snmp_append_data(mpdata, (char *)&us->us_udp_mib,
2512 	    sizeof (us->us_udp_mib));
2513 	optp->len = msgdsize(mpdata);
2514 	qreply(q, mpctl);
2515 
2516 	mp_conn_tail = mp_attr_tail = mp6_conn_tail = mp6_attr_tail = NULL;
2517 	v4_conn_idx = v6_conn_idx = 0;
2518 
2519 	for (i = 0; i < CONN_G_HASH_SIZE; i++) {
2520 		connfp = &ipst->ips_ipcl_globalhash_fanout[i];
2521 		connp = NULL;
2522 
2523 		while ((connp = ipcl_get_next_conn(connfp, connp,
2524 		    IPCL_UDPCONN))) {
2525 			udp = connp->conn_udp;
2526 			if (zoneid != connp->conn_zoneid)
2527 				continue;
2528 
2529 			/*
2530 			 * Note that the port numbers are sent in
2531 			 * host byte order
2532 			 */
2533 
2534 			if (udp->udp_state == TS_UNBND)
2535 				state = MIB2_UDP_unbound;
2536 			else if (udp->udp_state == TS_IDLE)
2537 				state = MIB2_UDP_idle;
2538 			else if (udp->udp_state == TS_DATA_XFER)
2539 				state = MIB2_UDP_connected;
2540 			else
2541 				state = MIB2_UDP_unknown;
2542 
2543 			needattr = B_FALSE;
2544 			bzero(&mlp, sizeof (mlp));
2545 			if (connp->conn_mlp_type != mlptSingle) {
2546 				if (connp->conn_mlp_type == mlptShared ||
2547 				    connp->conn_mlp_type == mlptBoth)
2548 					mlp.tme_flags |= MIB2_TMEF_SHARED;
2549 				if (connp->conn_mlp_type == mlptPrivate ||
2550 				    connp->conn_mlp_type == mlptBoth)
2551 					mlp.tme_flags |= MIB2_TMEF_PRIVATE;
2552 				needattr = B_TRUE;
2553 			}
2554 			if (connp->conn_anon_mlp) {
2555 				mlp.tme_flags |= MIB2_TMEF_ANONMLP;
2556 				needattr = B_TRUE;
2557 			}
2558 			switch (connp->conn_mac_mode) {
2559 			case CONN_MAC_DEFAULT:
2560 				break;
2561 			case CONN_MAC_AWARE:
2562 				mlp.tme_flags |= MIB2_TMEF_MACEXEMPT;
2563 				needattr = B_TRUE;
2564 				break;
2565 			case CONN_MAC_IMPLICIT:
2566 				mlp.tme_flags |= MIB2_TMEF_MACIMPLICIT;
2567 				needattr = B_TRUE;
2568 				break;
2569 			}
2570 			mutex_enter(&connp->conn_lock);
2571 			if (udp->udp_state == TS_DATA_XFER &&
2572 			    connp->conn_ixa->ixa_tsl != NULL) {
2573 				ts_label_t *tsl;
2574 
2575 				tsl = connp->conn_ixa->ixa_tsl;
2576 				mlp.tme_flags |= MIB2_TMEF_IS_LABELED;
2577 				mlp.tme_doi = label2doi(tsl);
2578 				mlp.tme_label = *label2bslabel(tsl);
2579 				needattr = B_TRUE;
2580 			}
2581 			mutex_exit(&connp->conn_lock);
2582 
2583 			/*
2584 			 * Create an IPv4 table entry for IPv4 entries and also
2585 			 * any IPv6 entries which are bound to in6addr_any
2586 			 * (i.e. anything a IPv4 peer could connect/send to).
2587 			 */
2588 			if (connp->conn_ipversion == IPV4_VERSION ||
2589 			    (udp->udp_state <= TS_IDLE &&
2590 			    IN6_IS_ADDR_UNSPECIFIED(&connp->conn_laddr_v6))) {
2591 				ude.udpEntryInfo.ue_state = state;
2592 				/*
2593 				 * If in6addr_any this will set it to
2594 				 * INADDR_ANY
2595 				 */
2596 				ude.udpLocalAddress = connp->conn_laddr_v4;
2597 				ude.udpLocalPort = ntohs(connp->conn_lport);
2598 				if (udp->udp_state == TS_DATA_XFER) {
2599 					/*
2600 					 * Can potentially get here for
2601 					 * v6 socket if another process
2602 					 * (say, ping) has just done a
2603 					 * sendto(), changing the state
2604 					 * from the TS_IDLE above to
2605 					 * TS_DATA_XFER by the time we hit
2606 					 * this part of the code.
2607 					 */
2608 					ude.udpEntryInfo.ue_RemoteAddress =
2609 					    connp->conn_faddr_v4;
2610 					ude.udpEntryInfo.ue_RemotePort =
2611 					    ntohs(connp->conn_fport);
2612 				} else {
2613 					ude.udpEntryInfo.ue_RemoteAddress = 0;
2614 					ude.udpEntryInfo.ue_RemotePort = 0;
2615 				}
2616 
2617 				/*
2618 				 * We make the assumption that all udp_t
2619 				 * structs will be created within an address
2620 				 * region no larger than 32-bits.
2621 				 */
2622 				ude.udpInstance = (uint32_t)(uintptr_t)udp;
2623 				ude.udpCreationProcess =
2624 				    (connp->conn_cpid < 0) ?
2625 				    MIB2_UNKNOWN_PROCESS :
2626 				    connp->conn_cpid;
2627 				ude.udpCreationTime = connp->conn_open_time;
2628 
2629 				(void) snmp_append_data2(mp_conn_ctl->b_cont,
2630 				    &mp_conn_tail, (char *)&ude, sizeof (ude));
2631 				mlp.tme_connidx = v4_conn_idx++;
2632 				if (needattr)
2633 					(void) snmp_append_data2(
2634 					    mp_attr_ctl->b_cont, &mp_attr_tail,
2635 					    (char *)&mlp, sizeof (mlp));
2636 			}
2637 			if (connp->conn_ipversion == IPV6_VERSION) {
2638 				ude6.udp6EntryInfo.ue_state  = state;
2639 				ude6.udp6LocalAddress = connp->conn_laddr_v6;
2640 				ude6.udp6LocalPort = ntohs(connp->conn_lport);
2641 				mutex_enter(&connp->conn_lock);
2642 				if (connp->conn_ixa->ixa_flags &
2643 				    IXAF_SCOPEID_SET) {
2644 					ude6.udp6IfIndex =
2645 					    connp->conn_ixa->ixa_scopeid;
2646 				} else {
2647 					ude6.udp6IfIndex = connp->conn_bound_if;
2648 				}
2649 				mutex_exit(&connp->conn_lock);
2650 				if (udp->udp_state == TS_DATA_XFER) {
2651 					ude6.udp6EntryInfo.ue_RemoteAddress =
2652 					    connp->conn_faddr_v6;
2653 					ude6.udp6EntryInfo.ue_RemotePort =
2654 					    ntohs(connp->conn_fport);
2655 				} else {
2656 					ude6.udp6EntryInfo.ue_RemoteAddress =
2657 					    sin6_null.sin6_addr;
2658 					ude6.udp6EntryInfo.ue_RemotePort = 0;
2659 				}
2660 				/*
2661 				 * We make the assumption that all udp_t
2662 				 * structs will be created within an address
2663 				 * region no larger than 32-bits.
2664 				 */
2665 				ude6.udp6Instance = (uint32_t)(uintptr_t)udp;
2666 				ude6.udp6CreationProcess =
2667 				    (connp->conn_cpid < 0) ?
2668 				    MIB2_UNKNOWN_PROCESS :
2669 				    connp->conn_cpid;
2670 				ude6.udp6CreationTime = connp->conn_open_time;
2671 
2672 				(void) snmp_append_data2(mp6_conn_ctl->b_cont,
2673 				    &mp6_conn_tail, (char *)&ude6,
2674 				    sizeof (ude6));
2675 				mlp.tme_connidx = v6_conn_idx++;
2676 				if (needattr)
2677 					(void) snmp_append_data2(
2678 					    mp6_attr_ctl->b_cont,
2679 					    &mp6_attr_tail, (char *)&mlp,
2680 					    sizeof (mlp));
2681 			}
2682 		}
2683 	}
2684 
2685 	/* IPv4 UDP endpoints */
2686 	optp = (struct opthdr *)&mp_conn_ctl->b_rptr[
2687 	    sizeof (struct T_optmgmt_ack)];
2688 	optp->level = MIB2_UDP;
2689 	optp->name = MIB2_UDP_ENTRY;
2690 	optp->len = msgdsize(mp_conn_ctl->b_cont);
2691 	qreply(q, mp_conn_ctl);
2692 
2693 	/* table of MLP attributes... */
2694 	optp = (struct opthdr *)&mp_attr_ctl->b_rptr[
2695 	    sizeof (struct T_optmgmt_ack)];
2696 	optp->level = MIB2_UDP;
2697 	optp->name = EXPER_XPORT_MLP;
2698 	optp->len = msgdsize(mp_attr_ctl->b_cont);
2699 	if (optp->len == 0)
2700 		freemsg(mp_attr_ctl);
2701 	else
2702 		qreply(q, mp_attr_ctl);
2703 
2704 	/* IPv6 UDP endpoints */
2705 	optp = (struct opthdr *)&mp6_conn_ctl->b_rptr[
2706 	    sizeof (struct T_optmgmt_ack)];
2707 	optp->level = MIB2_UDP6;
2708 	optp->name = MIB2_UDP6_ENTRY;
2709 	optp->len = msgdsize(mp6_conn_ctl->b_cont);
2710 	qreply(q, mp6_conn_ctl);
2711 
2712 	/* table of MLP attributes... */
2713 	optp = (struct opthdr *)&mp6_attr_ctl->b_rptr[
2714 	    sizeof (struct T_optmgmt_ack)];
2715 	optp->level = MIB2_UDP6;
2716 	optp->name = EXPER_XPORT_MLP;
2717 	optp->len = msgdsize(mp6_attr_ctl->b_cont);
2718 	if (optp->len == 0)
2719 		freemsg(mp6_attr_ctl);
2720 	else
2721 		qreply(q, mp6_attr_ctl);
2722 
2723 	return (mp2ctl);
2724 }
2725 
2726 /*
2727  * Return 0 if invalid set request, 1 otherwise, including non-udp requests.
2728  * NOTE: Per MIB-II, UDP has no writable data.
2729  * TODO:  If this ever actually tries to set anything, it needs to be
2730  * to do the appropriate locking.
2731  */
2732 /* ARGSUSED */
2733 int
2734 udp_snmp_set(queue_t *q, t_scalar_t level, t_scalar_t name,
2735     uchar_t *ptr, int len)
2736 {
2737 	switch (level) {
2738 	case MIB2_UDP:
2739 		return (0);
2740 	default:
2741 		return (1);
2742 	}
2743 }
2744 
2745 /*
2746  * This routine creates a T_UDERROR_IND message and passes it upstream.
2747  * The address and options are copied from the T_UNITDATA_REQ message
2748  * passed in mp.  This message is freed.
2749  */
2750 static void
2751 udp_ud_err(queue_t *q, mblk_t *mp, t_scalar_t err)
2752 {
2753 	struct T_unitdata_req *tudr;
2754 	mblk_t	*mp1;
2755 	uchar_t *destaddr;
2756 	t_scalar_t destlen;
2757 	uchar_t	*optaddr;
2758 	t_scalar_t optlen;
2759 
2760 	if ((mp->b_wptr < mp->b_rptr) ||
2761 	    (MBLKL(mp)) < sizeof (struct T_unitdata_req)) {
2762 		goto done;
2763 	}
2764 	tudr = (struct T_unitdata_req *)mp->b_rptr;
2765 	destaddr = mp->b_rptr + tudr->DEST_offset;
2766 	if (destaddr < mp->b_rptr || destaddr >= mp->b_wptr ||
2767 	    destaddr + tudr->DEST_length < mp->b_rptr ||
2768 	    destaddr + tudr->DEST_length > mp->b_wptr) {
2769 		goto done;
2770 	}
2771 	optaddr = mp->b_rptr + tudr->OPT_offset;
2772 	if (optaddr < mp->b_rptr || optaddr >= mp->b_wptr ||
2773 	    optaddr + tudr->OPT_length < mp->b_rptr ||
2774 	    optaddr + tudr->OPT_length > mp->b_wptr) {
2775 		goto done;
2776 	}
2777 	destlen = tudr->DEST_length;
2778 	optlen = tudr->OPT_length;
2779 
2780 	mp1 = mi_tpi_uderror_ind((char *)destaddr, destlen,
2781 	    (char *)optaddr, optlen, err);
2782 	if (mp1 != NULL)
2783 		qreply(q, mp1);
2784 
2785 done:
2786 	freemsg(mp);
2787 }
2788 
2789 /*
2790  * This routine removes a port number association from a stream.  It
2791  * is called by udp_wput to handle T_UNBIND_REQ messages.
2792  */
2793 static void
2794 udp_tpi_unbind(queue_t *q, mblk_t *mp)
2795 {
2796 	conn_t	*connp = Q_TO_CONN(q);
2797 	int	error;
2798 
2799 	error = udp_do_unbind(connp);
2800 	if (error) {
2801 		if (error < 0)
2802 			udp_err_ack(q, mp, -error, 0);
2803 		else
2804 			udp_err_ack(q, mp, TSYSERR, error);
2805 		return;
2806 	}
2807 
2808 	mp = mi_tpi_ok_ack_alloc(mp);
2809 	ASSERT(mp != NULL);
2810 	ASSERT(((struct T_ok_ack *)mp->b_rptr)->PRIM_type == T_OK_ACK);
2811 	qreply(q, mp);
2812 }
2813 
2814 /*
2815  * Don't let port fall into the privileged range.
2816  * Since the extra privileged ports can be arbitrary we also
2817  * ensure that we exclude those from consideration.
2818  * us->us_epriv_ports is not sorted thus we loop over it until
2819  * there are no changes.
2820  */
2821 static in_port_t
2822 udp_update_next_port(udp_t *udp, in_port_t port, boolean_t random)
2823 {
2824 	int i;
2825 	in_port_t nextport;
2826 	boolean_t restart = B_FALSE;
2827 	udp_stack_t *us = udp->udp_us;
2828 
2829 	if (random && udp_random_anon_port != 0) {
2830 		(void) random_get_pseudo_bytes((uint8_t *)&port,
2831 		    sizeof (in_port_t));
2832 		/*
2833 		 * Unless changed by a sys admin, the smallest anon port
2834 		 * is 32768 and the largest anon port is 65535.  It is
2835 		 * very likely (50%) for the random port to be smaller
2836 		 * than the smallest anon port.  When that happens,
2837 		 * add port % (anon port range) to the smallest anon
2838 		 * port to get the random port.  It should fall into the
2839 		 * valid anon port range.
2840 		 */
2841 		if (port < us->us_smallest_anon_port) {
2842 			port = us->us_smallest_anon_port +
2843 			    port % (us->us_largest_anon_port -
2844 			    us->us_smallest_anon_port);
2845 		}
2846 	}
2847 
2848 retry:
2849 	if (port < us->us_smallest_anon_port)
2850 		port = us->us_smallest_anon_port;
2851 
2852 	if (port > us->us_largest_anon_port) {
2853 		port = us->us_smallest_anon_port;
2854 		if (restart)
2855 			return (0);
2856 		restart = B_TRUE;
2857 	}
2858 
2859 	if (port < us->us_smallest_nonpriv_port)
2860 		port = us->us_smallest_nonpriv_port;
2861 
2862 	for (i = 0; i < us->us_num_epriv_ports; i++) {
2863 		if (port == us->us_epriv_ports[i]) {
2864 			port++;
2865 			/*
2866 			 * Make sure that the port is in the
2867 			 * valid range.
2868 			 */
2869 			goto retry;
2870 		}
2871 	}
2872 
2873 	if (is_system_labeled() &&
2874 	    (nextport = tsol_next_port(crgetzone(udp->udp_connp->conn_cred),
2875 	    port, IPPROTO_UDP, B_TRUE)) != 0) {
2876 		port = nextport;
2877 		goto retry;
2878 	}
2879 
2880 	return (port);
2881 }
2882 
2883 /*
2884  * Handle T_UNITDATA_REQ with options. Both IPv4 and IPv6
2885  * Either tudr_mp or msg is set. If tudr_mp we take ancillary data from
2886  * the TPI options, otherwise we take them from msg_control.
2887  * If both sin and sin6 is set it is a connected socket and we use conn_faddr.
2888  * Always consumes mp; never consumes tudr_mp.
2889  */
2890 static int
2891 udp_output_ancillary(conn_t *connp, sin_t *sin, sin6_t *sin6, mblk_t *mp,
2892     mblk_t *tudr_mp, struct nmsghdr *msg, cred_t *cr, pid_t pid)
2893 {
2894 	udp_t		*udp = connp->conn_udp;
2895 	udp_stack_t	*us = udp->udp_us;
2896 	int		error;
2897 	ip_xmit_attr_t	*ixa;
2898 	ip_pkt_t	*ipp;
2899 	in6_addr_t	v6src;
2900 	in6_addr_t	v6dst;
2901 	in6_addr_t	v6nexthop;
2902 	in_port_t	dstport;
2903 	uint32_t	flowinfo;
2904 	uint_t		srcid;
2905 	int		is_absreq_failure = 0;
2906 	conn_opt_arg_t	coas, *coa;
2907 
2908 	ASSERT(tudr_mp != NULL || msg != NULL);
2909 
2910 	/*
2911 	 * Get ixa before checking state to handle a disconnect race.
2912 	 *
2913 	 * We need an exclusive copy of conn_ixa since the ancillary data
2914 	 * options might modify it. That copy has no pointers hence we
2915 	 * need to set them up once we've parsed the ancillary data.
2916 	 */
2917 	ixa = conn_get_ixa_exclusive(connp);
2918 	if (ixa == NULL) {
2919 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
2920 		freemsg(mp);
2921 		return (ENOMEM);
2922 	}
2923 	ASSERT(cr != NULL);
2924 	ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
2925 	ixa->ixa_cred = cr;
2926 	ixa->ixa_cpid = pid;
2927 	if (is_system_labeled()) {
2928 		/* We need to restart with a label based on the cred */
2929 		ip_xmit_attr_restore_tsl(ixa, ixa->ixa_cred);
2930 	}
2931 
2932 	/* In case previous destination was multicast or multirt */
2933 	ip_attr_newdst(ixa);
2934 
2935 	/* Get a copy of conn_xmit_ipp since the options might change it */
2936 	ipp = kmem_zalloc(sizeof (*ipp), KM_NOSLEEP);
2937 	if (ipp == NULL) {
2938 		ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
2939 		ixa->ixa_cred = connp->conn_cred;	/* Restore */
2940 		ixa->ixa_cpid = connp->conn_cpid;
2941 		ixa_refrele(ixa);
2942 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
2943 		freemsg(mp);
2944 		return (ENOMEM);
2945 	}
2946 	mutex_enter(&connp->conn_lock);
2947 	error = ip_pkt_copy(&connp->conn_xmit_ipp, ipp, KM_NOSLEEP);
2948 	mutex_exit(&connp->conn_lock);
2949 	if (error != 0) {
2950 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
2951 		freemsg(mp);
2952 		goto done;
2953 	}
2954 
2955 	/*
2956 	 * Parse the options and update ixa and ipp as a result.
2957 	 * Note that ixa_tsl can be updated if SCM_UCRED.
2958 	 * ixa_refrele/ixa_inactivate will release any reference on ixa_tsl.
2959 	 */
2960 
2961 	coa = &coas;
2962 	coa->coa_connp = connp;
2963 	coa->coa_ixa = ixa;
2964 	coa->coa_ipp = ipp;
2965 	coa->coa_ancillary = B_TRUE;
2966 	coa->coa_changed = 0;
2967 
2968 	if (msg != NULL) {
2969 		error = process_auxiliary_options(connp, msg->msg_control,
2970 		    msg->msg_controllen, coa, &udp_opt_obj, udp_opt_set, cr);
2971 	} else {
2972 		struct T_unitdata_req *tudr;
2973 
2974 		tudr = (struct T_unitdata_req *)tudr_mp->b_rptr;
2975 		ASSERT(tudr->PRIM_type == T_UNITDATA_REQ);
2976 		error = tpi_optcom_buf(connp->conn_wq, tudr_mp,
2977 		    &tudr->OPT_length, tudr->OPT_offset, cr, &udp_opt_obj,
2978 		    coa, &is_absreq_failure);
2979 	}
2980 	if (error != 0) {
2981 		/*
2982 		 * Note: No special action needed in this
2983 		 * module for "is_absreq_failure"
2984 		 */
2985 		freemsg(mp);
2986 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
2987 		goto done;
2988 	}
2989 	ASSERT(is_absreq_failure == 0);
2990 
2991 	mutex_enter(&connp->conn_lock);
2992 	/*
2993 	 * If laddr is unspecified then we look at sin6_src_id.
2994 	 * We will give precedence to a source address set with IPV6_PKTINFO
2995 	 * (aka IPPF_ADDR) but that is handled in build_hdrs. However, we don't
2996 	 * want ip_attr_connect to select a source (since it can fail) when
2997 	 * IPV6_PKTINFO is specified.
2998 	 * If this doesn't result in a source address then we get a source
2999 	 * from ip_attr_connect() below.
3000 	 */
3001 	v6src = connp->conn_saddr_v6;
3002 	if (sin != NULL) {
3003 		IN6_IPADDR_TO_V4MAPPED(sin->sin_addr.s_addr, &v6dst);
3004 		dstport = sin->sin_port;
3005 		flowinfo = 0;
3006 		ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
3007 		ixa->ixa_flags |= IXAF_IS_IPV4;
3008 	} else if (sin6 != NULL) {
3009 		v6dst = sin6->sin6_addr;
3010 		dstport = sin6->sin6_port;
3011 		flowinfo = sin6->sin6_flowinfo;
3012 		srcid = sin6->__sin6_src_id;
3013 		if (IN6_IS_ADDR_LINKSCOPE(&v6dst) && sin6->sin6_scope_id != 0) {
3014 			ixa->ixa_scopeid = sin6->sin6_scope_id;
3015 			ixa->ixa_flags |= IXAF_SCOPEID_SET;
3016 		} else {
3017 			ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
3018 		}
3019 		if (srcid != 0 && IN6_IS_ADDR_UNSPECIFIED(&v6src)) {
3020 			ip_srcid_find_id(srcid, &v6src, IPCL_ZONEID(connp),
3021 			    connp->conn_netstack);
3022 		}
3023 		if (IN6_IS_ADDR_V4MAPPED(&v6dst))
3024 			ixa->ixa_flags |= IXAF_IS_IPV4;
3025 		else
3026 			ixa->ixa_flags &= ~IXAF_IS_IPV4;
3027 	} else {
3028 		/* Connected case */
3029 		v6dst = connp->conn_faddr_v6;
3030 		dstport = connp->conn_fport;
3031 		flowinfo = connp->conn_flowinfo;
3032 	}
3033 	mutex_exit(&connp->conn_lock);
3034 
3035 	/* Handle IPV6_PKTINFO setting source address. */
3036 	if (IN6_IS_ADDR_UNSPECIFIED(&v6src) &&
3037 	    (ipp->ipp_fields & IPPF_ADDR)) {
3038 		if (ixa->ixa_flags & IXAF_IS_IPV4) {
3039 			if (IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
3040 				v6src = ipp->ipp_addr;
3041 		} else {
3042 			if (!IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
3043 				v6src = ipp->ipp_addr;
3044 		}
3045 	}
3046 
3047 	ip_attr_nexthop(ipp, ixa, &v6dst, &v6nexthop);
3048 	error = ip_attr_connect(connp, ixa, &v6src, &v6dst, &v6nexthop, dstport,
3049 	    &v6src, NULL, IPDF_ALLOW_MCBC | IPDF_VERIFY_DST | IPDF_IPSEC);
3050 
3051 	switch (error) {
3052 	case 0:
3053 		break;
3054 	case EADDRNOTAVAIL:
3055 		/*
3056 		 * IXAF_VERIFY_SOURCE tells us to pick a better source.
3057 		 * Don't have the application see that errno
3058 		 */
3059 		error = ENETUNREACH;
3060 		goto failed;
3061 	case ENETDOWN:
3062 		/*
3063 		 * Have !ipif_addr_ready address; drop packet silently
3064 		 * until we can get applications to not send until we
3065 		 * are ready.
3066 		 */
3067 		error = 0;
3068 		goto failed;
3069 	case EHOSTUNREACH:
3070 	case ENETUNREACH:
3071 		if (ixa->ixa_ire != NULL) {
3072 			/*
3073 			 * Let conn_ip_output/ire_send_noroute return
3074 			 * the error and send any local ICMP error.
3075 			 */
3076 			error = 0;
3077 			break;
3078 		}
3079 		/* FALLTHRU */
3080 	default:
3081 	failed:
3082 		freemsg(mp);
3083 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3084 		goto done;
3085 	}
3086 
3087 	/*
3088 	 * We might be going to a different destination than last time,
3089 	 * thus check that TX allows the communication and compute any
3090 	 * needed label.
3091 	 *
3092 	 * TSOL Note: We have an exclusive ipp and ixa for this thread so we
3093 	 * don't have to worry about concurrent threads.
3094 	 */
3095 	if (is_system_labeled()) {
3096 		/* Using UDP MLP requires SCM_UCRED from user */
3097 		if (connp->conn_mlp_type != mlptSingle &&
3098 		    !((ixa->ixa_flags & IXAF_UCRED_TSL))) {
3099 			BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3100 			error = ECONNREFUSED;
3101 			freemsg(mp);
3102 			goto done;
3103 		}
3104 		/*
3105 		 * Check whether Trusted Solaris policy allows communication
3106 		 * with this host, and pretend that the destination is
3107 		 * unreachable if not.
3108 		 * Compute any needed label and place it in ipp_label_v4/v6.
3109 		 *
3110 		 * Later conn_build_hdr_template/conn_prepend_hdr takes
3111 		 * ipp_label_v4/v6 to form the packet.
3112 		 *
3113 		 * Tsol note: We have ipp structure local to this thread so
3114 		 * no locking is needed.
3115 		 */
3116 		error = conn_update_label(connp, ixa, &v6dst, ipp);
3117 		if (error != 0) {
3118 			freemsg(mp);
3119 			BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3120 			goto done;
3121 		}
3122 	}
3123 	mp = udp_prepend_hdr(connp, ixa, ipp, &v6src, &v6dst, dstport,
3124 	    flowinfo, mp, &error);
3125 	if (mp == NULL) {
3126 		ASSERT(error != 0);
3127 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3128 		goto done;
3129 	}
3130 	if (ixa->ixa_pktlen > IP_MAXPACKET) {
3131 		error = EMSGSIZE;
3132 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3133 		freemsg(mp);
3134 		goto done;
3135 	}
3136 	/* We're done.  Pass the packet to ip. */
3137 	BUMP_MIB(&us->us_udp_mib, udpHCOutDatagrams);
3138 
3139 	error = conn_ip_output(mp, ixa);
3140 	/* No udpOutErrors if an error since IP increases its error counter */
3141 	switch (error) {
3142 	case 0:
3143 		break;
3144 	case EWOULDBLOCK:
3145 		(void) ixa_check_drain_insert(connp, ixa);
3146 		error = 0;
3147 		break;
3148 	case EADDRNOTAVAIL:
3149 		/*
3150 		 * IXAF_VERIFY_SOURCE tells us to pick a better source.
3151 		 * Don't have the application see that errno
3152 		 */
3153 		error = ENETUNREACH;
3154 		/* FALLTHRU */
3155 	default:
3156 		mutex_enter(&connp->conn_lock);
3157 		/*
3158 		 * Clear the source and v6lastdst so we call ip_attr_connect
3159 		 * for the next packet and try to pick a better source.
3160 		 */
3161 		if (connp->conn_mcbc_bind)
3162 			connp->conn_saddr_v6 = ipv6_all_zeros;
3163 		else
3164 			connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
3165 		connp->conn_v6lastdst = ipv6_all_zeros;
3166 		mutex_exit(&connp->conn_lock);
3167 		break;
3168 	}
3169 done:
3170 	ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
3171 	ixa->ixa_cred = connp->conn_cred;	/* Restore */
3172 	ixa->ixa_cpid = connp->conn_cpid;
3173 	ixa_refrele(ixa);
3174 	ip_pkt_free(ipp);
3175 	kmem_free(ipp, sizeof (*ipp));
3176 	return (error);
3177 }
3178 
3179 /*
3180  * Handle sending an M_DATA for a connected socket.
3181  * Handles both IPv4 and IPv6.
3182  */
3183 static int
3184 udp_output_connected(conn_t *connp, mblk_t *mp, cred_t *cr, pid_t pid)
3185 {
3186 	udp_t		*udp = connp->conn_udp;
3187 	udp_stack_t	*us = udp->udp_us;
3188 	int		error;
3189 	ip_xmit_attr_t	*ixa;
3190 
3191 	/*
3192 	 * If no other thread is using conn_ixa this just gets a reference to
3193 	 * conn_ixa. Otherwise we get a safe copy of conn_ixa.
3194 	 */
3195 	ixa = conn_get_ixa(connp, B_FALSE);
3196 	if (ixa == NULL) {
3197 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3198 		freemsg(mp);
3199 		return (ENOMEM);
3200 	}
3201 
3202 	ASSERT(cr != NULL);
3203 	ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
3204 	ixa->ixa_cred = cr;
3205 	ixa->ixa_cpid = pid;
3206 
3207 	mutex_enter(&connp->conn_lock);
3208 	mp = udp_prepend_header_template(connp, ixa, mp, &connp->conn_saddr_v6,
3209 	    connp->conn_fport, connp->conn_flowinfo, &error);
3210 
3211 	if (mp == NULL) {
3212 		ASSERT(error != 0);
3213 		mutex_exit(&connp->conn_lock);
3214 		ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
3215 		ixa->ixa_cred = connp->conn_cred;	/* Restore */
3216 		ixa->ixa_cpid = connp->conn_cpid;
3217 		ixa_refrele(ixa);
3218 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3219 		freemsg(mp);
3220 		return (error);
3221 	}
3222 
3223 	/*
3224 	 * In case we got a safe copy of conn_ixa, or if opt_set made us a new
3225 	 * safe copy, then we need to fill in any pointers in it.
3226 	 */
3227 	if (ixa->ixa_ire == NULL) {
3228 		in6_addr_t	faddr, saddr;
3229 		in6_addr_t	nexthop;
3230 		in_port_t	fport;
3231 
3232 		saddr = connp->conn_saddr_v6;
3233 		faddr = connp->conn_faddr_v6;
3234 		fport = connp->conn_fport;
3235 		ip_attr_nexthop(&connp->conn_xmit_ipp, ixa, &faddr, &nexthop);
3236 		mutex_exit(&connp->conn_lock);
3237 
3238 		error = ip_attr_connect(connp, ixa, &saddr, &faddr, &nexthop,
3239 		    fport, NULL, NULL, IPDF_ALLOW_MCBC | IPDF_VERIFY_DST |
3240 		    IPDF_IPSEC);
3241 		switch (error) {
3242 		case 0:
3243 			break;
3244 		case EADDRNOTAVAIL:
3245 			/*
3246 			 * IXAF_VERIFY_SOURCE tells us to pick a better source.
3247 			 * Don't have the application see that errno
3248 			 */
3249 			error = ENETUNREACH;
3250 			goto failed;
3251 		case ENETDOWN:
3252 			/*
3253 			 * Have !ipif_addr_ready address; drop packet silently
3254 			 * until we can get applications to not send until we
3255 			 * are ready.
3256 			 */
3257 			error = 0;
3258 			goto failed;
3259 		case EHOSTUNREACH:
3260 		case ENETUNREACH:
3261 			if (ixa->ixa_ire != NULL) {
3262 				/*
3263 				 * Let conn_ip_output/ire_send_noroute return
3264 				 * the error and send any local ICMP error.
3265 				 */
3266 				error = 0;
3267 				break;
3268 			}
3269 			/* FALLTHRU */
3270 		default:
3271 		failed:
3272 			ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
3273 			ixa->ixa_cred = connp->conn_cred;	/* Restore */
3274 			ixa->ixa_cpid = connp->conn_cpid;
3275 			ixa_refrele(ixa);
3276 			freemsg(mp);
3277 			BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3278 			return (error);
3279 		}
3280 	} else {
3281 		/* Done with conn_t */
3282 		mutex_exit(&connp->conn_lock);
3283 	}
3284 	ASSERT(ixa->ixa_ire != NULL);
3285 
3286 	/* We're done.  Pass the packet to ip. */
3287 	BUMP_MIB(&us->us_udp_mib, udpHCOutDatagrams);
3288 
3289 	error = conn_ip_output(mp, ixa);
3290 	/* No udpOutErrors if an error since IP increases its error counter */
3291 	switch (error) {
3292 	case 0:
3293 		break;
3294 	case EWOULDBLOCK:
3295 		(void) ixa_check_drain_insert(connp, ixa);
3296 		error = 0;
3297 		break;
3298 	case EADDRNOTAVAIL:
3299 		/*
3300 		 * IXAF_VERIFY_SOURCE tells us to pick a better source.
3301 		 * Don't have the application see that errno
3302 		 */
3303 		error = ENETUNREACH;
3304 		break;
3305 	}
3306 	ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
3307 	ixa->ixa_cred = connp->conn_cred;	/* Restore */
3308 	ixa->ixa_cpid = connp->conn_cpid;
3309 	ixa_refrele(ixa);
3310 	return (error);
3311 }
3312 
3313 /*
3314  * Handle sending an M_DATA to the last destination.
3315  * Handles both IPv4 and IPv6.
3316  *
3317  * NOTE: The caller must hold conn_lock and we drop it here.
3318  */
3319 static int
3320 udp_output_lastdst(conn_t *connp, mblk_t *mp, cred_t *cr, pid_t pid,
3321     ip_xmit_attr_t *ixa)
3322 {
3323 	udp_t		*udp = connp->conn_udp;
3324 	udp_stack_t	*us = udp->udp_us;
3325 	int		error;
3326 
3327 	ASSERT(MUTEX_HELD(&connp->conn_lock));
3328 	ASSERT(ixa != NULL);
3329 
3330 	ASSERT(cr != NULL);
3331 	ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
3332 	ixa->ixa_cred = cr;
3333 	ixa->ixa_cpid = pid;
3334 
3335 	mp = udp_prepend_header_template(connp, ixa, mp, &connp->conn_v6lastsrc,
3336 	    connp->conn_lastdstport, connp->conn_lastflowinfo, &error);
3337 
3338 	if (mp == NULL) {
3339 		ASSERT(error != 0);
3340 		mutex_exit(&connp->conn_lock);
3341 		ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
3342 		ixa->ixa_cred = connp->conn_cred;	/* Restore */
3343 		ixa->ixa_cpid = connp->conn_cpid;
3344 		ixa_refrele(ixa);
3345 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3346 		freemsg(mp);
3347 		return (error);
3348 	}
3349 
3350 	/*
3351 	 * In case we got a safe copy of conn_ixa, or if opt_set made us a new
3352 	 * safe copy, then we need to fill in any pointers in it.
3353 	 */
3354 	if (ixa->ixa_ire == NULL) {
3355 		in6_addr_t	lastdst, lastsrc;
3356 		in6_addr_t	nexthop;
3357 		in_port_t	lastport;
3358 
3359 		lastsrc = connp->conn_v6lastsrc;
3360 		lastdst = connp->conn_v6lastdst;
3361 		lastport = connp->conn_lastdstport;
3362 		ip_attr_nexthop(&connp->conn_xmit_ipp, ixa, &lastdst, &nexthop);
3363 		mutex_exit(&connp->conn_lock);
3364 
3365 		error = ip_attr_connect(connp, ixa, &lastsrc, &lastdst,
3366 		    &nexthop, lastport, NULL, NULL, IPDF_ALLOW_MCBC |
3367 		    IPDF_VERIFY_DST | IPDF_IPSEC);
3368 		switch (error) {
3369 		case 0:
3370 			break;
3371 		case EADDRNOTAVAIL:
3372 			/*
3373 			 * IXAF_VERIFY_SOURCE tells us to pick a better source.
3374 			 * Don't have the application see that errno
3375 			 */
3376 			error = ENETUNREACH;
3377 			goto failed;
3378 		case ENETDOWN:
3379 			/*
3380 			 * Have !ipif_addr_ready address; drop packet silently
3381 			 * until we can get applications to not send until we
3382 			 * are ready.
3383 			 */
3384 			error = 0;
3385 			goto failed;
3386 		case EHOSTUNREACH:
3387 		case ENETUNREACH:
3388 			if (ixa->ixa_ire != NULL) {
3389 				/*
3390 				 * Let conn_ip_output/ire_send_noroute return
3391 				 * the error and send any local ICMP error.
3392 				 */
3393 				error = 0;
3394 				break;
3395 			}
3396 			/* FALLTHRU */
3397 		default:
3398 		failed:
3399 			ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
3400 			ixa->ixa_cred = connp->conn_cred;	/* Restore */
3401 			ixa->ixa_cpid = connp->conn_cpid;
3402 			ixa_refrele(ixa);
3403 			freemsg(mp);
3404 			BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3405 			return (error);
3406 		}
3407 	} else {
3408 		/* Done with conn_t */
3409 		mutex_exit(&connp->conn_lock);
3410 	}
3411 
3412 	/* We're done.  Pass the packet to ip. */
3413 	BUMP_MIB(&us->us_udp_mib, udpHCOutDatagrams);
3414 
3415 	error = conn_ip_output(mp, ixa);
3416 	/* No udpOutErrors if an error since IP increases its error counter */
3417 	switch (error) {
3418 	case 0:
3419 		break;
3420 	case EWOULDBLOCK:
3421 		(void) ixa_check_drain_insert(connp, ixa);
3422 		error = 0;
3423 		break;
3424 	case EADDRNOTAVAIL:
3425 		/*
3426 		 * IXAF_VERIFY_SOURCE tells us to pick a better source.
3427 		 * Don't have the application see that errno
3428 		 */
3429 		error = ENETUNREACH;
3430 		/* FALLTHRU */
3431 	default:
3432 		mutex_enter(&connp->conn_lock);
3433 		/*
3434 		 * Clear the source and v6lastdst so we call ip_attr_connect
3435 		 * for the next packet and try to pick a better source.
3436 		 */
3437 		if (connp->conn_mcbc_bind)
3438 			connp->conn_saddr_v6 = ipv6_all_zeros;
3439 		else
3440 			connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
3441 		connp->conn_v6lastdst = ipv6_all_zeros;
3442 		mutex_exit(&connp->conn_lock);
3443 		break;
3444 	}
3445 	ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
3446 	ixa->ixa_cred = connp->conn_cred;	/* Restore */
3447 	ixa->ixa_cpid = connp->conn_cpid;
3448 	ixa_refrele(ixa);
3449 	return (error);
3450 }
3451 
3452 
3453 /*
3454  * Prepend the header template and then fill in the source and
3455  * flowinfo. The caller needs to handle the destination address since
3456  * it's setting is different if rthdr or source route.
3457  *
3458  * Returns NULL is allocation failed or if the packet would exceed IP_MAXPACKET.
3459  * When it returns NULL it sets errorp.
3460  */
3461 static mblk_t *
3462 udp_prepend_header_template(conn_t *connp, ip_xmit_attr_t *ixa, mblk_t *mp,
3463     const in6_addr_t *v6src, in_port_t dstport, uint32_t flowinfo, int *errorp)
3464 {
3465 	udp_t		*udp = connp->conn_udp;
3466 	udp_stack_t	*us = udp->udp_us;
3467 	boolean_t	insert_spi = udp->udp_nat_t_endpoint;
3468 	uint_t		pktlen;
3469 	uint_t		alloclen;
3470 	uint_t		copylen;
3471 	uint8_t		*iph;
3472 	uint_t		ip_hdr_length;
3473 	udpha_t		*udpha;
3474 	uint32_t	cksum;
3475 	ip_pkt_t	*ipp;
3476 
3477 	ASSERT(MUTEX_HELD(&connp->conn_lock));
3478 
3479 	/*
3480 	 * Copy the header template and leave space for an SPI
3481 	 */
3482 	copylen = connp->conn_ht_iphc_len;
3483 	alloclen = copylen + (insert_spi ? sizeof (uint32_t) : 0);
3484 	pktlen = alloclen + msgdsize(mp);
3485 	if (pktlen > IP_MAXPACKET) {
3486 		freemsg(mp);
3487 		*errorp = EMSGSIZE;
3488 		return (NULL);
3489 	}
3490 	ixa->ixa_pktlen = pktlen;
3491 
3492 	/* check/fix buffer config, setup pointers into it */
3493 	iph = mp->b_rptr - alloclen;
3494 	if (DB_REF(mp) != 1 || iph < DB_BASE(mp) || !OK_32PTR(iph)) {
3495 		mblk_t *mp1;
3496 
3497 		mp1 = allocb(alloclen + us->us_wroff_extra, BPRI_MED);
3498 		if (mp1 == NULL) {
3499 			freemsg(mp);
3500 			*errorp = ENOMEM;
3501 			return (NULL);
3502 		}
3503 		mp1->b_wptr = DB_LIM(mp1);
3504 		mp1->b_cont = mp;
3505 		mp = mp1;
3506 		iph = (mp->b_wptr - alloclen);
3507 	}
3508 	mp->b_rptr = iph;
3509 	bcopy(connp->conn_ht_iphc, iph, copylen);
3510 	ip_hdr_length = (uint_t)(connp->conn_ht_ulp - connp->conn_ht_iphc);
3511 
3512 	ixa->ixa_ip_hdr_length = ip_hdr_length;
3513 	udpha = (udpha_t *)(iph + ip_hdr_length);
3514 
3515 	/*
3516 	 * Setup header length and prepare for ULP checksum done in IP.
3517 	 * udp_build_hdr_template has already massaged any routing header
3518 	 * and placed the result in conn_sum.
3519 	 *
3520 	 * We make it easy for IP to include our pseudo header
3521 	 * by putting our length in uha_checksum.
3522 	 */
3523 	cksum = pktlen - ip_hdr_length;
3524 	udpha->uha_length = htons(cksum);
3525 
3526 	cksum += connp->conn_sum;
3527 	cksum = (cksum >> 16) + (cksum & 0xFFFF);
3528 	ASSERT(cksum < 0x10000);
3529 
3530 	ipp = &connp->conn_xmit_ipp;
3531 	if (ixa->ixa_flags & IXAF_IS_IPV4) {
3532 		ipha_t	*ipha = (ipha_t *)iph;
3533 
3534 		ipha->ipha_length = htons((uint16_t)pktlen);
3535 
3536 		/* IP does the checksum if uha_checksum is non-zero */
3537 		if (us->us_do_checksum)
3538 			udpha->uha_checksum = htons(cksum);
3539 
3540 		/* if IP_PKTINFO specified an addres it wins over bind() */
3541 		if ((ipp->ipp_fields & IPPF_ADDR) &&
3542 		    IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr)) {
3543 			ASSERT(ipp->ipp_addr_v4 != INADDR_ANY);
3544 			ipha->ipha_src = ipp->ipp_addr_v4;
3545 		} else {
3546 			IN6_V4MAPPED_TO_IPADDR(v6src, ipha->ipha_src);
3547 		}
3548 	} else {
3549 		ip6_t *ip6h = (ip6_t *)iph;
3550 
3551 		ip6h->ip6_plen =  htons((uint16_t)(pktlen - IPV6_HDR_LEN));
3552 		udpha->uha_checksum = htons(cksum);
3553 
3554 		/* if IP_PKTINFO specified an addres it wins over bind() */
3555 		if ((ipp->ipp_fields & IPPF_ADDR) &&
3556 		    !IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr)) {
3557 			ASSERT(!IN6_IS_ADDR_UNSPECIFIED(&ipp->ipp_addr));
3558 			ip6h->ip6_src = ipp->ipp_addr;
3559 		} else {
3560 			ip6h->ip6_src = *v6src;
3561 		}
3562 		ip6h->ip6_vcf =
3563 		    (IPV6_DEFAULT_VERS_AND_FLOW & IPV6_VERS_AND_FLOW_MASK) |
3564 		    (flowinfo & ~IPV6_VERS_AND_FLOW_MASK);
3565 		if (ipp->ipp_fields & IPPF_TCLASS) {
3566 			/* Overrides the class part of flowinfo */
3567 			ip6h->ip6_vcf = IPV6_TCLASS_FLOW(ip6h->ip6_vcf,
3568 			    ipp->ipp_tclass);
3569 		}
3570 	}
3571 
3572 	/* Insert all-0s SPI now. */
3573 	if (insert_spi)
3574 		*((uint32_t *)(udpha + 1)) = 0;
3575 
3576 	udpha->uha_dst_port = dstport;
3577 	return (mp);
3578 }
3579 
3580 /*
3581  * Send a T_UDERR_IND in response to an M_DATA
3582  */
3583 static void
3584 udp_ud_err_connected(conn_t *connp, t_scalar_t error)
3585 {
3586 	struct sockaddr_storage ss;
3587 	sin_t		*sin;
3588 	sin6_t		*sin6;
3589 	struct sockaddr	*addr;
3590 	socklen_t	addrlen;
3591 	mblk_t		*mp1;
3592 
3593 	mutex_enter(&connp->conn_lock);
3594 	/* Initialize addr and addrlen as if they're passed in */
3595 	if (connp->conn_family == AF_INET) {
3596 		sin = (sin_t *)&ss;
3597 		*sin = sin_null;
3598 		sin->sin_family = AF_INET;
3599 		sin->sin_port = connp->conn_fport;
3600 		sin->sin_addr.s_addr = connp->conn_faddr_v4;
3601 		addr = (struct sockaddr *)sin;
3602 		addrlen = sizeof (*sin);
3603 	} else {
3604 		sin6 = (sin6_t *)&ss;
3605 		*sin6 = sin6_null;
3606 		sin6->sin6_family = AF_INET6;
3607 		sin6->sin6_port = connp->conn_fport;
3608 		sin6->sin6_flowinfo = connp->conn_flowinfo;
3609 		sin6->sin6_addr = connp->conn_faddr_v6;
3610 		if (IN6_IS_ADDR_LINKSCOPE(&connp->conn_faddr_v6) &&
3611 		    (connp->conn_ixa->ixa_flags & IXAF_SCOPEID_SET)) {
3612 			sin6->sin6_scope_id = connp->conn_ixa->ixa_scopeid;
3613 		} else {
3614 			sin6->sin6_scope_id = 0;
3615 		}
3616 		sin6->__sin6_src_id = 0;
3617 		addr = (struct sockaddr *)sin6;
3618 		addrlen = sizeof (*sin6);
3619 	}
3620 	mutex_exit(&connp->conn_lock);
3621 
3622 	mp1 = mi_tpi_uderror_ind((char *)addr, addrlen, NULL, 0, error);
3623 	if (mp1 != NULL)
3624 		putnext(connp->conn_rq, mp1);
3625 }
3626 
3627 /*
3628  * This routine handles all messages passed downstream.  It either
3629  * consumes the message or passes it downstream; it never queues a
3630  * a message.
3631  *
3632  * Also entry point for sockfs when udp is in "direct sockfs" mode.  This mode
3633  * is valid when we are directly beneath the stream head, and thus sockfs
3634  * is able to bypass STREAMS and directly call us, passing along the sockaddr
3635  * structure without the cumbersome T_UNITDATA_REQ interface for the case of
3636  * connected endpoints.
3637  */
3638 void
3639 udp_wput(queue_t *q, mblk_t *mp)
3640 {
3641 	sin6_t		*sin6;
3642 	sin_t		*sin = NULL;
3643 	uint_t		srcid;
3644 	conn_t		*connp = Q_TO_CONN(q);
3645 	udp_t		*udp = connp->conn_udp;
3646 	int		error = 0;
3647 	struct sockaddr	*addr = NULL;
3648 	socklen_t	addrlen;
3649 	udp_stack_t	*us = udp->udp_us;
3650 	struct T_unitdata_req *tudr;
3651 	mblk_t		*data_mp;
3652 	ushort_t	ipversion;
3653 	cred_t		*cr;
3654 	pid_t		pid;
3655 
3656 	/*
3657 	 * We directly handle several cases here: T_UNITDATA_REQ message
3658 	 * coming down as M_PROTO/M_PCPROTO and M_DATA messages for connected
3659 	 * socket.
3660 	 */
3661 	switch (DB_TYPE(mp)) {
3662 	case M_DATA:
3663 		if (!udp->udp_issocket || udp->udp_state != TS_DATA_XFER) {
3664 			/* Not connected; address is required */
3665 			BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3666 			UDP_DBGSTAT(us, udp_data_notconn);
3667 			UDP_STAT(us, udp_out_err_notconn);
3668 			freemsg(mp);
3669 			return;
3670 		}
3671 		/*
3672 		 * All Solaris components should pass a db_credp
3673 		 * for this message, hence we ASSERT.
3674 		 * On production kernels we return an error to be robust against
3675 		 * random streams modules sitting on top of us.
3676 		 */
3677 		cr = msg_getcred(mp, &pid);
3678 		ASSERT(cr != NULL);
3679 		if (cr == NULL) {
3680 			BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3681 			freemsg(mp);
3682 			return;
3683 		}
3684 		ASSERT(udp->udp_issocket);
3685 		UDP_DBGSTAT(us, udp_data_conn);
3686 		error = udp_output_connected(connp, mp, cr, pid);
3687 		if (error != 0) {
3688 			UDP_STAT(us, udp_out_err_output);
3689 			if (connp->conn_rq != NULL)
3690 				udp_ud_err_connected(connp, (t_scalar_t)error);
3691 #ifdef DEBUG
3692 			printf("udp_output_connected returned %d\n", error);
3693 #endif
3694 		}
3695 		return;
3696 
3697 	case M_PROTO:
3698 	case M_PCPROTO:
3699 		tudr = (struct T_unitdata_req *)mp->b_rptr;
3700 		if (MBLKL(mp) < sizeof (*tudr) ||
3701 		    ((t_primp_t)mp->b_rptr)->type != T_UNITDATA_REQ) {
3702 			udp_wput_other(q, mp);
3703 			return;
3704 		}
3705 		break;
3706 
3707 	default:
3708 		udp_wput_other(q, mp);
3709 		return;
3710 	}
3711 
3712 	/* Handle valid T_UNITDATA_REQ here */
3713 	data_mp = mp->b_cont;
3714 	if (data_mp == NULL) {
3715 		error = EPROTO;
3716 		goto ud_error2;
3717 	}
3718 	mp->b_cont = NULL;
3719 
3720 	if (!MBLKIN(mp, 0, tudr->DEST_offset + tudr->DEST_length)) {
3721 		error = EADDRNOTAVAIL;
3722 		goto ud_error2;
3723 	}
3724 
3725 	/*
3726 	 * All Solaris components should pass a db_credp
3727 	 * for this TPI message, hence we should ASSERT.
3728 	 * However, RPC (svc_clts_ksend) does this odd thing where it
3729 	 * passes the options from a T_UNITDATA_IND unchanged in a
3730 	 * T_UNITDATA_REQ. While that is the right thing to do for
3731 	 * some options, SCM_UCRED being the key one, this also makes it
3732 	 * pass down IP_RECVDSTADDR. Hence we can't ASSERT here.
3733 	 */
3734 	cr = msg_getcred(mp, &pid);
3735 	if (cr == NULL) {
3736 		cr = connp->conn_cred;
3737 		pid = connp->conn_cpid;
3738 	}
3739 
3740 	/*
3741 	 * If a port has not been bound to the stream, fail.
3742 	 * This is not a problem when sockfs is directly
3743 	 * above us, because it will ensure that the socket
3744 	 * is first bound before allowing data to be sent.
3745 	 */
3746 	if (udp->udp_state == TS_UNBND) {
3747 		error = EPROTO;
3748 		goto ud_error2;
3749 	}
3750 	addr = (struct sockaddr *)&mp->b_rptr[tudr->DEST_offset];
3751 	addrlen = tudr->DEST_length;
3752 
3753 	switch (connp->conn_family) {
3754 	case AF_INET6:
3755 		sin6 = (sin6_t *)addr;
3756 		if (!OK_32PTR((char *)sin6) || (addrlen != sizeof (sin6_t)) ||
3757 		    (sin6->sin6_family != AF_INET6)) {
3758 			error = EADDRNOTAVAIL;
3759 			goto ud_error2;
3760 		}
3761 
3762 		srcid = sin6->__sin6_src_id;
3763 		if (!IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
3764 			/*
3765 			 * Destination is a non-IPv4-compatible IPv6 address.
3766 			 * Send out an IPv6 format packet.
3767 			 */
3768 
3769 			/*
3770 			 * If the local address is a mapped address return
3771 			 * an error.
3772 			 * It would be possible to send an IPv6 packet but the
3773 			 * response would never make it back to the application
3774 			 * since it is bound to a mapped address.
3775 			 */
3776 			if (IN6_IS_ADDR_V4MAPPED(&connp->conn_saddr_v6)) {
3777 				error = EADDRNOTAVAIL;
3778 				goto ud_error2;
3779 			}
3780 
3781 			UDP_DBGSTAT(us, udp_out_ipv6);
3782 
3783 			if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))
3784 				sin6->sin6_addr = ipv6_loopback;
3785 			ipversion = IPV6_VERSION;
3786 		} else {
3787 			if (connp->conn_ipv6_v6only) {
3788 				error = EADDRNOTAVAIL;
3789 				goto ud_error2;
3790 			}
3791 
3792 			/*
3793 			 * If the local address is not zero or a mapped address
3794 			 * return an error.  It would be possible to send an
3795 			 * IPv4 packet but the response would never make it
3796 			 * back to the application since it is bound to a
3797 			 * non-mapped address.
3798 			 */
3799 			if (!IN6_IS_ADDR_V4MAPPED(&connp->conn_saddr_v6) &&
3800 			    !IN6_IS_ADDR_UNSPECIFIED(&connp->conn_saddr_v6)) {
3801 				error = EADDRNOTAVAIL;
3802 				goto ud_error2;
3803 			}
3804 			UDP_DBGSTAT(us, udp_out_mapped);
3805 
3806 			if (V4_PART_OF_V6(sin6->sin6_addr) == INADDR_ANY) {
3807 				V4_PART_OF_V6(sin6->sin6_addr) =
3808 				    htonl(INADDR_LOOPBACK);
3809 			}
3810 			ipversion = IPV4_VERSION;
3811 		}
3812 
3813 		if (tudr->OPT_length != 0) {
3814 			/*
3815 			 * If we are connected then the destination needs to be
3816 			 * the same as the connected one.
3817 			 */
3818 			if (udp->udp_state == TS_DATA_XFER &&
3819 			    !conn_same_as_last_v6(connp, sin6)) {
3820 				error = EISCONN;
3821 				goto ud_error2;
3822 			}
3823 			UDP_STAT(us, udp_out_opt);
3824 			error = udp_output_ancillary(connp, NULL, sin6,
3825 			    data_mp, mp, NULL, cr, pid);
3826 		} else {
3827 			ip_xmit_attr_t *ixa;
3828 
3829 			/*
3830 			 * We have to allocate an ip_xmit_attr_t before we grab
3831 			 * conn_lock and we need to hold conn_lock once we've
3832 			 * checked conn_same_as_last_v6 to handle concurrent
3833 			 * send* calls on a socket.
3834 			 */
3835 			ixa = conn_get_ixa(connp, B_FALSE);
3836 			if (ixa == NULL) {
3837 				error = ENOMEM;
3838 				goto ud_error2;
3839 			}
3840 			mutex_enter(&connp->conn_lock);
3841 
3842 			if (conn_same_as_last_v6(connp, sin6) &&
3843 			    connp->conn_lastsrcid == srcid &&
3844 			    ipsec_outbound_policy_current(ixa)) {
3845 				UDP_DBGSTAT(us, udp_out_lastdst);
3846 				/* udp_output_lastdst drops conn_lock */
3847 				error = udp_output_lastdst(connp, data_mp, cr,
3848 				    pid, ixa);
3849 			} else {
3850 				UDP_DBGSTAT(us, udp_out_diffdst);
3851 				/* udp_output_newdst drops conn_lock */
3852 				error = udp_output_newdst(connp, data_mp, NULL,
3853 				    sin6, ipversion, cr, pid, ixa);
3854 			}
3855 			ASSERT(MUTEX_NOT_HELD(&connp->conn_lock));
3856 		}
3857 		if (error == 0) {
3858 			freeb(mp);
3859 			return;
3860 		}
3861 		break;
3862 
3863 	case AF_INET:
3864 		sin = (sin_t *)addr;
3865 		if ((!OK_32PTR((char *)sin) || addrlen != sizeof (sin_t)) ||
3866 		    (sin->sin_family != AF_INET)) {
3867 			error = EADDRNOTAVAIL;
3868 			goto ud_error2;
3869 		}
3870 		UDP_DBGSTAT(us, udp_out_ipv4);
3871 		if (sin->sin_addr.s_addr == INADDR_ANY)
3872 			sin->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
3873 		ipversion = IPV4_VERSION;
3874 
3875 		srcid = 0;
3876 		if (tudr->OPT_length != 0) {
3877 			/*
3878 			 * If we are connected then the destination needs to be
3879 			 * the same as the connected one.
3880 			 */
3881 			if (udp->udp_state == TS_DATA_XFER &&
3882 			    !conn_same_as_last_v4(connp, sin)) {
3883 				error = EISCONN;
3884 				goto ud_error2;
3885 			}
3886 			UDP_STAT(us, udp_out_opt);
3887 			error = udp_output_ancillary(connp, sin, NULL,
3888 			    data_mp, mp, NULL, cr, pid);
3889 		} else {
3890 			ip_xmit_attr_t *ixa;
3891 
3892 			/*
3893 			 * We have to allocate an ip_xmit_attr_t before we grab
3894 			 * conn_lock and we need to hold conn_lock once we've
3895 			 * checked conn_same_as_last_v4 to handle concurrent
3896 			 * send* calls on a socket.
3897 			 */
3898 			ixa = conn_get_ixa(connp, B_FALSE);
3899 			if (ixa == NULL) {
3900 				error = ENOMEM;
3901 				goto ud_error2;
3902 			}
3903 			mutex_enter(&connp->conn_lock);
3904 
3905 			if (conn_same_as_last_v4(connp, sin) &&
3906 			    ipsec_outbound_policy_current(ixa)) {
3907 				UDP_DBGSTAT(us, udp_out_lastdst);
3908 				/* udp_output_lastdst drops conn_lock */
3909 				error = udp_output_lastdst(connp, data_mp, cr,
3910 				    pid, ixa);
3911 			} else {
3912 				UDP_DBGSTAT(us, udp_out_diffdst);
3913 				/* udp_output_newdst drops conn_lock */
3914 				error = udp_output_newdst(connp, data_mp, sin,
3915 				    NULL, ipversion, cr, pid, ixa);
3916 			}
3917 			ASSERT(MUTEX_NOT_HELD(&connp->conn_lock));
3918 		}
3919 		if (error == 0) {
3920 			freeb(mp);
3921 			return;
3922 		}
3923 		break;
3924 	}
3925 	UDP_STAT(us, udp_out_err_output);
3926 	ASSERT(mp != NULL);
3927 	/* mp is freed by the following routine */
3928 	udp_ud_err(q, mp, (t_scalar_t)error);
3929 	return;
3930 
3931 ud_error2:
3932 	BUMP_MIB(&us->us_udp_mib, udpOutErrors);
3933 	freemsg(data_mp);
3934 	UDP_STAT(us, udp_out_err_output);
3935 	ASSERT(mp != NULL);
3936 	/* mp is freed by the following routine */
3937 	udp_ud_err(q, mp, (t_scalar_t)error);
3938 }
3939 
3940 /*
3941  * Handle the case of the IP address, port, flow label being different
3942  * for both IPv4 and IPv6.
3943  *
3944  * NOTE: The caller must hold conn_lock and we drop it here.
3945  */
3946 static int
3947 udp_output_newdst(conn_t *connp, mblk_t *data_mp, sin_t *sin, sin6_t *sin6,
3948     ushort_t ipversion, cred_t *cr, pid_t pid, ip_xmit_attr_t *ixa)
3949 {
3950 	uint_t		srcid;
3951 	uint32_t	flowinfo;
3952 	udp_t		*udp = connp->conn_udp;
3953 	int		error = 0;
3954 	ip_xmit_attr_t	*oldixa;
3955 	udp_stack_t	*us = udp->udp_us;
3956 	in6_addr_t	v6src;
3957 	in6_addr_t	v6dst;
3958 	in6_addr_t	v6nexthop;
3959 	in_port_t	dstport;
3960 
3961 	ASSERT(MUTEX_HELD(&connp->conn_lock));
3962 	ASSERT(ixa != NULL);
3963 	/*
3964 	 * We hold conn_lock across all the use and modifications of
3965 	 * the conn_lastdst, conn_ixa, and conn_xmit_ipp to ensure that they
3966 	 * stay consistent.
3967 	 */
3968 
3969 	ASSERT(cr != NULL);
3970 	ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
3971 	ixa->ixa_cred = cr;
3972 	ixa->ixa_cpid = pid;
3973 	if (is_system_labeled()) {
3974 		/* We need to restart with a label based on the cred */
3975 		ip_xmit_attr_restore_tsl(ixa, ixa->ixa_cred);
3976 	}
3977 
3978 	/*
3979 	 * If we are connected then the destination needs to be the
3980 	 * same as the connected one, which is not the case here since we
3981 	 * checked for that above.
3982 	 */
3983 	if (udp->udp_state == TS_DATA_XFER) {
3984 		mutex_exit(&connp->conn_lock);
3985 		error = EISCONN;
3986 		goto ud_error;
3987 	}
3988 
3989 	/* In case previous destination was multicast or multirt */
3990 	ip_attr_newdst(ixa);
3991 
3992 	/*
3993 	 * If laddr is unspecified then we look at sin6_src_id.
3994 	 * We will give precedence to a source address set with IPV6_PKTINFO
3995 	 * (aka IPPF_ADDR) but that is handled in build_hdrs. However, we don't
3996 	 * want ip_attr_connect to select a source (since it can fail) when
3997 	 * IPV6_PKTINFO is specified.
3998 	 * If this doesn't result in a source address then we get a source
3999 	 * from ip_attr_connect() below.
4000 	 */
4001 	v6src = connp->conn_saddr_v6;
4002 	if (sin != NULL) {
4003 		IN6_IPADDR_TO_V4MAPPED(sin->sin_addr.s_addr, &v6dst);
4004 		dstport = sin->sin_port;
4005 		flowinfo = 0;
4006 		srcid = 0;
4007 		ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
4008 		if (srcid != 0 && V4_PART_OF_V6(&v6src) == INADDR_ANY) {
4009 			ip_srcid_find_id(srcid, &v6src, IPCL_ZONEID(connp),
4010 			    connp->conn_netstack);
4011 		}
4012 		ixa->ixa_flags |= IXAF_IS_IPV4;
4013 	} else {
4014 		v6dst = sin6->sin6_addr;
4015 		dstport = sin6->sin6_port;
4016 		flowinfo = sin6->sin6_flowinfo;
4017 		srcid = sin6->__sin6_src_id;
4018 		if (IN6_IS_ADDR_LINKSCOPE(&v6dst) && sin6->sin6_scope_id != 0) {
4019 			ixa->ixa_scopeid = sin6->sin6_scope_id;
4020 			ixa->ixa_flags |= IXAF_SCOPEID_SET;
4021 		} else {
4022 			ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
4023 		}
4024 		if (srcid != 0 && IN6_IS_ADDR_UNSPECIFIED(&v6src)) {
4025 			ip_srcid_find_id(srcid, &v6src, IPCL_ZONEID(connp),
4026 			    connp->conn_netstack);
4027 		}
4028 		if (IN6_IS_ADDR_V4MAPPED(&v6dst))
4029 			ixa->ixa_flags |= IXAF_IS_IPV4;
4030 		else
4031 			ixa->ixa_flags &= ~IXAF_IS_IPV4;
4032 	}
4033 	/* Handle IPV6_PKTINFO setting source address. */
4034 	if (IN6_IS_ADDR_UNSPECIFIED(&v6src) &&
4035 	    (connp->conn_xmit_ipp.ipp_fields & IPPF_ADDR)) {
4036 		ip_pkt_t *ipp = &connp->conn_xmit_ipp;
4037 
4038 		if (ixa->ixa_flags & IXAF_IS_IPV4) {
4039 			if (IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
4040 				v6src = ipp->ipp_addr;
4041 		} else {
4042 			if (!IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
4043 				v6src = ipp->ipp_addr;
4044 		}
4045 	}
4046 
4047 	ip_attr_nexthop(&connp->conn_xmit_ipp, ixa, &v6dst, &v6nexthop);
4048 	mutex_exit(&connp->conn_lock);
4049 
4050 	error = ip_attr_connect(connp, ixa, &v6src, &v6dst, &v6nexthop, dstport,
4051 	    &v6src, NULL, IPDF_ALLOW_MCBC | IPDF_VERIFY_DST | IPDF_IPSEC);
4052 	switch (error) {
4053 	case 0:
4054 		break;
4055 	case EADDRNOTAVAIL:
4056 		/*
4057 		 * IXAF_VERIFY_SOURCE tells us to pick a better source.
4058 		 * Don't have the application see that errno
4059 		 */
4060 		error = ENETUNREACH;
4061 		goto failed;
4062 	case ENETDOWN:
4063 		/*
4064 		 * Have !ipif_addr_ready address; drop packet silently
4065 		 * until we can get applications to not send until we
4066 		 * are ready.
4067 		 */
4068 		error = 0;
4069 		goto failed;
4070 	case EHOSTUNREACH:
4071 	case ENETUNREACH:
4072 		if (ixa->ixa_ire != NULL) {
4073 			/*
4074 			 * Let conn_ip_output/ire_send_noroute return
4075 			 * the error and send any local ICMP error.
4076 			 */
4077 			error = 0;
4078 			break;
4079 		}
4080 		/* FALLTHRU */
4081 	failed:
4082 	default:
4083 		goto ud_error;
4084 	}
4085 
4086 
4087 	/*
4088 	 * Cluster note: we let the cluster hook know that we are sending to a
4089 	 * new address and/or port.
4090 	 */
4091 	if (cl_inet_connect2 != NULL) {
4092 		CL_INET_UDP_CONNECT(connp, B_TRUE, &v6dst, dstport, error);
4093 		if (error != 0) {
4094 			error = EHOSTUNREACH;
4095 			goto ud_error;
4096 		}
4097 	}
4098 
4099 	mutex_enter(&connp->conn_lock);
4100 	/*
4101 	 * While we dropped the lock some other thread might have connected
4102 	 * this socket. If so we bail out with EISCONN to ensure that the
4103 	 * connecting thread is the one that updates conn_ixa, conn_ht_*
4104 	 * and conn_*last*.
4105 	 */
4106 	if (udp->udp_state == TS_DATA_XFER) {
4107 		mutex_exit(&connp->conn_lock);
4108 		error = EISCONN;
4109 		goto ud_error;
4110 	}
4111 
4112 	/*
4113 	 * We need to rebuild the headers if
4114 	 *  - we are labeling packets (could be different for different
4115 	 *    destinations)
4116 	 *  - we have a source route (or routing header) since we need to
4117 	 *    massage that to get the pseudo-header checksum
4118 	 *  - the IP version is different than the last time
4119 	 *  - a socket option with COA_HEADER_CHANGED has been set which
4120 	 *    set conn_v6lastdst to zero.
4121 	 *
4122 	 * Otherwise the prepend function will just update the src, dst,
4123 	 * dstport, and flow label.
4124 	 */
4125 	if (is_system_labeled()) {
4126 		/* TX MLP requires SCM_UCRED and don't have that here */
4127 		if (connp->conn_mlp_type != mlptSingle) {
4128 			mutex_exit(&connp->conn_lock);
4129 			error = ECONNREFUSED;
4130 			goto ud_error;
4131 		}
4132 		/*
4133 		 * Check whether Trusted Solaris policy allows communication
4134 		 * with this host, and pretend that the destination is
4135 		 * unreachable if not.
4136 		 * Compute any needed label and place it in ipp_label_v4/v6.
4137 		 *
4138 		 * Later conn_build_hdr_template/conn_prepend_hdr takes
4139 		 * ipp_label_v4/v6 to form the packet.
4140 		 *
4141 		 * Tsol note: Since we hold conn_lock we know no other
4142 		 * thread manipulates conn_xmit_ipp.
4143 		 */
4144 		error = conn_update_label(connp, ixa, &v6dst,
4145 		    &connp->conn_xmit_ipp);
4146 		if (error != 0) {
4147 			mutex_exit(&connp->conn_lock);
4148 			goto ud_error;
4149 		}
4150 		/* Rebuild the header template */
4151 		error = udp_build_hdr_template(connp, &v6src, &v6dst, dstport,
4152 		    flowinfo);
4153 		if (error != 0) {
4154 			mutex_exit(&connp->conn_lock);
4155 			goto ud_error;
4156 		}
4157 	} else if ((connp->conn_xmit_ipp.ipp_fields &
4158 	    (IPPF_IPV4_OPTIONS|IPPF_RTHDR)) ||
4159 	    ipversion != connp->conn_lastipversion ||
4160 	    IN6_IS_ADDR_UNSPECIFIED(&connp->conn_v6lastdst)) {
4161 		/* Rebuild the header template */
4162 		error = udp_build_hdr_template(connp, &v6src, &v6dst, dstport,
4163 		    flowinfo);
4164 		if (error != 0) {
4165 			mutex_exit(&connp->conn_lock);
4166 			goto ud_error;
4167 		}
4168 	} else {
4169 		/* Simply update the destination address if no source route */
4170 		if (ixa->ixa_flags & IXAF_IS_IPV4) {
4171 			ipha_t	*ipha = (ipha_t *)connp->conn_ht_iphc;
4172 
4173 			IN6_V4MAPPED_TO_IPADDR(&v6dst, ipha->ipha_dst);
4174 			if (ixa->ixa_flags & IXAF_PMTU_IPV4_DF) {
4175 				ipha->ipha_fragment_offset_and_flags |=
4176 				    IPH_DF_HTONS;
4177 			} else {
4178 				ipha->ipha_fragment_offset_and_flags &=
4179 				    ~IPH_DF_HTONS;
4180 			}
4181 		} else {
4182 			ip6_t *ip6h = (ip6_t *)connp->conn_ht_iphc;
4183 			ip6h->ip6_dst = v6dst;
4184 		}
4185 	}
4186 
4187 	/*
4188 	 * Remember the dst/dstport etc which corresponds to the built header
4189 	 * template and conn_ixa.
4190 	 */
4191 	oldixa = conn_replace_ixa(connp, ixa);
4192 	connp->conn_v6lastdst = v6dst;
4193 	connp->conn_lastipversion = ipversion;
4194 	connp->conn_lastdstport = dstport;
4195 	connp->conn_lastflowinfo = flowinfo;
4196 	connp->conn_lastscopeid = ixa->ixa_scopeid;
4197 	connp->conn_lastsrcid = srcid;
4198 	/* Also remember a source to use together with lastdst */
4199 	connp->conn_v6lastsrc = v6src;
4200 
4201 	data_mp = udp_prepend_header_template(connp, ixa, data_mp, &v6src,
4202 	    dstport, flowinfo, &error);
4203 
4204 	/* Done with conn_t */
4205 	mutex_exit(&connp->conn_lock);
4206 	ixa_refrele(oldixa);
4207 
4208 	if (data_mp == NULL) {
4209 		ASSERT(error != 0);
4210 		goto ud_error;
4211 	}
4212 
4213 	/* We're done.  Pass the packet to ip. */
4214 	BUMP_MIB(&us->us_udp_mib, udpHCOutDatagrams);
4215 
4216 	error = conn_ip_output(data_mp, ixa);
4217 	/* No udpOutErrors if an error since IP increases its error counter */
4218 	switch (error) {
4219 	case 0:
4220 		break;
4221 	case EWOULDBLOCK:
4222 		(void) ixa_check_drain_insert(connp, ixa);
4223 		error = 0;
4224 		break;
4225 	case EADDRNOTAVAIL:
4226 		/*
4227 		 * IXAF_VERIFY_SOURCE tells us to pick a better source.
4228 		 * Don't have the application see that errno
4229 		 */
4230 		error = ENETUNREACH;
4231 		/* FALLTHRU */
4232 	default:
4233 		mutex_enter(&connp->conn_lock);
4234 		/*
4235 		 * Clear the source and v6lastdst so we call ip_attr_connect
4236 		 * for the next packet and try to pick a better source.
4237 		 */
4238 		if (connp->conn_mcbc_bind)
4239 			connp->conn_saddr_v6 = ipv6_all_zeros;
4240 		else
4241 			connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
4242 		connp->conn_v6lastdst = ipv6_all_zeros;
4243 		mutex_exit(&connp->conn_lock);
4244 		break;
4245 	}
4246 	ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
4247 	ixa->ixa_cred = connp->conn_cred;	/* Restore */
4248 	ixa->ixa_cpid = connp->conn_cpid;
4249 	ixa_refrele(ixa);
4250 	return (error);
4251 
4252 ud_error:
4253 	ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
4254 	ixa->ixa_cred = connp->conn_cred;	/* Restore */
4255 	ixa->ixa_cpid = connp->conn_cpid;
4256 	ixa_refrele(ixa);
4257 
4258 	freemsg(data_mp);
4259 	BUMP_MIB(&us->us_udp_mib, udpOutErrors);
4260 	UDP_STAT(us, udp_out_err_output);
4261 	return (error);
4262 }
4263 
4264 /* ARGSUSED */
4265 static void
4266 udp_wput_fallback(queue_t *wq, mblk_t *mp)
4267 {
4268 #ifdef DEBUG
4269 	cmn_err(CE_CONT, "udp_wput_fallback: Message in fallback \n");
4270 #endif
4271 	freemsg(mp);
4272 }
4273 
4274 
4275 /*
4276  * Handle special out-of-band ioctl requests (see PSARC/2008/265).
4277  */
4278 static void
4279 udp_wput_cmdblk(queue_t *q, mblk_t *mp)
4280 {
4281 	void	*data;
4282 	mblk_t	*datamp = mp->b_cont;
4283 	conn_t	*connp = Q_TO_CONN(q);
4284 	udp_t	*udp = connp->conn_udp;
4285 	cmdblk_t *cmdp = (cmdblk_t *)mp->b_rptr;
4286 
4287 	if (datamp == NULL || MBLKL(datamp) < cmdp->cb_len) {
4288 		cmdp->cb_error = EPROTO;
4289 		qreply(q, mp);
4290 		return;
4291 	}
4292 	data = datamp->b_rptr;
4293 
4294 	mutex_enter(&connp->conn_lock);
4295 	switch (cmdp->cb_cmd) {
4296 	case TI_GETPEERNAME:
4297 		if (udp->udp_state != TS_DATA_XFER)
4298 			cmdp->cb_error = ENOTCONN;
4299 		else
4300 			cmdp->cb_error = conn_getpeername(connp, data,
4301 			    &cmdp->cb_len);
4302 		break;
4303 	case TI_GETMYNAME:
4304 		cmdp->cb_error = conn_getsockname(connp, data, &cmdp->cb_len);
4305 		break;
4306 	default:
4307 		cmdp->cb_error = EINVAL;
4308 		break;
4309 	}
4310 	mutex_exit(&connp->conn_lock);
4311 
4312 	qreply(q, mp);
4313 }
4314 
4315 static void
4316 udp_use_pure_tpi(udp_t *udp)
4317 {
4318 	conn_t	*connp = udp->udp_connp;
4319 
4320 	mutex_enter(&connp->conn_lock);
4321 	udp->udp_issocket = B_FALSE;
4322 	mutex_exit(&connp->conn_lock);
4323 	UDP_STAT(udp->udp_us, udp_sock_fallback);
4324 }
4325 
4326 static void
4327 udp_wput_other(queue_t *q, mblk_t *mp)
4328 {
4329 	uchar_t	*rptr = mp->b_rptr;
4330 	struct iocblk *iocp;
4331 	conn_t	*connp = Q_TO_CONN(q);
4332 	udp_t	*udp = connp->conn_udp;
4333 	cred_t	*cr;
4334 
4335 	switch (mp->b_datap->db_type) {
4336 	case M_CMD:
4337 		udp_wput_cmdblk(q, mp);
4338 		return;
4339 
4340 	case M_PROTO:
4341 	case M_PCPROTO:
4342 		if (mp->b_wptr - rptr < sizeof (t_scalar_t)) {
4343 			/*
4344 			 * If the message does not contain a PRIM_type,
4345 			 * throw it away.
4346 			 */
4347 			freemsg(mp);
4348 			return;
4349 		}
4350 		switch (((t_primp_t)rptr)->type) {
4351 		case T_ADDR_REQ:
4352 			udp_addr_req(q, mp);
4353 			return;
4354 		case O_T_BIND_REQ:
4355 		case T_BIND_REQ:
4356 			udp_tpi_bind(q, mp);
4357 			return;
4358 		case T_CONN_REQ:
4359 			udp_tpi_connect(q, mp);
4360 			return;
4361 		case T_CAPABILITY_REQ:
4362 			udp_capability_req(q, mp);
4363 			return;
4364 		case T_INFO_REQ:
4365 			udp_info_req(q, mp);
4366 			return;
4367 		case T_UNITDATA_REQ:
4368 			/*
4369 			 * If a T_UNITDATA_REQ gets here, the address must
4370 			 * be bad.  Valid T_UNITDATA_REQs are handled
4371 			 * in udp_wput.
4372 			 */
4373 			udp_ud_err(q, mp, EADDRNOTAVAIL);
4374 			return;
4375 		case T_UNBIND_REQ:
4376 			udp_tpi_unbind(q, mp);
4377 			return;
4378 		case T_SVR4_OPTMGMT_REQ:
4379 			/*
4380 			 * All Solaris components should pass a db_credp
4381 			 * for this TPI message, hence we ASSERT.
4382 			 * But in case there is some other M_PROTO that looks
4383 			 * like a TPI message sent by some other kernel
4384 			 * component, we check and return an error.
4385 			 */
4386 			cr = msg_getcred(mp, NULL);
4387 			ASSERT(cr != NULL);
4388 			if (cr == NULL) {
4389 				udp_err_ack(q, mp, TSYSERR, EINVAL);
4390 				return;
4391 			}
4392 			if (!snmpcom_req(q, mp, udp_snmp_set, ip_snmp_get,
4393 			    cr)) {
4394 				svr4_optcom_req(q, mp, cr, &udp_opt_obj);
4395 			}
4396 			return;
4397 
4398 		case T_OPTMGMT_REQ:
4399 			/*
4400 			 * All Solaris components should pass a db_credp
4401 			 * for this TPI message, hence we ASSERT.
4402 			 * But in case there is some other M_PROTO that looks
4403 			 * like a TPI message sent by some other kernel
4404 			 * component, we check and return an error.
4405 			 */
4406 			cr = msg_getcred(mp, NULL);
4407 			ASSERT(cr != NULL);
4408 			if (cr == NULL) {
4409 				udp_err_ack(q, mp, TSYSERR, EINVAL);
4410 				return;
4411 			}
4412 			tpi_optcom_req(q, mp, cr, &udp_opt_obj);
4413 			return;
4414 
4415 		case T_DISCON_REQ:
4416 			udp_tpi_disconnect(q, mp);
4417 			return;
4418 
4419 		/* The following TPI message is not supported by udp. */
4420 		case O_T_CONN_RES:
4421 		case T_CONN_RES:
4422 			udp_err_ack(q, mp, TNOTSUPPORT, 0);
4423 			return;
4424 
4425 		/* The following 3 TPI requests are illegal for udp. */
4426 		case T_DATA_REQ:
4427 		case T_EXDATA_REQ:
4428 		case T_ORDREL_REQ:
4429 			udp_err_ack(q, mp, TNOTSUPPORT, 0);
4430 			return;
4431 		default:
4432 			break;
4433 		}
4434 		break;
4435 	case M_FLUSH:
4436 		if (*rptr & FLUSHW)
4437 			flushq(q, FLUSHDATA);
4438 		break;
4439 	case M_IOCTL:
4440 		iocp = (struct iocblk *)mp->b_rptr;
4441 		switch (iocp->ioc_cmd) {
4442 		case TI_GETPEERNAME:
4443 			if (udp->udp_state != TS_DATA_XFER) {
4444 				/*
4445 				 * If a default destination address has not
4446 				 * been associated with the stream, then we
4447 				 * don't know the peer's name.
4448 				 */
4449 				iocp->ioc_error = ENOTCONN;
4450 				iocp->ioc_count = 0;
4451 				mp->b_datap->db_type = M_IOCACK;
4452 				qreply(q, mp);
4453 				return;
4454 			}
4455 			/* FALLTHRU */
4456 		case TI_GETMYNAME:
4457 			/*
4458 			 * For TI_GETPEERNAME and TI_GETMYNAME, we first
4459 			 * need to copyin the user's strbuf structure.
4460 			 * Processing will continue in the M_IOCDATA case
4461 			 * below.
4462 			 */
4463 			mi_copyin(q, mp, NULL,
4464 			    SIZEOF_STRUCT(strbuf, iocp->ioc_flag));
4465 			return;
4466 		case _SIOCSOCKFALLBACK:
4467 			/*
4468 			 * Either sockmod is about to be popped and the
4469 			 * socket would now be treated as a plain stream,
4470 			 * or a module is about to be pushed so we have
4471 			 * to follow pure TPI semantics.
4472 			 */
4473 			if (!udp->udp_issocket) {
4474 				DB_TYPE(mp) = M_IOCNAK;
4475 				iocp->ioc_error = EINVAL;
4476 			} else {
4477 				udp_use_pure_tpi(udp);
4478 
4479 				DB_TYPE(mp) = M_IOCACK;
4480 				iocp->ioc_error = 0;
4481 			}
4482 			iocp->ioc_count = 0;
4483 			iocp->ioc_rval = 0;
4484 			qreply(q, mp);
4485 			return;
4486 		default:
4487 			break;
4488 		}
4489 		break;
4490 	case M_IOCDATA:
4491 		udp_wput_iocdata(q, mp);
4492 		return;
4493 	default:
4494 		/* Unrecognized messages are passed through without change. */
4495 		break;
4496 	}
4497 	ip_wput_nondata(q, mp);
4498 }
4499 
4500 /*
4501  * udp_wput_iocdata is called by udp_wput_other to handle all M_IOCDATA
4502  * messages.
4503  */
4504 static void
4505 udp_wput_iocdata(queue_t *q, mblk_t *mp)
4506 {
4507 	mblk_t		*mp1;
4508 	struct	iocblk *iocp = (struct iocblk *)mp->b_rptr;
4509 	STRUCT_HANDLE(strbuf, sb);
4510 	uint_t		addrlen;
4511 	conn_t		*connp = Q_TO_CONN(q);
4512 	udp_t		*udp = connp->conn_udp;
4513 
4514 	/* Make sure it is one of ours. */
4515 	switch (iocp->ioc_cmd) {
4516 	case TI_GETMYNAME:
4517 	case TI_GETPEERNAME:
4518 		break;
4519 	default:
4520 		ip_wput_nondata(q, mp);
4521 		return;
4522 	}
4523 
4524 	switch (mi_copy_state(q, mp, &mp1)) {
4525 	case -1:
4526 		return;
4527 	case MI_COPY_CASE(MI_COPY_IN, 1):
4528 		break;
4529 	case MI_COPY_CASE(MI_COPY_OUT, 1):
4530 		/*
4531 		 * The address has been copied out, so now
4532 		 * copyout the strbuf.
4533 		 */
4534 		mi_copyout(q, mp);
4535 		return;
4536 	case MI_COPY_CASE(MI_COPY_OUT, 2):
4537 		/*
4538 		 * The address and strbuf have been copied out.
4539 		 * We're done, so just acknowledge the original
4540 		 * M_IOCTL.
4541 		 */
4542 		mi_copy_done(q, mp, 0);
4543 		return;
4544 	default:
4545 		/*
4546 		 * Something strange has happened, so acknowledge
4547 		 * the original M_IOCTL with an EPROTO error.
4548 		 */
4549 		mi_copy_done(q, mp, EPROTO);
4550 		return;
4551 	}
4552 
4553 	/*
4554 	 * Now we have the strbuf structure for TI_GETMYNAME
4555 	 * and TI_GETPEERNAME.  Next we copyout the requested
4556 	 * address and then we'll copyout the strbuf.
4557 	 */
4558 	STRUCT_SET_HANDLE(sb, iocp->ioc_flag, (void *)mp1->b_rptr);
4559 
4560 	if (connp->conn_family == AF_INET)
4561 		addrlen = sizeof (sin_t);
4562 	else
4563 		addrlen = sizeof (sin6_t);
4564 
4565 	if (STRUCT_FGET(sb, maxlen) < addrlen) {
4566 		mi_copy_done(q, mp, EINVAL);
4567 		return;
4568 	}
4569 
4570 	switch (iocp->ioc_cmd) {
4571 	case TI_GETMYNAME:
4572 		break;
4573 	case TI_GETPEERNAME:
4574 		if (udp->udp_state != TS_DATA_XFER) {
4575 			mi_copy_done(q, mp, ENOTCONN);
4576 			return;
4577 		}
4578 		break;
4579 	}
4580 	mp1 = mi_copyout_alloc(q, mp, STRUCT_FGETP(sb, buf), addrlen, B_TRUE);
4581 	if (!mp1)
4582 		return;
4583 
4584 	STRUCT_FSET(sb, len, addrlen);
4585 	switch (((struct iocblk *)mp->b_rptr)->ioc_cmd) {
4586 	case TI_GETMYNAME:
4587 		(void) conn_getsockname(connp, (struct sockaddr *)mp1->b_wptr,
4588 		    &addrlen);
4589 		break;
4590 	case TI_GETPEERNAME:
4591 		(void) conn_getpeername(connp, (struct sockaddr *)mp1->b_wptr,
4592 		    &addrlen);
4593 		break;
4594 	}
4595 	mp1->b_wptr += addrlen;
4596 	/* Copy out the address */
4597 	mi_copyout(q, mp);
4598 }
4599 
4600 void
4601 udp_ddi_g_init(void)
4602 {
4603 	udp_max_optsize = optcom_max_optsize(udp_opt_obj.odb_opt_des_arr,
4604 	    udp_opt_obj.odb_opt_arr_cnt);
4605 
4606 	/*
4607 	 * We want to be informed each time a stack is created or
4608 	 * destroyed in the kernel, so we can maintain the
4609 	 * set of udp_stack_t's.
4610 	 */
4611 	netstack_register(NS_UDP, udp_stack_init, NULL, udp_stack_fini);
4612 }
4613 
4614 void
4615 udp_ddi_g_destroy(void)
4616 {
4617 	netstack_unregister(NS_UDP);
4618 }
4619 
4620 #define	INET_NAME	"ip"
4621 
4622 /*
4623  * Initialize the UDP stack instance.
4624  */
4625 static void *
4626 udp_stack_init(netstackid_t stackid, netstack_t *ns)
4627 {
4628 	udp_stack_t	*us;
4629 	int		i;
4630 	int		error = 0;
4631 	major_t		major;
4632 	size_t		arrsz;
4633 
4634 	us = (udp_stack_t *)kmem_zalloc(sizeof (*us), KM_SLEEP);
4635 	us->us_netstack = ns;
4636 
4637 	mutex_init(&us->us_epriv_port_lock, NULL, MUTEX_DEFAULT, NULL);
4638 	us->us_num_epriv_ports = UDP_NUM_EPRIV_PORTS;
4639 	us->us_epriv_ports[0] = ULP_DEF_EPRIV_PORT1;
4640 	us->us_epriv_ports[1] = ULP_DEF_EPRIV_PORT2;
4641 
4642 	/*
4643 	 * The smallest anonymous port in the priviledged port range which UDP
4644 	 * looks for free port.  Use in the option UDP_ANONPRIVBIND.
4645 	 */
4646 	us->us_min_anonpriv_port = 512;
4647 
4648 	us->us_bind_fanout_size = udp_bind_fanout_size;
4649 
4650 	/* Roundup variable that might have been modified in /etc/system */
4651 	if (us->us_bind_fanout_size & (us->us_bind_fanout_size - 1)) {
4652 		/* Not a power of two. Round up to nearest power of two */
4653 		for (i = 0; i < 31; i++) {
4654 			if (us->us_bind_fanout_size < (1 << i))
4655 				break;
4656 		}
4657 		us->us_bind_fanout_size = 1 << i;
4658 	}
4659 	us->us_bind_fanout = kmem_zalloc(us->us_bind_fanout_size *
4660 	    sizeof (udp_fanout_t), KM_SLEEP);
4661 	for (i = 0; i < us->us_bind_fanout_size; i++) {
4662 		mutex_init(&us->us_bind_fanout[i].uf_lock, NULL, MUTEX_DEFAULT,
4663 		    NULL);
4664 	}
4665 
4666 	arrsz = udp_propinfo_count * sizeof (mod_prop_info_t);
4667 	us->us_propinfo_tbl = (mod_prop_info_t *)kmem_alloc(arrsz,
4668 	    KM_SLEEP);
4669 	bcopy(udp_propinfo_tbl, us->us_propinfo_tbl, arrsz);
4670 
4671 	us->us_kstat = udp_kstat2_init(stackid, &us->us_statistics);
4672 	us->us_mibkp = udp_kstat_init(stackid);
4673 
4674 	major = mod_name_to_major(INET_NAME);
4675 	error = ldi_ident_from_major(major, &us->us_ldi_ident);
4676 	ASSERT(error == 0);
4677 	return (us);
4678 }
4679 
4680 /*
4681  * Free the UDP stack instance.
4682  */
4683 static void
4684 udp_stack_fini(netstackid_t stackid, void *arg)
4685 {
4686 	udp_stack_t *us = (udp_stack_t *)arg;
4687 	int i;
4688 
4689 	for (i = 0; i < us->us_bind_fanout_size; i++) {
4690 		mutex_destroy(&us->us_bind_fanout[i].uf_lock);
4691 	}
4692 
4693 	kmem_free(us->us_bind_fanout, us->us_bind_fanout_size *
4694 	    sizeof (udp_fanout_t));
4695 
4696 	us->us_bind_fanout = NULL;
4697 
4698 	kmem_free(us->us_propinfo_tbl,
4699 	    udp_propinfo_count * sizeof (mod_prop_info_t));
4700 	us->us_propinfo_tbl = NULL;
4701 
4702 	udp_kstat_fini(stackid, us->us_mibkp);
4703 	us->us_mibkp = NULL;
4704 
4705 	udp_kstat2_fini(stackid, us->us_kstat);
4706 	us->us_kstat = NULL;
4707 	bzero(&us->us_statistics, sizeof (us->us_statistics));
4708 
4709 	mutex_destroy(&us->us_epriv_port_lock);
4710 	ldi_ident_release(us->us_ldi_ident);
4711 	kmem_free(us, sizeof (*us));
4712 }
4713 
4714 static void *
4715 udp_kstat2_init(netstackid_t stackid, udp_stat_t *us_statisticsp)
4716 {
4717 	kstat_t *ksp;
4718 
4719 	udp_stat_t template = {
4720 		{ "udp_sock_fallback",		KSTAT_DATA_UINT64 },
4721 		{ "udp_out_opt",		KSTAT_DATA_UINT64 },
4722 		{ "udp_out_err_notconn",	KSTAT_DATA_UINT64 },
4723 		{ "udp_out_err_output",		KSTAT_DATA_UINT64 },
4724 		{ "udp_out_err_tudr",		KSTAT_DATA_UINT64 },
4725 #ifdef DEBUG
4726 		{ "udp_data_conn",		KSTAT_DATA_UINT64 },
4727 		{ "udp_data_notconn",		KSTAT_DATA_UINT64 },
4728 		{ "udp_out_lastdst",		KSTAT_DATA_UINT64 },
4729 		{ "udp_out_diffdst",		KSTAT_DATA_UINT64 },
4730 		{ "udp_out_ipv6",		KSTAT_DATA_UINT64 },
4731 		{ "udp_out_mapped",		KSTAT_DATA_UINT64 },
4732 		{ "udp_out_ipv4",		KSTAT_DATA_UINT64 },
4733 #endif
4734 	};
4735 
4736 	ksp = kstat_create_netstack(UDP_MOD_NAME, 0, "udpstat", "net",
4737 	    KSTAT_TYPE_NAMED, sizeof (template) / sizeof (kstat_named_t),
4738 	    KSTAT_FLAG_VIRTUAL, stackid);
4739 
4740 	if (ksp == NULL)
4741 		return (NULL);
4742 
4743 	bcopy(&template, us_statisticsp, sizeof (template));
4744 	ksp->ks_data = (void *)us_statisticsp;
4745 	ksp->ks_private = (void *)(uintptr_t)stackid;
4746 
4747 	kstat_install(ksp);
4748 	return (ksp);
4749 }
4750 
4751 static void
4752 udp_kstat2_fini(netstackid_t stackid, kstat_t *ksp)
4753 {
4754 	if (ksp != NULL) {
4755 		ASSERT(stackid == (netstackid_t)(uintptr_t)ksp->ks_private);
4756 		kstat_delete_netstack(ksp, stackid);
4757 	}
4758 }
4759 
4760 static void *
4761 udp_kstat_init(netstackid_t stackid)
4762 {
4763 	kstat_t	*ksp;
4764 
4765 	udp_named_kstat_t template = {
4766 		{ "inDatagrams",	KSTAT_DATA_UINT64, 0 },
4767 		{ "inErrors",		KSTAT_DATA_UINT32, 0 },
4768 		{ "outDatagrams",	KSTAT_DATA_UINT64, 0 },
4769 		{ "entrySize",		KSTAT_DATA_INT32, 0 },
4770 		{ "entry6Size",		KSTAT_DATA_INT32, 0 },
4771 		{ "outErrors",		KSTAT_DATA_UINT32, 0 },
4772 	};
4773 
4774 	ksp = kstat_create_netstack(UDP_MOD_NAME, 0, UDP_MOD_NAME, "mib2",
4775 	    KSTAT_TYPE_NAMED,
4776 	    NUM_OF_FIELDS(udp_named_kstat_t), 0, stackid);
4777 
4778 	if (ksp == NULL || ksp->ks_data == NULL)
4779 		return (NULL);
4780 
4781 	template.entrySize.value.ui32 = sizeof (mib2_udpEntry_t);
4782 	template.entry6Size.value.ui32 = sizeof (mib2_udp6Entry_t);
4783 
4784 	bcopy(&template, ksp->ks_data, sizeof (template));
4785 	ksp->ks_update = udp_kstat_update;
4786 	ksp->ks_private = (void *)(uintptr_t)stackid;
4787 
4788 	kstat_install(ksp);
4789 	return (ksp);
4790 }
4791 
4792 static void
4793 udp_kstat_fini(netstackid_t stackid, kstat_t *ksp)
4794 {
4795 	if (ksp != NULL) {
4796 		ASSERT(stackid == (netstackid_t)(uintptr_t)ksp->ks_private);
4797 		kstat_delete_netstack(ksp, stackid);
4798 	}
4799 }
4800 
4801 static int
4802 udp_kstat_update(kstat_t *kp, int rw)
4803 {
4804 	udp_named_kstat_t *udpkp;
4805 	netstackid_t	stackid = (netstackid_t)(uintptr_t)kp->ks_private;
4806 	netstack_t	*ns;
4807 	udp_stack_t	*us;
4808 
4809 	if ((kp == NULL) || (kp->ks_data == NULL))
4810 		return (EIO);
4811 
4812 	if (rw == KSTAT_WRITE)
4813 		return (EACCES);
4814 
4815 	ns = netstack_find_by_stackid(stackid);
4816 	if (ns == NULL)
4817 		return (-1);
4818 	us = ns->netstack_udp;
4819 	if (us == NULL) {
4820 		netstack_rele(ns);
4821 		return (-1);
4822 	}
4823 	udpkp = (udp_named_kstat_t *)kp->ks_data;
4824 
4825 	udpkp->inDatagrams.value.ui64 =	us->us_udp_mib.udpHCInDatagrams;
4826 	udpkp->inErrors.value.ui32 =	us->us_udp_mib.udpInErrors;
4827 	udpkp->outDatagrams.value.ui64 = us->us_udp_mib.udpHCOutDatagrams;
4828 	udpkp->outErrors.value.ui32 =	us->us_udp_mib.udpOutErrors;
4829 	netstack_rele(ns);
4830 	return (0);
4831 }
4832 
4833 static size_t
4834 udp_set_rcv_hiwat(udp_t *udp, size_t size)
4835 {
4836 	udp_stack_t *us = udp->udp_us;
4837 
4838 	/* We add a bit of extra buffering */
4839 	size += size >> 1;
4840 	if (size > us->us_max_buf)
4841 		size = us->us_max_buf;
4842 
4843 	udp->udp_rcv_hiwat = size;
4844 	return (size);
4845 }
4846 
4847 /*
4848  * For the lower queue so that UDP can be a dummy mux.
4849  * Nobody should be sending
4850  * packets up this stream
4851  */
4852 static void
4853 udp_lrput(queue_t *q, mblk_t *mp)
4854 {
4855 	switch (mp->b_datap->db_type) {
4856 	case M_FLUSH:
4857 		/* Turn around */
4858 		if (*mp->b_rptr & FLUSHW) {
4859 			*mp->b_rptr &= ~FLUSHR;
4860 			qreply(q, mp);
4861 			return;
4862 		}
4863 		break;
4864 	}
4865 	freemsg(mp);
4866 }
4867 
4868 /*
4869  * For the lower queue so that UDP can be a dummy mux.
4870  * Nobody should be sending packets down this stream.
4871  */
4872 /* ARGSUSED */
4873 void
4874 udp_lwput(queue_t *q, mblk_t *mp)
4875 {
4876 	freemsg(mp);
4877 }
4878 
4879 /*
4880  * Below routines for UDP socket module.
4881  */
4882 
4883 static conn_t *
4884 udp_do_open(cred_t *credp, boolean_t isv6, int flags, int *errorp)
4885 {
4886 	udp_t		*udp;
4887 	conn_t		*connp;
4888 	zoneid_t 	zoneid;
4889 	netstack_t 	*ns;
4890 	udp_stack_t 	*us;
4891 	int		len;
4892 
4893 	ASSERT(errorp != NULL);
4894 
4895 	if ((*errorp = secpolicy_basic_net_access(credp)) != 0)
4896 		return (NULL);
4897 
4898 	ns = netstack_find_by_cred(credp);
4899 	ASSERT(ns != NULL);
4900 	us = ns->netstack_udp;
4901 	ASSERT(us != NULL);
4902 
4903 	/*
4904 	 * For exclusive stacks we set the zoneid to zero
4905 	 * to make UDP operate as if in the global zone.
4906 	 */
4907 	if (ns->netstack_stackid != GLOBAL_NETSTACKID)
4908 		zoneid = GLOBAL_ZONEID;
4909 	else
4910 		zoneid = crgetzoneid(credp);
4911 
4912 	ASSERT(flags == KM_SLEEP || flags == KM_NOSLEEP);
4913 
4914 	connp = ipcl_conn_create(IPCL_UDPCONN, flags, ns);
4915 	if (connp == NULL) {
4916 		netstack_rele(ns);
4917 		*errorp = ENOMEM;
4918 		return (NULL);
4919 	}
4920 	udp = connp->conn_udp;
4921 
4922 	/*
4923 	 * ipcl_conn_create did a netstack_hold. Undo the hold that was
4924 	 * done by netstack_find_by_cred()
4925 	 */
4926 	netstack_rele(ns);
4927 
4928 	/*
4929 	 * Since this conn_t/udp_t is not yet visible to anybody else we don't
4930 	 * need to lock anything.
4931 	 */
4932 	ASSERT(connp->conn_proto == IPPROTO_UDP);
4933 	ASSERT(connp->conn_udp == udp);
4934 	ASSERT(udp->udp_connp == connp);
4935 
4936 	/* Set the initial state of the stream and the privilege status. */
4937 	udp->udp_state = TS_UNBND;
4938 	connp->conn_ixa->ixa_flags |= IXAF_VERIFY_SOURCE;
4939 	if (isv6) {
4940 		connp->conn_family = AF_INET6;
4941 		connp->conn_ipversion = IPV6_VERSION;
4942 		connp->conn_ixa->ixa_flags &= ~IXAF_IS_IPV4;
4943 		connp->conn_default_ttl = us->us_ipv6_hoplimit;
4944 		len = sizeof (ip6_t) + UDPH_SIZE;
4945 	} else {
4946 		connp->conn_family = AF_INET;
4947 		connp->conn_ipversion = IPV4_VERSION;
4948 		connp->conn_ixa->ixa_flags |= IXAF_IS_IPV4;
4949 		connp->conn_default_ttl = us->us_ipv4_ttl;
4950 		len = sizeof (ipha_t) + UDPH_SIZE;
4951 	}
4952 
4953 	ASSERT(connp->conn_ixa->ixa_protocol == connp->conn_proto);
4954 	connp->conn_xmit_ipp.ipp_unicast_hops = connp->conn_default_ttl;
4955 
4956 	connp->conn_ixa->ixa_multicast_ttl = IP_DEFAULT_MULTICAST_TTL;
4957 	connp->conn_ixa->ixa_flags |= IXAF_MULTICAST_LOOP | IXAF_SET_ULP_CKSUM;
4958 	/* conn_allzones can not be set this early, hence no IPCL_ZONEID */
4959 	connp->conn_ixa->ixa_zoneid = zoneid;
4960 
4961 	connp->conn_zoneid = zoneid;
4962 
4963 	/*
4964 	 * If the caller has the process-wide flag set, then default to MAC
4965 	 * exempt mode.  This allows read-down to unlabeled hosts.
4966 	 */
4967 	if (getpflags(NET_MAC_AWARE, credp) != 0)
4968 		connp->conn_mac_mode = CONN_MAC_AWARE;
4969 
4970 	connp->conn_zone_is_global = (crgetzoneid(credp) == GLOBAL_ZONEID);
4971 
4972 	udp->udp_us = us;
4973 
4974 	connp->conn_rcvbuf = us->us_recv_hiwat;
4975 	connp->conn_sndbuf = us->us_xmit_hiwat;
4976 	connp->conn_sndlowat = us->us_xmit_lowat;
4977 	connp->conn_rcvlowat = udp_mod_info.mi_lowat;
4978 
4979 	connp->conn_wroff = len + us->us_wroff_extra;
4980 	connp->conn_so_type = SOCK_DGRAM;
4981 
4982 	connp->conn_recv = udp_input;
4983 	connp->conn_recvicmp = udp_icmp_input;
4984 	crhold(credp);
4985 	connp->conn_cred = credp;
4986 	connp->conn_cpid = curproc->p_pid;
4987 	connp->conn_open_time = ddi_get_lbolt64();
4988 	/* Cache things in ixa without an extra refhold */
4989 	ASSERT(!(connp->conn_ixa->ixa_free_flags & IXA_FREE_CRED));
4990 	connp->conn_ixa->ixa_cred = connp->conn_cred;
4991 	connp->conn_ixa->ixa_cpid = connp->conn_cpid;
4992 	if (is_system_labeled())
4993 		connp->conn_ixa->ixa_tsl = crgetlabel(connp->conn_cred);
4994 
4995 	*((sin6_t *)&udp->udp_delayed_addr) = sin6_null;
4996 
4997 	if (us->us_pmtu_discovery)
4998 		connp->conn_ixa->ixa_flags |= IXAF_PMTU_DISCOVERY;
4999 
5000 	return (connp);
5001 }
5002 
5003 sock_lower_handle_t
5004 udp_create(int family, int type, int proto, sock_downcalls_t **sock_downcalls,
5005     uint_t *smodep, int *errorp, int flags, cred_t *credp)
5006 {
5007 	udp_t		*udp = NULL;
5008 	udp_stack_t	*us;
5009 	conn_t		*connp;
5010 	boolean_t	isv6;
5011 
5012 	if (type != SOCK_DGRAM || (family != AF_INET && family != AF_INET6) ||
5013 	    (proto != 0 && proto != IPPROTO_UDP)) {
5014 		*errorp = EPROTONOSUPPORT;
5015 		return (NULL);
5016 	}
5017 
5018 	if (family == AF_INET6)
5019 		isv6 = B_TRUE;
5020 	else
5021 		isv6 = B_FALSE;
5022 
5023 	connp = udp_do_open(credp, isv6, flags, errorp);
5024 	if (connp == NULL)
5025 		return (NULL);
5026 
5027 	udp = connp->conn_udp;
5028 	ASSERT(udp != NULL);
5029 	us = udp->udp_us;
5030 	ASSERT(us != NULL);
5031 
5032 	udp->udp_issocket = B_TRUE;
5033 	connp->conn_flags |= IPCL_NONSTR;
5034 
5035 	/*
5036 	 * Set flow control
5037 	 * Since this conn_t/udp_t is not yet visible to anybody else we don't
5038 	 * need to lock anything.
5039 	 */
5040 	(void) udp_set_rcv_hiwat(udp, connp->conn_rcvbuf);
5041 	udp->udp_rcv_disply_hiwat = connp->conn_rcvbuf;
5042 
5043 	connp->conn_flow_cntrld = B_FALSE;
5044 
5045 	mutex_enter(&connp->conn_lock);
5046 	connp->conn_state_flags &= ~CONN_INCIPIENT;
5047 	mutex_exit(&connp->conn_lock);
5048 
5049 	*errorp = 0;
5050 	*smodep = SM_ATOMIC;
5051 	*sock_downcalls = &sock_udp_downcalls;
5052 	return ((sock_lower_handle_t)connp);
5053 }
5054 
5055 /* ARGSUSED3 */
5056 void
5057 udp_activate(sock_lower_handle_t proto_handle, sock_upper_handle_t sock_handle,
5058     sock_upcalls_t *sock_upcalls, int flags, cred_t *cr)
5059 {
5060 	conn_t 		*connp = (conn_t *)proto_handle;
5061 	struct sock_proto_props sopp;
5062 
5063 	/* All Solaris components should pass a cred for this operation. */
5064 	ASSERT(cr != NULL);
5065 
5066 	connp->conn_upcalls = sock_upcalls;
5067 	connp->conn_upper_handle = sock_handle;
5068 
5069 	sopp.sopp_flags = SOCKOPT_WROFF | SOCKOPT_RCVHIWAT | SOCKOPT_RCVLOWAT |
5070 	    SOCKOPT_MAXBLK | SOCKOPT_MAXPSZ | SOCKOPT_MINPSZ;
5071 	sopp.sopp_wroff = connp->conn_wroff;
5072 	sopp.sopp_maxblk = INFPSZ;
5073 	sopp.sopp_rxhiwat = connp->conn_rcvbuf;
5074 	sopp.sopp_rxlowat = connp->conn_rcvlowat;
5075 	sopp.sopp_maxaddrlen = sizeof (sin6_t);
5076 	sopp.sopp_maxpsz =
5077 	    (connp->conn_family == AF_INET) ? UDP_MAXPACKET_IPV4 :
5078 	    UDP_MAXPACKET_IPV6;
5079 	sopp.sopp_minpsz = (udp_mod_info.mi_minpsz == 1) ? 0 :
5080 	    udp_mod_info.mi_minpsz;
5081 
5082 	(*connp->conn_upcalls->su_set_proto_props)(connp->conn_upper_handle,
5083 	    &sopp);
5084 }
5085 
5086 static void
5087 udp_do_close(conn_t *connp)
5088 {
5089 	udp_t	*udp;
5090 
5091 	ASSERT(connp != NULL && IPCL_IS_UDP(connp));
5092 	udp = connp->conn_udp;
5093 
5094 	if (cl_inet_unbind != NULL && udp->udp_state == TS_IDLE) {
5095 		/*
5096 		 * Running in cluster mode - register unbind information
5097 		 */
5098 		if (connp->conn_ipversion == IPV4_VERSION) {
5099 			(*cl_inet_unbind)(
5100 			    connp->conn_netstack->netstack_stackid,
5101 			    IPPROTO_UDP, AF_INET,
5102 			    (uint8_t *)(&V4_PART_OF_V6(connp->conn_laddr_v6)),
5103 			    (in_port_t)connp->conn_lport, NULL);
5104 		} else {
5105 			(*cl_inet_unbind)(
5106 			    connp->conn_netstack->netstack_stackid,
5107 			    IPPROTO_UDP, AF_INET6,
5108 			    (uint8_t *)&(connp->conn_laddr_v6),
5109 			    (in_port_t)connp->conn_lport, NULL);
5110 		}
5111 	}
5112 
5113 	udp_bind_hash_remove(udp, B_FALSE);
5114 
5115 	ip_quiesce_conn(connp);
5116 
5117 	if (!IPCL_IS_NONSTR(connp)) {
5118 		ASSERT(connp->conn_wq != NULL);
5119 		ASSERT(connp->conn_rq != NULL);
5120 		qprocsoff(connp->conn_rq);
5121 	}
5122 
5123 	udp_close_free(connp);
5124 
5125 	/*
5126 	 * Now we are truly single threaded on this stream, and can
5127 	 * delete the things hanging off the connp, and finally the connp.
5128 	 * We removed this connp from the fanout list, it cannot be
5129 	 * accessed thru the fanouts, and we already waited for the
5130 	 * conn_ref to drop to 0. We are already in close, so
5131 	 * there cannot be any other thread from the top. qprocsoff
5132 	 * has completed, and service has completed or won't run in
5133 	 * future.
5134 	 */
5135 	ASSERT(connp->conn_ref == 1);
5136 
5137 	if (!IPCL_IS_NONSTR(connp)) {
5138 		inet_minor_free(connp->conn_minor_arena, connp->conn_dev);
5139 	} else {
5140 		ip_free_helper_stream(connp);
5141 	}
5142 
5143 	connp->conn_ref--;
5144 	ipcl_conn_destroy(connp);
5145 }
5146 
5147 /* ARGSUSED1 */
5148 int
5149 udp_close(sock_lower_handle_t proto_handle, int flags, cred_t *cr)
5150 {
5151 	conn_t	*connp = (conn_t *)proto_handle;
5152 
5153 	/* All Solaris components should pass a cred for this operation. */
5154 	ASSERT(cr != NULL);
5155 
5156 	udp_do_close(connp);
5157 	return (0);
5158 }
5159 
5160 static int
5161 udp_do_bind(conn_t *connp, struct sockaddr *sa, socklen_t len, cred_t *cr,
5162     boolean_t bind_to_req_port_only)
5163 {
5164 	sin_t		*sin;
5165 	sin6_t		*sin6;
5166 	udp_t		*udp = connp->conn_udp;
5167 	int		error = 0;
5168 	ip_laddr_t	laddr_type = IPVL_UNICAST_UP;	/* INADDR_ANY */
5169 	in_port_t	port;		/* Host byte order */
5170 	in_port_t	requested_port;	/* Host byte order */
5171 	int		count;
5172 	ipaddr_t	v4src;		/* Set if AF_INET */
5173 	in6_addr_t	v6src;
5174 	int		loopmax;
5175 	udp_fanout_t	*udpf;
5176 	in_port_t	lport;		/* Network byte order */
5177 	uint_t		scopeid = 0;
5178 	zoneid_t	zoneid = IPCL_ZONEID(connp);
5179 	ip_stack_t	*ipst = connp->conn_netstack->netstack_ip;
5180 	boolean_t	is_inaddr_any;
5181 	mlp_type_t	addrtype, mlptype;
5182 	udp_stack_t	*us = udp->udp_us;
5183 
5184 	switch (len) {
5185 	case sizeof (sin_t):	/* Complete IPv4 address */
5186 		sin = (sin_t *)sa;
5187 
5188 		if (sin == NULL || !OK_32PTR((char *)sin))
5189 			return (EINVAL);
5190 
5191 		if (connp->conn_family != AF_INET ||
5192 		    sin->sin_family != AF_INET) {
5193 			return (EAFNOSUPPORT);
5194 		}
5195 		v4src = sin->sin_addr.s_addr;
5196 		IN6_IPADDR_TO_V4MAPPED(v4src, &v6src);
5197 		if (v4src != INADDR_ANY) {
5198 			laddr_type = ip_laddr_verify_v4(v4src, zoneid, ipst,
5199 			    B_TRUE);
5200 		}
5201 		port = ntohs(sin->sin_port);
5202 		break;
5203 
5204 	case sizeof (sin6_t):	/* complete IPv6 address */
5205 		sin6 = (sin6_t *)sa;
5206 
5207 		if (sin6 == NULL || !OK_32PTR((char *)sin6))
5208 			return (EINVAL);
5209 
5210 		if (connp->conn_family != AF_INET6 ||
5211 		    sin6->sin6_family != AF_INET6) {
5212 			return (EAFNOSUPPORT);
5213 		}
5214 		v6src = sin6->sin6_addr;
5215 		if (IN6_IS_ADDR_V4MAPPED(&v6src)) {
5216 			if (connp->conn_ipv6_v6only)
5217 				return (EADDRNOTAVAIL);
5218 
5219 			IN6_V4MAPPED_TO_IPADDR(&v6src, v4src);
5220 			if (v4src != INADDR_ANY) {
5221 				laddr_type = ip_laddr_verify_v4(v4src,
5222 				    zoneid, ipst, B_FALSE);
5223 			}
5224 		} else {
5225 			if (!IN6_IS_ADDR_UNSPECIFIED(&v6src)) {
5226 				if (IN6_IS_ADDR_LINKSCOPE(&v6src))
5227 					scopeid = sin6->sin6_scope_id;
5228 				laddr_type = ip_laddr_verify_v6(&v6src,
5229 				    zoneid, ipst, B_TRUE, scopeid);
5230 			}
5231 		}
5232 		port = ntohs(sin6->sin6_port);
5233 		break;
5234 
5235 	default:		/* Invalid request */
5236 		(void) strlog(UDP_MOD_ID, 0, 1, SL_ERROR|SL_TRACE,
5237 		    "udp_bind: bad ADDR_length length %u", len);
5238 		return (-TBADADDR);
5239 	}
5240 
5241 	/* Is the local address a valid unicast, multicast, or broadcast? */
5242 	if (laddr_type == IPVL_BAD)
5243 		return (EADDRNOTAVAIL);
5244 
5245 	requested_port = port;
5246 
5247 	if (requested_port == 0 || !bind_to_req_port_only)
5248 		bind_to_req_port_only = B_FALSE;
5249 	else		/* T_BIND_REQ and requested_port != 0 */
5250 		bind_to_req_port_only = B_TRUE;
5251 
5252 	if (requested_port == 0) {
5253 		/*
5254 		 * If the application passed in zero for the port number, it
5255 		 * doesn't care which port number we bind to. Get one in the
5256 		 * valid range.
5257 		 */
5258 		if (connp->conn_anon_priv_bind) {
5259 			port = udp_get_next_priv_port(udp);
5260 		} else {
5261 			port = udp_update_next_port(udp,
5262 			    us->us_next_port_to_try, B_TRUE);
5263 		}
5264 	} else {
5265 		/*
5266 		 * If the port is in the well-known privileged range,
5267 		 * make sure the caller was privileged.
5268 		 */
5269 		int i;
5270 		boolean_t priv = B_FALSE;
5271 
5272 		if (port < us->us_smallest_nonpriv_port) {
5273 			priv = B_TRUE;
5274 		} else {
5275 			for (i = 0; i < us->us_num_epriv_ports; i++) {
5276 				if (port == us->us_epriv_ports[i]) {
5277 					priv = B_TRUE;
5278 					break;
5279 				}
5280 			}
5281 		}
5282 
5283 		if (priv) {
5284 			if (secpolicy_net_privaddr(cr, port, IPPROTO_UDP) != 0)
5285 				return (-TACCES);
5286 		}
5287 	}
5288 
5289 	if (port == 0)
5290 		return (-TNOADDR);
5291 
5292 	/*
5293 	 * The state must be TS_UNBND. TPI mandates that users must send
5294 	 * TPI primitives only 1 at a time and wait for the response before
5295 	 * sending the next primitive.
5296 	 */
5297 	mutex_enter(&connp->conn_lock);
5298 	if (udp->udp_state != TS_UNBND) {
5299 		mutex_exit(&connp->conn_lock);
5300 		(void) strlog(UDP_MOD_ID, 0, 1, SL_ERROR|SL_TRACE,
5301 		    "udp_bind: bad state, %u", udp->udp_state);
5302 		return (-TOUTSTATE);
5303 	}
5304 	/*
5305 	 * Copy the source address into our udp structure. This address
5306 	 * may still be zero; if so, IP will fill in the correct address
5307 	 * each time an outbound packet is passed to it. Since the udp is
5308 	 * not yet in the bind hash list, we don't grab the uf_lock to
5309 	 * change conn_ipversion
5310 	 */
5311 	if (connp->conn_family == AF_INET) {
5312 		ASSERT(sin != NULL);
5313 		ASSERT(connp->conn_ixa->ixa_flags & IXAF_IS_IPV4);
5314 	} else {
5315 		if (IN6_IS_ADDR_V4MAPPED(&v6src)) {
5316 			/*
5317 			 * no need to hold the uf_lock to set the conn_ipversion
5318 			 * since we are not yet in the fanout list
5319 			 */
5320 			connp->conn_ipversion = IPV4_VERSION;
5321 			connp->conn_ixa->ixa_flags |= IXAF_IS_IPV4;
5322 		} else {
5323 			connp->conn_ipversion = IPV6_VERSION;
5324 			connp->conn_ixa->ixa_flags &= ~IXAF_IS_IPV4;
5325 		}
5326 	}
5327 
5328 	/*
5329 	 * If conn_reuseaddr is not set, then we have to make sure that
5330 	 * the IP address and port number the application requested
5331 	 * (or we selected for the application) is not being used by
5332 	 * another stream.  If another stream is already using the
5333 	 * requested IP address and port, the behavior depends on
5334 	 * "bind_to_req_port_only". If set the bind fails; otherwise we
5335 	 * search for any an unused port to bind to the stream.
5336 	 *
5337 	 * As per the BSD semantics, as modified by the Deering multicast
5338 	 * changes, if udp_reuseaddr is set, then we allow multiple binds
5339 	 * to the same port independent of the local IP address.
5340 	 *
5341 	 * This is slightly different than in SunOS 4.X which did not
5342 	 * support IP multicast. Note that the change implemented by the
5343 	 * Deering multicast code effects all binds - not only binding
5344 	 * to IP multicast addresses.
5345 	 *
5346 	 * Note that when binding to port zero we ignore SO_REUSEADDR in
5347 	 * order to guarantee a unique port.
5348 	 */
5349 
5350 	count = 0;
5351 	if (connp->conn_anon_priv_bind) {
5352 		/*
5353 		 * loopmax = (IPPORT_RESERVED-1) -
5354 		 *    us->us_min_anonpriv_port + 1
5355 		 */
5356 		loopmax = IPPORT_RESERVED - us->us_min_anonpriv_port;
5357 	} else {
5358 		loopmax = us->us_largest_anon_port -
5359 		    us->us_smallest_anon_port + 1;
5360 	}
5361 
5362 	is_inaddr_any = V6_OR_V4_INADDR_ANY(v6src);
5363 
5364 	for (;;) {
5365 		udp_t		*udp1;
5366 		boolean_t	found_exclbind = B_FALSE;
5367 		conn_t		*connp1;
5368 
5369 		/*
5370 		 * Walk through the list of udp streams bound to
5371 		 * requested port with the same IP address.
5372 		 */
5373 		lport = htons(port);
5374 		udpf = &us->us_bind_fanout[UDP_BIND_HASH(lport,
5375 		    us->us_bind_fanout_size)];
5376 		mutex_enter(&udpf->uf_lock);
5377 		for (udp1 = udpf->uf_udp; udp1 != NULL;
5378 		    udp1 = udp1->udp_bind_hash) {
5379 			connp1 = udp1->udp_connp;
5380 
5381 			if (lport != connp1->conn_lport)
5382 				continue;
5383 
5384 			/*
5385 			 * On a labeled system, we must treat bindings to ports
5386 			 * on shared IP addresses by sockets with MAC exemption
5387 			 * privilege as being in all zones, as there's
5388 			 * otherwise no way to identify the right receiver.
5389 			 */
5390 			if (!IPCL_BIND_ZONE_MATCH(connp1, connp))
5391 				continue;
5392 
5393 			/*
5394 			 * If UDP_EXCLBIND is set for either the bound or
5395 			 * binding endpoint, the semantics of bind
5396 			 * is changed according to the following chart.
5397 			 *
5398 			 * spec = specified address (v4 or v6)
5399 			 * unspec = unspecified address (v4 or v6)
5400 			 * A = specified addresses are different for endpoints
5401 			 *
5402 			 * bound	bind to		allowed?
5403 			 * -------------------------------------
5404 			 * unspec	unspec		no
5405 			 * unspec	spec		no
5406 			 * spec		unspec		no
5407 			 * spec		spec		yes if A
5408 			 *
5409 			 * For labeled systems, SO_MAC_EXEMPT behaves the same
5410 			 * as UDP_EXCLBIND, except that zoneid is ignored.
5411 			 */
5412 			if (connp1->conn_exclbind || connp->conn_exclbind ||
5413 			    IPCL_CONNS_MAC(udp1->udp_connp, connp)) {
5414 				if (V6_OR_V4_INADDR_ANY(
5415 				    connp1->conn_bound_addr_v6) ||
5416 				    is_inaddr_any ||
5417 				    IN6_ARE_ADDR_EQUAL(
5418 				    &connp1->conn_bound_addr_v6,
5419 				    &v6src)) {
5420 					found_exclbind = B_TRUE;
5421 					break;
5422 				}
5423 				continue;
5424 			}
5425 
5426 			/*
5427 			 * Check ipversion to allow IPv4 and IPv6 sockets to
5428 			 * have disjoint port number spaces.
5429 			 */
5430 			if (connp->conn_ipversion != connp1->conn_ipversion) {
5431 
5432 				/*
5433 				 * On the first time through the loop, if the
5434 				 * the user intentionally specified a
5435 				 * particular port number, then ignore any
5436 				 * bindings of the other protocol that may
5437 				 * conflict. This allows the user to bind IPv6
5438 				 * alone and get both v4 and v6, or bind both
5439 				 * both and get each seperately. On subsequent
5440 				 * times through the loop, we're checking a
5441 				 * port that we chose (not the user) and thus
5442 				 * we do not allow casual duplicate bindings.
5443 				 */
5444 				if (count == 0 && requested_port != 0)
5445 					continue;
5446 			}
5447 
5448 			/*
5449 			 * No difference depending on SO_REUSEADDR.
5450 			 *
5451 			 * If existing port is bound to a
5452 			 * non-wildcard IP address and
5453 			 * the requesting stream is bound to
5454 			 * a distinct different IP addresses
5455 			 * (non-wildcard, also), keep going.
5456 			 */
5457 			if (!is_inaddr_any &&
5458 			    !V6_OR_V4_INADDR_ANY(connp1->conn_bound_addr_v6) &&
5459 			    !IN6_ARE_ADDR_EQUAL(&connp1->conn_laddr_v6,
5460 			    &v6src)) {
5461 				continue;
5462 			}
5463 			break;
5464 		}
5465 
5466 		if (!found_exclbind &&
5467 		    (connp->conn_reuseaddr && requested_port != 0)) {
5468 			break;
5469 		}
5470 
5471 		if (udp1 == NULL) {
5472 			/*
5473 			 * No other stream has this IP address
5474 			 * and port number. We can use it.
5475 			 */
5476 			break;
5477 		}
5478 		mutex_exit(&udpf->uf_lock);
5479 		if (bind_to_req_port_only) {
5480 			/*
5481 			 * We get here only when requested port
5482 			 * is bound (and only first  of the for()
5483 			 * loop iteration).
5484 			 *
5485 			 * The semantics of this bind request
5486 			 * require it to fail so we return from
5487 			 * the routine (and exit the loop).
5488 			 *
5489 			 */
5490 			mutex_exit(&connp->conn_lock);
5491 			return (-TADDRBUSY);
5492 		}
5493 
5494 		if (connp->conn_anon_priv_bind) {
5495 			port = udp_get_next_priv_port(udp);
5496 		} else {
5497 			if ((count == 0) && (requested_port != 0)) {
5498 				/*
5499 				 * If the application wants us to find
5500 				 * a port, get one to start with. Set
5501 				 * requested_port to 0, so that we will
5502 				 * update us->us_next_port_to_try below.
5503 				 */
5504 				port = udp_update_next_port(udp,
5505 				    us->us_next_port_to_try, B_TRUE);
5506 				requested_port = 0;
5507 			} else {
5508 				port = udp_update_next_port(udp, port + 1,
5509 				    B_FALSE);
5510 			}
5511 		}
5512 
5513 		if (port == 0 || ++count >= loopmax) {
5514 			/*
5515 			 * We've tried every possible port number and
5516 			 * there are none available, so send an error
5517 			 * to the user.
5518 			 */
5519 			mutex_exit(&connp->conn_lock);
5520 			return (-TNOADDR);
5521 		}
5522 	}
5523 
5524 	/*
5525 	 * Copy the source address into our udp structure.  This address
5526 	 * may still be zero; if so, ip_attr_connect will fill in the correct
5527 	 * address when a packet is about to be sent.
5528 	 * If we are binding to a broadcast or multicast address then
5529 	 * we just set the conn_bound_addr since we don't want to use
5530 	 * that as the source address when sending.
5531 	 */
5532 	connp->conn_bound_addr_v6 = v6src;
5533 	connp->conn_laddr_v6 = v6src;
5534 	if (scopeid != 0) {
5535 		connp->conn_ixa->ixa_flags |= IXAF_SCOPEID_SET;
5536 		connp->conn_ixa->ixa_scopeid = scopeid;
5537 		connp->conn_incoming_ifindex = scopeid;
5538 	} else {
5539 		connp->conn_ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
5540 		connp->conn_incoming_ifindex = connp->conn_bound_if;
5541 	}
5542 
5543 	switch (laddr_type) {
5544 	case IPVL_UNICAST_UP:
5545 	case IPVL_UNICAST_DOWN:
5546 		connp->conn_saddr_v6 = v6src;
5547 		connp->conn_mcbc_bind = B_FALSE;
5548 		break;
5549 	case IPVL_MCAST:
5550 	case IPVL_BCAST:
5551 		/* ip_set_destination will pick a source address later */
5552 		connp->conn_saddr_v6 = ipv6_all_zeros;
5553 		connp->conn_mcbc_bind = B_TRUE;
5554 		break;
5555 	}
5556 
5557 	/* Any errors after this point should use late_error */
5558 	connp->conn_lport = lport;
5559 
5560 	/*
5561 	 * Now reset the next anonymous port if the application requested
5562 	 * an anonymous port, or we handed out the next anonymous port.
5563 	 */
5564 	if ((requested_port == 0) && (!connp->conn_anon_priv_bind)) {
5565 		us->us_next_port_to_try = port + 1;
5566 	}
5567 
5568 	/* Initialize the T_BIND_ACK. */
5569 	if (connp->conn_family == AF_INET) {
5570 		sin->sin_port = connp->conn_lport;
5571 	} else {
5572 		sin6->sin6_port = connp->conn_lport;
5573 	}
5574 	udp->udp_state = TS_IDLE;
5575 	udp_bind_hash_insert(udpf, udp);
5576 	mutex_exit(&udpf->uf_lock);
5577 	mutex_exit(&connp->conn_lock);
5578 
5579 	if (cl_inet_bind) {
5580 		/*
5581 		 * Running in cluster mode - register bind information
5582 		 */
5583 		if (connp->conn_ipversion == IPV4_VERSION) {
5584 			(*cl_inet_bind)(connp->conn_netstack->netstack_stackid,
5585 			    IPPROTO_UDP, AF_INET, (uint8_t *)&v4src,
5586 			    (in_port_t)connp->conn_lport, NULL);
5587 		} else {
5588 			(*cl_inet_bind)(connp->conn_netstack->netstack_stackid,
5589 			    IPPROTO_UDP, AF_INET6, (uint8_t *)&v6src,
5590 			    (in_port_t)connp->conn_lport, NULL);
5591 		}
5592 	}
5593 
5594 	mutex_enter(&connp->conn_lock);
5595 	connp->conn_anon_port = (is_system_labeled() && requested_port == 0);
5596 	if (is_system_labeled() && (!connp->conn_anon_port ||
5597 	    connp->conn_anon_mlp)) {
5598 		uint16_t mlpport;
5599 		zone_t *zone;
5600 
5601 		zone = crgetzone(cr);
5602 		connp->conn_mlp_type =
5603 		    connp->conn_recv_ancillary.crb_recvucred ? mlptBoth :
5604 		    mlptSingle;
5605 		addrtype = tsol_mlp_addr_type(
5606 		    connp->conn_allzones ? ALL_ZONES : zone->zone_id,
5607 		    IPV6_VERSION, &v6src, us->us_netstack->netstack_ip);
5608 		if (addrtype == mlptSingle) {
5609 			error = -TNOADDR;
5610 			mutex_exit(&connp->conn_lock);
5611 			goto late_error;
5612 		}
5613 		mlpport = connp->conn_anon_port ? PMAPPORT : port;
5614 		mlptype = tsol_mlp_port_type(zone, IPPROTO_UDP, mlpport,
5615 		    addrtype);
5616 
5617 		/*
5618 		 * It is a coding error to attempt to bind an MLP port
5619 		 * without first setting SOL_SOCKET/SCM_UCRED.
5620 		 */
5621 		if (mlptype != mlptSingle &&
5622 		    connp->conn_mlp_type == mlptSingle) {
5623 			error = EINVAL;
5624 			mutex_exit(&connp->conn_lock);
5625 			goto late_error;
5626 		}
5627 
5628 		/*
5629 		 * It is an access violation to attempt to bind an MLP port
5630 		 * without NET_BINDMLP privilege.
5631 		 */
5632 		if (mlptype != mlptSingle &&
5633 		    secpolicy_net_bindmlp(cr) != 0) {
5634 			if (connp->conn_debug) {
5635 				(void) strlog(UDP_MOD_ID, 0, 1,
5636 				    SL_ERROR|SL_TRACE,
5637 				    "udp_bind: no priv for multilevel port %d",
5638 				    mlpport);
5639 			}
5640 			error = -TACCES;
5641 			mutex_exit(&connp->conn_lock);
5642 			goto late_error;
5643 		}
5644 
5645 		/*
5646 		 * If we're specifically binding a shared IP address and the
5647 		 * port is MLP on shared addresses, then check to see if this
5648 		 * zone actually owns the MLP.  Reject if not.
5649 		 */
5650 		if (mlptype == mlptShared && addrtype == mlptShared) {
5651 			/*
5652 			 * No need to handle exclusive-stack zones since
5653 			 * ALL_ZONES only applies to the shared stack.
5654 			 */
5655 			zoneid_t mlpzone;
5656 
5657 			mlpzone = tsol_mlp_findzone(IPPROTO_UDP,
5658 			    htons(mlpport));
5659 			if (connp->conn_zoneid != mlpzone) {
5660 				if (connp->conn_debug) {
5661 					(void) strlog(UDP_MOD_ID, 0, 1,
5662 					    SL_ERROR|SL_TRACE,
5663 					    "udp_bind: attempt to bind port "
5664 					    "%d on shared addr in zone %d "
5665 					    "(should be %d)",
5666 					    mlpport, connp->conn_zoneid,
5667 					    mlpzone);
5668 				}
5669 				error = -TACCES;
5670 				mutex_exit(&connp->conn_lock);
5671 				goto late_error;
5672 			}
5673 		}
5674 		if (connp->conn_anon_port) {
5675 			error = tsol_mlp_anon(zone, mlptype, connp->conn_proto,
5676 			    port, B_TRUE);
5677 			if (error != 0) {
5678 				if (connp->conn_debug) {
5679 					(void) strlog(UDP_MOD_ID, 0, 1,
5680 					    SL_ERROR|SL_TRACE,
5681 					    "udp_bind: cannot establish anon "
5682 					    "MLP for port %d", port);
5683 				}
5684 				error = -TACCES;
5685 				mutex_exit(&connp->conn_lock);
5686 				goto late_error;
5687 			}
5688 		}
5689 		connp->conn_mlp_type = mlptype;
5690 	}
5691 
5692 	/*
5693 	 * We create an initial header template here to make a subsequent
5694 	 * sendto have a starting point. Since conn_last_dst is zero the
5695 	 * first sendto will always follow the 'dst changed' code path.
5696 	 * Note that we defer massaging options and the related checksum
5697 	 * adjustment until we have a destination address.
5698 	 */
5699 	error = udp_build_hdr_template(connp, &connp->conn_saddr_v6,
5700 	    &connp->conn_faddr_v6, connp->conn_fport, connp->conn_flowinfo);
5701 	if (error != 0) {
5702 		mutex_exit(&connp->conn_lock);
5703 		goto late_error;
5704 	}
5705 	/* Just in case */
5706 	connp->conn_faddr_v6 = ipv6_all_zeros;
5707 	connp->conn_fport = 0;
5708 	connp->conn_v6lastdst = ipv6_all_zeros;
5709 	mutex_exit(&connp->conn_lock);
5710 
5711 	error = ip_laddr_fanout_insert(connp);
5712 	if (error != 0)
5713 		goto late_error;
5714 
5715 	/* Bind succeeded */
5716 	return (0);
5717 
5718 late_error:
5719 	/* We had already picked the port number, and then the bind failed */
5720 	mutex_enter(&connp->conn_lock);
5721 	udpf = &us->us_bind_fanout[
5722 	    UDP_BIND_HASH(connp->conn_lport,
5723 	    us->us_bind_fanout_size)];
5724 	mutex_enter(&udpf->uf_lock);
5725 	connp->conn_saddr_v6 = ipv6_all_zeros;
5726 	connp->conn_bound_addr_v6 = ipv6_all_zeros;
5727 	connp->conn_laddr_v6 = ipv6_all_zeros;
5728 	if (scopeid != 0) {
5729 		connp->conn_ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
5730 		connp->conn_incoming_ifindex = connp->conn_bound_if;
5731 	}
5732 	udp->udp_state = TS_UNBND;
5733 	udp_bind_hash_remove(udp, B_TRUE);
5734 	connp->conn_lport = 0;
5735 	mutex_exit(&udpf->uf_lock);
5736 	connp->conn_anon_port = B_FALSE;
5737 	connp->conn_mlp_type = mlptSingle;
5738 
5739 	connp->conn_v6lastdst = ipv6_all_zeros;
5740 
5741 	/* Restore the header that was built above - different source address */
5742 	(void) udp_build_hdr_template(connp, &connp->conn_saddr_v6,
5743 	    &connp->conn_faddr_v6, connp->conn_fport, connp->conn_flowinfo);
5744 	mutex_exit(&connp->conn_lock);
5745 	return (error);
5746 }
5747 
5748 int
5749 udp_bind(sock_lower_handle_t proto_handle, struct sockaddr *sa,
5750     socklen_t len, cred_t *cr)
5751 {
5752 	int		error;
5753 	conn_t		*connp;
5754 
5755 	/* All Solaris components should pass a cred for this operation. */
5756 	ASSERT(cr != NULL);
5757 
5758 	connp = (conn_t *)proto_handle;
5759 
5760 	if (sa == NULL)
5761 		error = udp_do_unbind(connp);
5762 	else
5763 		error = udp_do_bind(connp, sa, len, cr, B_TRUE);
5764 
5765 	if (error < 0) {
5766 		if (error == -TOUTSTATE)
5767 			error = EINVAL;
5768 		else
5769 			error = proto_tlitosyserr(-error);
5770 	}
5771 
5772 	return (error);
5773 }
5774 
5775 static int
5776 udp_implicit_bind(conn_t *connp, cred_t *cr)
5777 {
5778 	sin6_t sin6addr;
5779 	sin_t *sin;
5780 	sin6_t *sin6;
5781 	socklen_t len;
5782 	int error;
5783 
5784 	/* All Solaris components should pass a cred for this operation. */
5785 	ASSERT(cr != NULL);
5786 
5787 	if (connp->conn_family == AF_INET) {
5788 		len = sizeof (struct sockaddr_in);
5789 		sin = (sin_t *)&sin6addr;
5790 		*sin = sin_null;
5791 		sin->sin_family = AF_INET;
5792 		sin->sin_addr.s_addr = INADDR_ANY;
5793 	} else {
5794 		ASSERT(connp->conn_family == AF_INET6);
5795 		len = sizeof (sin6_t);
5796 		sin6 = (sin6_t *)&sin6addr;
5797 		*sin6 = sin6_null;
5798 		sin6->sin6_family = AF_INET6;
5799 		V6_SET_ZERO(sin6->sin6_addr);
5800 	}
5801 
5802 	error = udp_do_bind(connp, (struct sockaddr *)&sin6addr, len,
5803 	    cr, B_FALSE);
5804 	return ((error < 0) ? proto_tlitosyserr(-error) : error);
5805 }
5806 
5807 /*
5808  * This routine removes a port number association from a stream. It
5809  * is called by udp_unbind and udp_tpi_unbind.
5810  */
5811 static int
5812 udp_do_unbind(conn_t *connp)
5813 {
5814 	udp_t 		*udp = connp->conn_udp;
5815 	udp_fanout_t	*udpf;
5816 	udp_stack_t	*us = udp->udp_us;
5817 
5818 	if (cl_inet_unbind != NULL) {
5819 		/*
5820 		 * Running in cluster mode - register unbind information
5821 		 */
5822 		if (connp->conn_ipversion == IPV4_VERSION) {
5823 			(*cl_inet_unbind)(
5824 			    connp->conn_netstack->netstack_stackid,
5825 			    IPPROTO_UDP, AF_INET,
5826 			    (uint8_t *)(&V4_PART_OF_V6(connp->conn_laddr_v6)),
5827 			    (in_port_t)connp->conn_lport, NULL);
5828 		} else {
5829 			(*cl_inet_unbind)(
5830 			    connp->conn_netstack->netstack_stackid,
5831 			    IPPROTO_UDP, AF_INET6,
5832 			    (uint8_t *)&(connp->conn_laddr_v6),
5833 			    (in_port_t)connp->conn_lport, NULL);
5834 		}
5835 	}
5836 
5837 	mutex_enter(&connp->conn_lock);
5838 	/* If a bind has not been done, we can't unbind. */
5839 	if (udp->udp_state == TS_UNBND) {
5840 		mutex_exit(&connp->conn_lock);
5841 		return (-TOUTSTATE);
5842 	}
5843 	udpf = &us->us_bind_fanout[UDP_BIND_HASH(connp->conn_lport,
5844 	    us->us_bind_fanout_size)];
5845 	mutex_enter(&udpf->uf_lock);
5846 	udp_bind_hash_remove(udp, B_TRUE);
5847 	connp->conn_saddr_v6 = ipv6_all_zeros;
5848 	connp->conn_bound_addr_v6 = ipv6_all_zeros;
5849 	connp->conn_laddr_v6 = ipv6_all_zeros;
5850 	connp->conn_mcbc_bind = B_FALSE;
5851 	connp->conn_lport = 0;
5852 	/* In case we were also connected */
5853 	connp->conn_faddr_v6 = ipv6_all_zeros;
5854 	connp->conn_fport = 0;
5855 	mutex_exit(&udpf->uf_lock);
5856 
5857 	connp->conn_v6lastdst = ipv6_all_zeros;
5858 	udp->udp_state = TS_UNBND;
5859 
5860 	(void) udp_build_hdr_template(connp, &connp->conn_saddr_v6,
5861 	    &connp->conn_faddr_v6, connp->conn_fport, connp->conn_flowinfo);
5862 	mutex_exit(&connp->conn_lock);
5863 
5864 	ip_unbind(connp);
5865 
5866 	return (0);
5867 }
5868 
5869 /*
5870  * It associates a default destination address with the stream.
5871  */
5872 static int
5873 udp_do_connect(conn_t *connp, const struct sockaddr *sa, socklen_t len,
5874     cred_t *cr, pid_t pid)
5875 {
5876 	sin6_t		*sin6;
5877 	sin_t		*sin;
5878 	in6_addr_t 	v6dst;
5879 	ipaddr_t 	v4dst;
5880 	uint16_t 	dstport;
5881 	uint32_t 	flowinfo;
5882 	udp_fanout_t	*udpf;
5883 	udp_t		*udp, *udp1;
5884 	ushort_t	ipversion;
5885 	udp_stack_t	*us;
5886 	int		error;
5887 	conn_t		*connp1;
5888 	ip_xmit_attr_t	*ixa;
5889 	uint_t		scopeid = 0;
5890 	uint_t		srcid = 0;
5891 	in6_addr_t	v6src = connp->conn_saddr_v6;
5892 
5893 	udp = connp->conn_udp;
5894 	us = udp->udp_us;
5895 
5896 	/*
5897 	 * Address has been verified by the caller
5898 	 */
5899 	switch (len) {
5900 	default:
5901 		/*
5902 		 * Should never happen
5903 		 */
5904 		return (EINVAL);
5905 
5906 	case sizeof (sin_t):
5907 		sin = (sin_t *)sa;
5908 		v4dst = sin->sin_addr.s_addr;
5909 		dstport = sin->sin_port;
5910 		IN6_IPADDR_TO_V4MAPPED(v4dst, &v6dst);
5911 		ASSERT(connp->conn_ipversion == IPV4_VERSION);
5912 		ipversion = IPV4_VERSION;
5913 		break;
5914 
5915 	case sizeof (sin6_t):
5916 		sin6 = (sin6_t *)sa;
5917 		v6dst = sin6->sin6_addr;
5918 		dstport = sin6->sin6_port;
5919 		srcid = sin6->__sin6_src_id;
5920 		if (srcid != 0 && IN6_IS_ADDR_UNSPECIFIED(&v6src)) {
5921 			ip_srcid_find_id(srcid, &v6src, IPCL_ZONEID(connp),
5922 			    connp->conn_netstack);
5923 		}
5924 		if (IN6_IS_ADDR_V4MAPPED(&v6dst)) {
5925 			if (connp->conn_ipv6_v6only)
5926 				return (EADDRNOTAVAIL);
5927 
5928 			/*
5929 			 * Destination adress is mapped IPv6 address.
5930 			 * Source bound address should be unspecified or
5931 			 * IPv6 mapped address as well.
5932 			 */
5933 			if (!IN6_IS_ADDR_UNSPECIFIED(
5934 			    &connp->conn_bound_addr_v6) &&
5935 			    !IN6_IS_ADDR_V4MAPPED(&connp->conn_bound_addr_v6)) {
5936 				return (EADDRNOTAVAIL);
5937 			}
5938 			IN6_V4MAPPED_TO_IPADDR(&v6dst, v4dst);
5939 			ipversion = IPV4_VERSION;
5940 			flowinfo = 0;
5941 		} else {
5942 			ipversion = IPV6_VERSION;
5943 			flowinfo = sin6->sin6_flowinfo;
5944 			if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
5945 				scopeid = sin6->sin6_scope_id;
5946 		}
5947 		break;
5948 	}
5949 
5950 	if (dstport == 0)
5951 		return (-TBADADDR);
5952 
5953 	/*
5954 	 * If there is a different thread using conn_ixa then we get a new
5955 	 * copy and cut the old one loose from conn_ixa. Otherwise we use
5956 	 * conn_ixa and prevent any other thread from using/changing it.
5957 	 * Once connect() is done other threads can use conn_ixa since the
5958 	 * refcnt will be back at one.
5959 	 */
5960 	ixa = conn_get_ixa(connp, B_TRUE);
5961 	if (ixa == NULL)
5962 		return (ENOMEM);
5963 
5964 	ASSERT(ixa->ixa_refcnt >= 2);
5965 	ASSERT(ixa == connp->conn_ixa);
5966 
5967 	mutex_enter(&connp->conn_lock);
5968 	/*
5969 	 * This udp_t must have bound to a port already before doing a connect.
5970 	 * Reject if a connect is in progress (we drop conn_lock during
5971 	 * udp_do_connect).
5972 	 */
5973 	if (udp->udp_state == TS_UNBND || udp->udp_state == TS_WCON_CREQ) {
5974 		mutex_exit(&connp->conn_lock);
5975 		(void) strlog(UDP_MOD_ID, 0, 1, SL_ERROR|SL_TRACE,
5976 		    "udp_connect: bad state, %u", udp->udp_state);
5977 		ixa_refrele(ixa);
5978 		return (-TOUTSTATE);
5979 	}
5980 	ASSERT(connp->conn_lport != 0 && udp->udp_ptpbhn != NULL);
5981 
5982 	udpf = &us->us_bind_fanout[UDP_BIND_HASH(connp->conn_lport,
5983 	    us->us_bind_fanout_size)];
5984 
5985 	mutex_enter(&udpf->uf_lock);
5986 	if (udp->udp_state == TS_DATA_XFER) {
5987 		/* Already connected - clear out state */
5988 		if (connp->conn_mcbc_bind)
5989 			connp->conn_saddr_v6 = ipv6_all_zeros;
5990 		else
5991 			connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
5992 		connp->conn_laddr_v6 = connp->conn_bound_addr_v6;
5993 		connp->conn_faddr_v6 = ipv6_all_zeros;
5994 		connp->conn_fport = 0;
5995 		udp->udp_state = TS_IDLE;
5996 	}
5997 
5998 	connp->conn_fport = dstport;
5999 	connp->conn_ipversion = ipversion;
6000 	if (ipversion == IPV4_VERSION) {
6001 		/*
6002 		 * Interpret a zero destination to mean loopback.
6003 		 * Update the T_CONN_REQ (sin/sin6) since it is used to
6004 		 * generate the T_CONN_CON.
6005 		 */
6006 		if (v4dst == INADDR_ANY) {
6007 			v4dst = htonl(INADDR_LOOPBACK);
6008 			IN6_IPADDR_TO_V4MAPPED(v4dst, &v6dst);
6009 			if (connp->conn_family == AF_INET) {
6010 				sin->sin_addr.s_addr = v4dst;
6011 			} else {
6012 				sin6->sin6_addr = v6dst;
6013 			}
6014 		}
6015 		connp->conn_faddr_v6 = v6dst;
6016 		connp->conn_flowinfo = 0;
6017 	} else {
6018 		ASSERT(connp->conn_ipversion == IPV6_VERSION);
6019 		/*
6020 		 * Interpret a zero destination to mean loopback.
6021 		 * Update the T_CONN_REQ (sin/sin6) since it is used to
6022 		 * generate the T_CONN_CON.
6023 		 */
6024 		if (IN6_IS_ADDR_UNSPECIFIED(&v6dst)) {
6025 			v6dst = ipv6_loopback;
6026 			sin6->sin6_addr = v6dst;
6027 		}
6028 		connp->conn_faddr_v6 = v6dst;
6029 		connp->conn_flowinfo = flowinfo;
6030 	}
6031 	mutex_exit(&udpf->uf_lock);
6032 
6033 	/*
6034 	 * We update our cred/cpid based on the caller of connect
6035 	 */
6036 	if (connp->conn_cred != cr) {
6037 		crhold(cr);
6038 		crfree(connp->conn_cred);
6039 		connp->conn_cred = cr;
6040 	}
6041 	connp->conn_cpid = pid;
6042 	ASSERT(!(ixa->ixa_free_flags & IXA_FREE_CRED));
6043 	ixa->ixa_cred = cr;
6044 	ixa->ixa_cpid = pid;
6045 	if (is_system_labeled()) {
6046 		/* We need to restart with a label based on the cred */
6047 		ip_xmit_attr_restore_tsl(ixa, ixa->ixa_cred);
6048 	}
6049 
6050 	if (scopeid != 0) {
6051 		ixa->ixa_flags |= IXAF_SCOPEID_SET;
6052 		ixa->ixa_scopeid = scopeid;
6053 		connp->conn_incoming_ifindex = scopeid;
6054 	} else {
6055 		ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
6056 		connp->conn_incoming_ifindex = connp->conn_bound_if;
6057 	}
6058 	/*
6059 	 * conn_connect will drop conn_lock and reacquire it.
6060 	 * To prevent a send* from messing with this udp_t while the lock
6061 	 * is dropped we set udp_state and clear conn_v6lastdst.
6062 	 * That will make all send* fail with EISCONN.
6063 	 */
6064 	connp->conn_v6lastdst = ipv6_all_zeros;
6065 	udp->udp_state = TS_WCON_CREQ;
6066 
6067 	error = conn_connect(connp, NULL, IPDF_ALLOW_MCBC);
6068 	mutex_exit(&connp->conn_lock);
6069 	if (error != 0)
6070 		goto connect_failed;
6071 
6072 	/*
6073 	 * The addresses have been verified. Time to insert in
6074 	 * the correct fanout list.
6075 	 */
6076 	error = ipcl_conn_insert(connp);
6077 	if (error != 0)
6078 		goto connect_failed;
6079 
6080 	mutex_enter(&connp->conn_lock);
6081 	error = udp_build_hdr_template(connp, &connp->conn_saddr_v6,
6082 	    &connp->conn_faddr_v6, connp->conn_fport, connp->conn_flowinfo);
6083 	if (error != 0) {
6084 		mutex_exit(&connp->conn_lock);
6085 		goto connect_failed;
6086 	}
6087 
6088 	udp->udp_state = TS_DATA_XFER;
6089 	/* Record this as the "last" send even though we haven't sent any */
6090 	connp->conn_v6lastdst = connp->conn_faddr_v6;
6091 	connp->conn_lastipversion = connp->conn_ipversion;
6092 	connp->conn_lastdstport = connp->conn_fport;
6093 	connp->conn_lastflowinfo = connp->conn_flowinfo;
6094 	connp->conn_lastscopeid = scopeid;
6095 	connp->conn_lastsrcid = srcid;
6096 	/* Also remember a source to use together with lastdst */
6097 	connp->conn_v6lastsrc = v6src;
6098 	mutex_exit(&connp->conn_lock);
6099 
6100 	/*
6101 	 * We've picked a source address above. Now we can
6102 	 * verify that the src/port/dst/port is unique for all
6103 	 * connections in TS_DATA_XFER, skipping ourselves.
6104 	 */
6105 	mutex_enter(&udpf->uf_lock);
6106 	for (udp1 = udpf->uf_udp; udp1 != NULL; udp1 = udp1->udp_bind_hash) {
6107 		if (udp1->udp_state != TS_DATA_XFER)
6108 			continue;
6109 
6110 		if (udp1 == udp)
6111 			continue;
6112 
6113 		connp1 = udp1->udp_connp;
6114 		if (connp->conn_lport != connp1->conn_lport ||
6115 		    connp->conn_ipversion != connp1->conn_ipversion ||
6116 		    dstport != connp1->conn_fport ||
6117 		    !IN6_ARE_ADDR_EQUAL(&connp->conn_laddr_v6,
6118 		    &connp1->conn_laddr_v6) ||
6119 		    !IN6_ARE_ADDR_EQUAL(&v6dst, &connp1->conn_faddr_v6) ||
6120 		    !(IPCL_ZONE_MATCH(connp, connp1->conn_zoneid) ||
6121 		    IPCL_ZONE_MATCH(connp1, connp->conn_zoneid)))
6122 			continue;
6123 		mutex_exit(&udpf->uf_lock);
6124 		error = -TBADADDR;
6125 		goto connect_failed;
6126 	}
6127 	if (cl_inet_connect2 != NULL) {
6128 		CL_INET_UDP_CONNECT(connp, B_TRUE, &v6dst, dstport, error);
6129 		if (error != 0) {
6130 			mutex_exit(&udpf->uf_lock);
6131 			error = -TBADADDR;
6132 			goto connect_failed;
6133 		}
6134 	}
6135 	mutex_exit(&udpf->uf_lock);
6136 
6137 	ixa_refrele(ixa);
6138 	return (0);
6139 
6140 connect_failed:
6141 	if (ixa != NULL)
6142 		ixa_refrele(ixa);
6143 	mutex_enter(&connp->conn_lock);
6144 	mutex_enter(&udpf->uf_lock);
6145 	udp->udp_state = TS_IDLE;
6146 	connp->conn_faddr_v6 = ipv6_all_zeros;
6147 	connp->conn_fport = 0;
6148 	/* In case the source address was set above */
6149 	if (connp->conn_mcbc_bind)
6150 		connp->conn_saddr_v6 = ipv6_all_zeros;
6151 	else
6152 		connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
6153 	connp->conn_laddr_v6 = connp->conn_bound_addr_v6;
6154 	mutex_exit(&udpf->uf_lock);
6155 
6156 	connp->conn_v6lastdst = ipv6_all_zeros;
6157 	connp->conn_flowinfo = 0;
6158 
6159 	(void) udp_build_hdr_template(connp, &connp->conn_saddr_v6,
6160 	    &connp->conn_faddr_v6, connp->conn_fport, connp->conn_flowinfo);
6161 	mutex_exit(&connp->conn_lock);
6162 	return (error);
6163 }
6164 
6165 static int
6166 udp_connect(sock_lower_handle_t proto_handle, const struct sockaddr *sa,
6167     socklen_t len, sock_connid_t *id, cred_t *cr)
6168 {
6169 	conn_t	*connp = (conn_t *)proto_handle;
6170 	udp_t	*udp = connp->conn_udp;
6171 	int	error;
6172 	boolean_t did_bind = B_FALSE;
6173 	pid_t	pid = curproc->p_pid;
6174 
6175 	/* All Solaris components should pass a cred for this operation. */
6176 	ASSERT(cr != NULL);
6177 
6178 	if (sa == NULL) {
6179 		/*
6180 		 * Disconnect
6181 		 * Make sure we are connected
6182 		 */
6183 		if (udp->udp_state != TS_DATA_XFER)
6184 			return (EINVAL);
6185 
6186 		error = udp_disconnect(connp);
6187 		return (error);
6188 	}
6189 
6190 	error = proto_verify_ip_addr(connp->conn_family, sa, len);
6191 	if (error != 0)
6192 		goto done;
6193 
6194 	/* do an implicit bind if necessary */
6195 	if (udp->udp_state == TS_UNBND) {
6196 		error = udp_implicit_bind(connp, cr);
6197 		/*
6198 		 * We could be racing with an actual bind, in which case
6199 		 * we would see EPROTO. We cross our fingers and try
6200 		 * to connect.
6201 		 */
6202 		if (!(error == 0 || error == EPROTO))
6203 			goto done;
6204 		did_bind = B_TRUE;
6205 	}
6206 	/*
6207 	 * set SO_DGRAM_ERRIND
6208 	 */
6209 	connp->conn_dgram_errind = B_TRUE;
6210 
6211 	error = udp_do_connect(connp, sa, len, cr, pid);
6212 
6213 	if (error != 0 && did_bind) {
6214 		int unbind_err;
6215 
6216 		unbind_err = udp_do_unbind(connp);
6217 		ASSERT(unbind_err == 0);
6218 	}
6219 
6220 	if (error == 0) {
6221 		*id = 0;
6222 		(*connp->conn_upcalls->su_connected)
6223 		    (connp->conn_upper_handle, 0, NULL, -1);
6224 	} else if (error < 0) {
6225 		error = proto_tlitosyserr(-error);
6226 	}
6227 
6228 done:
6229 	if (error != 0 && udp->udp_state == TS_DATA_XFER) {
6230 		/*
6231 		 * No need to hold locks to set state
6232 		 * after connect failure socket state is undefined
6233 		 * We set the state only to imitate old sockfs behavior
6234 		 */
6235 		udp->udp_state = TS_IDLE;
6236 	}
6237 	return (error);
6238 }
6239 
6240 int
6241 udp_send(sock_lower_handle_t proto_handle, mblk_t *mp, struct nmsghdr *msg,
6242     cred_t *cr)
6243 {
6244 	sin6_t		*sin6;
6245 	sin_t		*sin = NULL;
6246 	uint_t		srcid;
6247 	conn_t		*connp = (conn_t *)proto_handle;
6248 	udp_t		*udp = connp->conn_udp;
6249 	int		error = 0;
6250 	udp_stack_t	*us = udp->udp_us;
6251 	ushort_t	ipversion;
6252 	pid_t		pid = curproc->p_pid;
6253 	ip_xmit_attr_t	*ixa;
6254 
6255 	ASSERT(DB_TYPE(mp) == M_DATA);
6256 
6257 	/* All Solaris components should pass a cred for this operation. */
6258 	ASSERT(cr != NULL);
6259 
6260 	/* do an implicit bind if necessary */
6261 	if (udp->udp_state == TS_UNBND) {
6262 		error = udp_implicit_bind(connp, cr);
6263 		/*
6264 		 * We could be racing with an actual bind, in which case
6265 		 * we would see EPROTO. We cross our fingers and try
6266 		 * to connect.
6267 		 */
6268 		if (!(error == 0 || error == EPROTO)) {
6269 			freemsg(mp);
6270 			return (error);
6271 		}
6272 	}
6273 
6274 	/* Connected? */
6275 	if (msg->msg_name == NULL) {
6276 		if (udp->udp_state != TS_DATA_XFER) {
6277 			BUMP_MIB(&us->us_udp_mib, udpOutErrors);
6278 			return (EDESTADDRREQ);
6279 		}
6280 		if (msg->msg_controllen != 0) {
6281 			error = udp_output_ancillary(connp, NULL, NULL, mp,
6282 			    NULL, msg, cr, pid);
6283 		} else {
6284 			error = udp_output_connected(connp, mp, cr, pid);
6285 		}
6286 		if (us->us_sendto_ignerr)
6287 			return (0);
6288 		else
6289 			return (error);
6290 	}
6291 	if (udp->udp_state == TS_DATA_XFER) {
6292 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
6293 		return (EISCONN);
6294 	}
6295 	error = proto_verify_ip_addr(connp->conn_family,
6296 	    (struct sockaddr *)msg->msg_name, msg->msg_namelen);
6297 	if (error != 0) {
6298 		BUMP_MIB(&us->us_udp_mib, udpOutErrors);
6299 		return (error);
6300 	}
6301 	switch (connp->conn_family) {
6302 	case AF_INET6:
6303 		sin6 = (sin6_t *)msg->msg_name;
6304 
6305 		srcid = sin6->__sin6_src_id;
6306 
6307 		if (!IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
6308 			/*
6309 			 * Destination is a non-IPv4-compatible IPv6 address.
6310 			 * Send out an IPv6 format packet.
6311 			 */
6312 
6313 			/*
6314 			 * If the local address is a mapped address return
6315 			 * an error.
6316 			 * It would be possible to send an IPv6 packet but the
6317 			 * response would never make it back to the application
6318 			 * since it is bound to a mapped address.
6319 			 */
6320 			if (IN6_IS_ADDR_V4MAPPED(&connp->conn_saddr_v6)) {
6321 				BUMP_MIB(&us->us_udp_mib, udpOutErrors);
6322 				return (EADDRNOTAVAIL);
6323 			}
6324 			if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))
6325 				sin6->sin6_addr = ipv6_loopback;
6326 			ipversion = IPV6_VERSION;
6327 		} else {
6328 			if (connp->conn_ipv6_v6only) {
6329 				BUMP_MIB(&us->us_udp_mib, udpOutErrors);
6330 				return (EADDRNOTAVAIL);
6331 			}
6332 
6333 			/*
6334 			 * If the local address is not zero or a mapped address
6335 			 * return an error.  It would be possible to send an
6336 			 * IPv4 packet but the response would never make it
6337 			 * back to the application since it is bound to a
6338 			 * non-mapped address.
6339 			 */
6340 			if (!IN6_IS_ADDR_V4MAPPED(&connp->conn_saddr_v6) &&
6341 			    !IN6_IS_ADDR_UNSPECIFIED(&connp->conn_saddr_v6)) {
6342 				BUMP_MIB(&us->us_udp_mib, udpOutErrors);
6343 				return (EADDRNOTAVAIL);
6344 			}
6345 
6346 			if (V4_PART_OF_V6(sin6->sin6_addr) == INADDR_ANY) {
6347 				V4_PART_OF_V6(sin6->sin6_addr) =
6348 				    htonl(INADDR_LOOPBACK);
6349 			}
6350 			ipversion = IPV4_VERSION;
6351 		}
6352 
6353 		/*
6354 		 * We have to allocate an ip_xmit_attr_t before we grab
6355 		 * conn_lock and we need to hold conn_lock once we've check
6356 		 * conn_same_as_last_v6 to handle concurrent send* calls on a
6357 		 * socket.
6358 		 */
6359 		if (msg->msg_controllen == 0) {
6360 			ixa = conn_get_ixa(connp, B_FALSE);
6361 			if (ixa == NULL) {
6362 				BUMP_MIB(&us->us_udp_mib, udpOutErrors);
6363 				return (ENOMEM);
6364 			}
6365 		} else {
6366 			ixa = NULL;
6367 		}
6368 		mutex_enter(&connp->conn_lock);
6369 		if (udp->udp_delayed_error != 0) {
6370 			sin6_t  *sin2 = (sin6_t *)&udp->udp_delayed_addr;
6371 
6372 			error = udp->udp_delayed_error;
6373 			udp->udp_delayed_error = 0;
6374 
6375 			/* Compare IP address, port, and family */
6376 
6377 			if (sin6->sin6_port == sin2->sin6_port &&
6378 			    IN6_ARE_ADDR_EQUAL(&sin6->sin6_addr,
6379 			    &sin2->sin6_addr) &&
6380 			    sin6->sin6_family == sin2->sin6_family) {
6381 				mutex_exit(&connp->conn_lock);
6382 				BUMP_MIB(&us->us_udp_mib, udpOutErrors);
6383 				if (ixa != NULL)
6384 					ixa_refrele(ixa);
6385 				return (error);
6386 			}
6387 		}
6388 
6389 		if (msg->msg_controllen != 0) {
6390 			mutex_exit(&connp->conn_lock);
6391 			ASSERT(ixa == NULL);
6392 			error = udp_output_ancillary(connp, NULL, sin6, mp,
6393 			    NULL, msg, cr, pid);
6394 		} else if (conn_same_as_last_v6(connp, sin6) &&
6395 		    connp->conn_lastsrcid == srcid &&
6396 		    ipsec_outbound_policy_current(ixa)) {
6397 			/* udp_output_lastdst drops conn_lock */
6398 			error = udp_output_lastdst(connp, mp, cr, pid, ixa);
6399 		} else {
6400 			/* udp_output_newdst drops conn_lock */
6401 			error = udp_output_newdst(connp, mp, NULL, sin6,
6402 			    ipversion, cr, pid, ixa);
6403 		}
6404 		ASSERT(MUTEX_NOT_HELD(&connp->conn_lock));
6405 		if (us->us_sendto_ignerr)
6406 			return (0);
6407 		else
6408 			return (error);
6409 	case AF_INET:
6410 		sin = (sin_t *)msg->msg_name;
6411 
6412 		ipversion = IPV4_VERSION;
6413 
6414 		if (sin->sin_addr.s_addr == INADDR_ANY)
6415 			sin->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
6416 
6417 		/*
6418 		 * We have to allocate an ip_xmit_attr_t before we grab
6419 		 * conn_lock and we need to hold conn_lock once we've check
6420 		 * conn_same_as_last_v6 to handle concurrent send* on a socket.
6421 		 */
6422 		if (msg->msg_controllen == 0) {
6423 			ixa = conn_get_ixa(connp, B_FALSE);
6424 			if (ixa == NULL) {
6425 				BUMP_MIB(&us->us_udp_mib, udpOutErrors);
6426 				return (ENOMEM);
6427 			}
6428 		} else {
6429 			ixa = NULL;
6430 		}
6431 		mutex_enter(&connp->conn_lock);
6432 		if (udp->udp_delayed_error != 0) {
6433 			sin_t  *sin2 = (sin_t *)&udp->udp_delayed_addr;
6434 
6435 			error = udp->udp_delayed_error;
6436 			udp->udp_delayed_error = 0;
6437 
6438 			/* Compare IP address and port */
6439 
6440 			if (sin->sin_port == sin2->sin_port &&
6441 			    sin->sin_addr.s_addr == sin2->sin_addr.s_addr) {
6442 				mutex_exit(&connp->conn_lock);
6443 				BUMP_MIB(&us->us_udp_mib, udpOutErrors);
6444 				if (ixa != NULL)
6445 					ixa_refrele(ixa);
6446 				return (error);
6447 			}
6448 		}
6449 		if (msg->msg_controllen != 0) {
6450 			mutex_exit(&connp->conn_lock);
6451 			ASSERT(ixa == NULL);
6452 			error = udp_output_ancillary(connp, sin, NULL, mp,
6453 			    NULL, msg, cr, pid);
6454 		} else if (conn_same_as_last_v4(connp, sin) &&
6455 		    ipsec_outbound_policy_current(ixa)) {
6456 			/* udp_output_lastdst drops conn_lock */
6457 			error = udp_output_lastdst(connp, mp, cr, pid, ixa);
6458 		} else {
6459 			/* udp_output_newdst drops conn_lock */
6460 			error = udp_output_newdst(connp, mp, sin, NULL,
6461 			    ipversion, cr, pid, ixa);
6462 		}
6463 		ASSERT(MUTEX_NOT_HELD(&connp->conn_lock));
6464 		if (us->us_sendto_ignerr)
6465 			return (0);
6466 		else
6467 			return (error);
6468 	default:
6469 		return (EINVAL);
6470 	}
6471 }
6472 
6473 int
6474 udp_fallback(sock_lower_handle_t proto_handle, queue_t *q,
6475     boolean_t issocket, so_proto_quiesced_cb_t quiesced_cb)
6476 {
6477 	conn_t 	*connp = (conn_t *)proto_handle;
6478 	udp_t	*udp;
6479 	struct T_capability_ack tca;
6480 	struct sockaddr_in6 laddr, faddr;
6481 	socklen_t laddrlen, faddrlen;
6482 	short opts;
6483 	struct stroptions *stropt;
6484 	mblk_t *stropt_mp;
6485 	int error;
6486 
6487 	udp = connp->conn_udp;
6488 
6489 	stropt_mp = allocb_wait(sizeof (*stropt), BPRI_HI, STR_NOSIG, NULL);
6490 
6491 	/*
6492 	 * setup the fallback stream that was allocated
6493 	 */
6494 	connp->conn_dev = (dev_t)RD(q)->q_ptr;
6495 	connp->conn_minor_arena = WR(q)->q_ptr;
6496 
6497 	RD(q)->q_ptr = WR(q)->q_ptr = connp;
6498 
6499 	WR(q)->q_qinfo = &udp_winit;
6500 
6501 	connp->conn_rq = RD(q);
6502 	connp->conn_wq = WR(q);
6503 
6504 	/* Notify stream head about options before sending up data */
6505 	stropt_mp->b_datap->db_type = M_SETOPTS;
6506 	stropt_mp->b_wptr += sizeof (*stropt);
6507 	stropt = (struct stroptions *)stropt_mp->b_rptr;
6508 	stropt->so_flags = SO_WROFF | SO_HIWAT;
6509 	stropt->so_wroff = connp->conn_wroff;
6510 	stropt->so_hiwat = udp->udp_rcv_disply_hiwat;
6511 	putnext(RD(q), stropt_mp);
6512 
6513 	/*
6514 	 * Free the helper stream
6515 	 */
6516 	ip_free_helper_stream(connp);
6517 
6518 	if (!issocket)
6519 		udp_use_pure_tpi(udp);
6520 
6521 	/*
6522 	 * Collect the information needed to sync with the sonode
6523 	 */
6524 	udp_do_capability_ack(udp, &tca, TC1_INFO);
6525 
6526 	laddrlen = faddrlen = sizeof (sin6_t);
6527 	(void) udp_getsockname((sock_lower_handle_t)connp,
6528 	    (struct sockaddr *)&laddr, &laddrlen, CRED());
6529 	error = udp_getpeername((sock_lower_handle_t)connp,
6530 	    (struct sockaddr *)&faddr, &faddrlen, CRED());
6531 	if (error != 0)
6532 		faddrlen = 0;
6533 
6534 	opts = 0;
6535 	if (connp->conn_dgram_errind)
6536 		opts |= SO_DGRAM_ERRIND;
6537 	if (connp->conn_ixa->ixa_flags & IXAF_DONTROUTE)
6538 		opts |= SO_DONTROUTE;
6539 
6540 	(*quiesced_cb)(connp->conn_upper_handle, q, &tca,
6541 	    (struct sockaddr *)&laddr, laddrlen,
6542 	    (struct sockaddr *)&faddr, faddrlen, opts);
6543 
6544 	mutex_enter(&udp->udp_recv_lock);
6545 	/*
6546 	 * Attempts to send data up during fallback will result in it being
6547 	 * queued in udp_t. Now we push up any queued packets.
6548 	 */
6549 	while (udp->udp_fallback_queue_head != NULL) {
6550 		mblk_t *mp;
6551 		mp = udp->udp_fallback_queue_head;
6552 		udp->udp_fallback_queue_head = mp->b_next;
6553 		mutex_exit(&udp->udp_recv_lock);
6554 		mp->b_next = NULL;
6555 		putnext(RD(q), mp);
6556 		mutex_enter(&udp->udp_recv_lock);
6557 	}
6558 	udp->udp_fallback_queue_tail = udp->udp_fallback_queue_head;
6559 	/*
6560 	 * No longer a streams less socket
6561 	 */
6562 	mutex_enter(&connp->conn_lock);
6563 	connp->conn_flags &= ~IPCL_NONSTR;
6564 	mutex_exit(&connp->conn_lock);
6565 
6566 	mutex_exit(&udp->udp_recv_lock);
6567 
6568 	ASSERT(connp->conn_ref >= 1);
6569 
6570 	return (0);
6571 }
6572 
6573 /* ARGSUSED3 */
6574 int
6575 udp_getpeername(sock_lower_handle_t  proto_handle, struct sockaddr *sa,
6576     socklen_t *salenp, cred_t *cr)
6577 {
6578 	conn_t	*connp = (conn_t *)proto_handle;
6579 	udp_t	*udp = connp->conn_udp;
6580 	int error;
6581 
6582 	/* All Solaris components should pass a cred for this operation. */
6583 	ASSERT(cr != NULL);
6584 
6585 	mutex_enter(&connp->conn_lock);
6586 	if (udp->udp_state != TS_DATA_XFER)
6587 		error = ENOTCONN;
6588 	else
6589 		error = conn_getpeername(connp, sa, salenp);
6590 	mutex_exit(&connp->conn_lock);
6591 	return (error);
6592 }
6593 
6594 /* ARGSUSED3 */
6595 int
6596 udp_getsockname(sock_lower_handle_t proto_handle, struct sockaddr *sa,
6597     socklen_t *salenp, cred_t *cr)
6598 {
6599 	conn_t	*connp = (conn_t *)proto_handle;
6600 	int error;
6601 
6602 	/* All Solaris components should pass a cred for this operation. */
6603 	ASSERT(cr != NULL);
6604 
6605 	mutex_enter(&connp->conn_lock);
6606 	error = conn_getsockname(connp, sa, salenp);
6607 	mutex_exit(&connp->conn_lock);
6608 	return (error);
6609 }
6610 
6611 int
6612 udp_getsockopt(sock_lower_handle_t proto_handle, int level, int option_name,
6613     void *optvalp, socklen_t *optlen, cred_t *cr)
6614 {
6615 	conn_t		*connp = (conn_t *)proto_handle;
6616 	int		error;
6617 	t_uscalar_t	max_optbuf_len;
6618 	void		*optvalp_buf;
6619 	int		len;
6620 
6621 	/* All Solaris components should pass a cred for this operation. */
6622 	ASSERT(cr != NULL);
6623 
6624 	error = proto_opt_check(level, option_name, *optlen, &max_optbuf_len,
6625 	    udp_opt_obj.odb_opt_des_arr,
6626 	    udp_opt_obj.odb_opt_arr_cnt,
6627 	    B_FALSE, B_TRUE, cr);
6628 	if (error != 0) {
6629 		if (error < 0)
6630 			error = proto_tlitosyserr(-error);
6631 		return (error);
6632 	}
6633 
6634 	optvalp_buf = kmem_alloc(max_optbuf_len, KM_SLEEP);
6635 	len = udp_opt_get(connp, level, option_name, optvalp_buf);
6636 	if (len == -1) {
6637 		kmem_free(optvalp_buf, max_optbuf_len);
6638 		return (EINVAL);
6639 	}
6640 
6641 	/*
6642 	 * update optlen and copy option value
6643 	 */
6644 	t_uscalar_t size = MIN(len, *optlen);
6645 
6646 	bcopy(optvalp_buf, optvalp, size);
6647 	bcopy(&size, optlen, sizeof (size));
6648 
6649 	kmem_free(optvalp_buf, max_optbuf_len);
6650 	return (0);
6651 }
6652 
6653 int
6654 udp_setsockopt(sock_lower_handle_t proto_handle, int level, int option_name,
6655     const void *optvalp, socklen_t optlen, cred_t *cr)
6656 {
6657 	conn_t		*connp = (conn_t *)proto_handle;
6658 	int		error;
6659 
6660 	/* All Solaris components should pass a cred for this operation. */
6661 	ASSERT(cr != NULL);
6662 
6663 	error = proto_opt_check(level, option_name, optlen, NULL,
6664 	    udp_opt_obj.odb_opt_des_arr,
6665 	    udp_opt_obj.odb_opt_arr_cnt,
6666 	    B_TRUE, B_FALSE, cr);
6667 
6668 	if (error != 0) {
6669 		if (error < 0)
6670 			error = proto_tlitosyserr(-error);
6671 		return (error);
6672 	}
6673 
6674 	error = udp_opt_set(connp, SETFN_OPTCOM_NEGOTIATE, level, option_name,
6675 	    optlen, (uchar_t *)optvalp, (uint_t *)&optlen, (uchar_t *)optvalp,
6676 	    NULL, cr);
6677 
6678 	ASSERT(error >= 0);
6679 
6680 	return (error);
6681 }
6682 
6683 void
6684 udp_clr_flowctrl(sock_lower_handle_t proto_handle)
6685 {
6686 	conn_t	*connp = (conn_t *)proto_handle;
6687 	udp_t	*udp = connp->conn_udp;
6688 
6689 	mutex_enter(&udp->udp_recv_lock);
6690 	connp->conn_flow_cntrld = B_FALSE;
6691 	mutex_exit(&udp->udp_recv_lock);
6692 }
6693 
6694 /* ARGSUSED2 */
6695 int
6696 udp_shutdown(sock_lower_handle_t proto_handle, int how, cred_t *cr)
6697 {
6698 	conn_t	*connp = (conn_t *)proto_handle;
6699 
6700 	/* All Solaris components should pass a cred for this operation. */
6701 	ASSERT(cr != NULL);
6702 
6703 	/* shut down the send side */
6704 	if (how != SHUT_RD)
6705 		(*connp->conn_upcalls->su_opctl)(connp->conn_upper_handle,
6706 		    SOCK_OPCTL_SHUT_SEND, 0);
6707 	/* shut down the recv side */
6708 	if (how != SHUT_WR)
6709 		(*connp->conn_upcalls->su_opctl)(connp->conn_upper_handle,
6710 		    SOCK_OPCTL_SHUT_RECV, 0);
6711 	return (0);
6712 }
6713 
6714 int
6715 udp_ioctl(sock_lower_handle_t proto_handle, int cmd, intptr_t arg,
6716     int mode, int32_t *rvalp, cred_t *cr)
6717 {
6718 	conn_t  	*connp = (conn_t *)proto_handle;
6719 	int		error;
6720 
6721 	/* All Solaris components should pass a cred for this operation. */
6722 	ASSERT(cr != NULL);
6723 
6724 	/*
6725 	 * If we don't have a helper stream then create one.
6726 	 * ip_create_helper_stream takes care of locking the conn_t,
6727 	 * so this check for NULL is just a performance optimization.
6728 	 */
6729 	if (connp->conn_helper_info == NULL) {
6730 		udp_stack_t *us = connp->conn_udp->udp_us;
6731 
6732 		ASSERT(us->us_ldi_ident != NULL);
6733 
6734 		/*
6735 		 * Create a helper stream for non-STREAMS socket.
6736 		 */
6737 		error = ip_create_helper_stream(connp, us->us_ldi_ident);
6738 		if (error != 0) {
6739 			ip0dbg(("tcp_ioctl: create of IP helper stream "
6740 			    "failed %d\n", error));
6741 			return (error);
6742 		}
6743 	}
6744 
6745 	switch (cmd) {
6746 		case _SIOCSOCKFALLBACK:
6747 		case TI_GETPEERNAME:
6748 		case TI_GETMYNAME:
6749 			ip1dbg(("udp_ioctl: cmd 0x%x on non streams socket",
6750 			    cmd));
6751 			error = EINVAL;
6752 			break;
6753 		default:
6754 			/*
6755 			 * Pass on to IP using helper stream
6756 			 */
6757 			error = ldi_ioctl(connp->conn_helper_info->iphs_handle,
6758 			    cmd, arg, mode, cr, rvalp);
6759 			break;
6760 	}
6761 	return (error);
6762 }
6763 
6764 /* ARGSUSED */
6765 int
6766 udp_accept(sock_lower_handle_t lproto_handle,
6767     sock_lower_handle_t eproto_handle, sock_upper_handle_t sock_handle,
6768     cred_t *cr)
6769 {
6770 	return (EOPNOTSUPP);
6771 }
6772 
6773 /* ARGSUSED */
6774 int
6775 udp_listen(sock_lower_handle_t proto_handle, int backlog, cred_t *cr)
6776 {
6777 	return (EOPNOTSUPP);
6778 }
6779 
6780 sock_downcalls_t sock_udp_downcalls = {
6781 	udp_activate,		/* sd_activate */
6782 	udp_accept,		/* sd_accept */
6783 	udp_bind,		/* sd_bind */
6784 	udp_listen,		/* sd_listen */
6785 	udp_connect,		/* sd_connect */
6786 	udp_getpeername,	/* sd_getpeername */
6787 	udp_getsockname,	/* sd_getsockname */
6788 	udp_getsockopt,		/* sd_getsockopt */
6789 	udp_setsockopt,		/* sd_setsockopt */
6790 	udp_send,		/* sd_send */
6791 	NULL,			/* sd_send_uio */
6792 	NULL,			/* sd_recv_uio */
6793 	NULL,			/* sd_poll */
6794 	udp_shutdown,		/* sd_shutdown */
6795 	udp_clr_flowctrl,	/* sd_setflowctrl */
6796 	udp_ioctl,		/* sd_ioctl */
6797 	udp_close		/* sd_close */
6798 };
6799