xref: /freebsd/sys/netinet/udp_usrreq.c (revision ab00ac327a66a53edaac95b536b209db3ae2cd9f)
1 /*-
2  * Copyright (c) 1982, 1986, 1988, 1990, 1993, 1995
3  *	The Regents of the University of California.
4  * Copyright (c) 2008 Robert N. M. Watson
5  * Copyright (c) 2010-2011 Juniper Networks, Inc.
6  * Copyright (c) 2014 Kevin Lo
7  * All rights reserved.
8  *
9  * Portions of this software were developed by Robert N. M. Watson under
10  * contract to Juniper Networks, Inc.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. Neither the name of the University nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  *	@(#)udp_usrreq.c	8.6 (Berkeley) 5/23/95
37  */
38 
39 #include <sys/cdefs.h>
40 __FBSDID("$FreeBSD$");
41 
42 #include "opt_inet.h"
43 #include "opt_inet6.h"
44 #include "opt_ipsec.h"
45 #include "opt_rss.h"
46 
47 #include <sys/param.h>
48 #include <sys/domain.h>
49 #include <sys/eventhandler.h>
50 #include <sys/jail.h>
51 #include <sys/kernel.h>
52 #include <sys/lock.h>
53 #include <sys/malloc.h>
54 #include <sys/mbuf.h>
55 #include <sys/priv.h>
56 #include <sys/proc.h>
57 #include <sys/protosw.h>
58 #include <sys/sdt.h>
59 #include <sys/signalvar.h>
60 #include <sys/socket.h>
61 #include <sys/socketvar.h>
62 #include <sys/sx.h>
63 #include <sys/sysctl.h>
64 #include <sys/syslog.h>
65 #include <sys/systm.h>
66 
67 #include <vm/uma.h>
68 
69 #include <net/if.h>
70 #include <net/if_var.h>
71 #include <net/route.h>
72 #include <net/rss_config.h>
73 
74 #include <netinet/in.h>
75 #include <netinet/in_kdtrace.h>
76 #include <netinet/in_pcb.h>
77 #include <netinet/in_systm.h>
78 #include <netinet/in_var.h>
79 #include <netinet/ip.h>
80 #ifdef INET6
81 #include <netinet/ip6.h>
82 #endif
83 #include <netinet/ip_icmp.h>
84 #include <netinet/icmp_var.h>
85 #include <netinet/ip_var.h>
86 #include <netinet/ip_options.h>
87 #ifdef INET6
88 #include <netinet6/ip6_var.h>
89 #endif
90 #include <netinet/udp.h>
91 #include <netinet/udp_var.h>
92 #include <netinet/udplite.h>
93 #include <netinet/in_rss.h>
94 
95 #include <netipsec/ipsec_support.h>
96 
97 #include <machine/in_cksum.h>
98 
99 #include <security/mac/mac_framework.h>
100 
101 /*
102  * UDP and UDP-Lite protocols implementation.
103  * Per RFC 768, August, 1980.
104  * Per RFC 3828, July, 2004.
105  */
106 
107 /*
108  * BSD 4.2 defaulted the udp checksum to be off.  Turning off udp checksums
109  * removes the only data integrity mechanism for packets and malformed
110  * packets that would otherwise be discarded due to bad checksums, and may
111  * cause problems (especially for NFS data blocks).
112  */
113 VNET_DEFINE(int, udp_cksum) = 1;
114 SYSCTL_INT(_net_inet_udp, UDPCTL_CHECKSUM, checksum, CTLFLAG_VNET | CTLFLAG_RW,
115     &VNET_NAME(udp_cksum), 0, "compute udp checksum");
116 
117 int	udp_log_in_vain = 0;
118 SYSCTL_INT(_net_inet_udp, OID_AUTO, log_in_vain, CTLFLAG_RW,
119     &udp_log_in_vain, 0, "Log all incoming UDP packets");
120 
121 VNET_DEFINE(int, udp_blackhole) = 0;
122 SYSCTL_INT(_net_inet_udp, OID_AUTO, blackhole, CTLFLAG_VNET | CTLFLAG_RW,
123     &VNET_NAME(udp_blackhole), 0,
124     "Do not send port unreachables for refused connects");
125 
126 u_long	udp_sendspace = 9216;		/* really max datagram size */
127 SYSCTL_ULONG(_net_inet_udp, UDPCTL_MAXDGRAM, maxdgram, CTLFLAG_RW,
128     &udp_sendspace, 0, "Maximum outgoing UDP datagram size");
129 
130 u_long	udp_recvspace = 40 * (1024 +
131 #ifdef INET6
132 				      sizeof(struct sockaddr_in6)
133 #else
134 				      sizeof(struct sockaddr_in)
135 #endif
136 				      );	/* 40 1K datagrams */
137 
138 SYSCTL_ULONG(_net_inet_udp, UDPCTL_RECVSPACE, recvspace, CTLFLAG_RW,
139     &udp_recvspace, 0, "Maximum space for incoming UDP datagrams");
140 
141 VNET_DEFINE(struct inpcbhead, udb);		/* from udp_var.h */
142 VNET_DEFINE(struct inpcbinfo, udbinfo);
143 VNET_DEFINE(struct inpcbhead, ulitecb);
144 VNET_DEFINE(struct inpcbinfo, ulitecbinfo);
145 static VNET_DEFINE(uma_zone_t, udpcb_zone);
146 #define	V_udpcb_zone			VNET(udpcb_zone)
147 
148 #ifndef UDBHASHSIZE
149 #define	UDBHASHSIZE	128
150 #endif
151 
152 VNET_PCPUSTAT_DEFINE(struct udpstat, udpstat);		/* from udp_var.h */
153 VNET_PCPUSTAT_SYSINIT(udpstat);
154 SYSCTL_VNET_PCPUSTAT(_net_inet_udp, UDPCTL_STATS, stats, struct udpstat,
155     udpstat, "UDP statistics (struct udpstat, netinet/udp_var.h)");
156 
157 #ifdef VIMAGE
158 VNET_PCPUSTAT_SYSUNINIT(udpstat);
159 #endif /* VIMAGE */
160 #ifdef INET
161 static void	udp_detach(struct socket *so);
162 static int	udp_output(struct inpcb *, struct mbuf *, struct sockaddr *,
163 		    struct mbuf *, struct thread *);
164 #endif
165 
166 static void
167 udp_zone_change(void *tag)
168 {
169 
170 	uma_zone_set_max(V_udbinfo.ipi_zone, maxsockets);
171 	uma_zone_set_max(V_udpcb_zone, maxsockets);
172 }
173 
174 static int
175 udp_inpcb_init(void *mem, int size, int flags)
176 {
177 	struct inpcb *inp;
178 
179 	inp = mem;
180 	INP_LOCK_INIT(inp, "inp", "udpinp");
181 	return (0);
182 }
183 
184 static int
185 udplite_inpcb_init(void *mem, int size, int flags)
186 {
187 	struct inpcb *inp;
188 
189 	inp = mem;
190 	INP_LOCK_INIT(inp, "inp", "udpliteinp");
191 	return (0);
192 }
193 
194 void
195 udp_init(void)
196 {
197 
198 	/*
199 	 * For now default to 2-tuple UDP hashing - until the fragment
200 	 * reassembly code can also update the flowid.
201 	 *
202 	 * Once we can calculate the flowid that way and re-establish
203 	 * a 4-tuple, flip this to 4-tuple.
204 	 */
205 	in_pcbinfo_init(&V_udbinfo, "udp", &V_udb, UDBHASHSIZE, UDBHASHSIZE,
206 	    "udp_inpcb", udp_inpcb_init, IPI_HASHFIELDS_2TUPLE);
207 	V_udpcb_zone = uma_zcreate("udpcb", sizeof(struct udpcb),
208 	    NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
209 	uma_zone_set_max(V_udpcb_zone, maxsockets);
210 	uma_zone_set_warning(V_udpcb_zone, "kern.ipc.maxsockets limit reached");
211 	EVENTHANDLER_REGISTER(maxsockets_change, udp_zone_change, NULL,
212 	    EVENTHANDLER_PRI_ANY);
213 }
214 
215 void
216 udplite_init(void)
217 {
218 
219 	in_pcbinfo_init(&V_ulitecbinfo, "udplite", &V_ulitecb, UDBHASHSIZE,
220 	    UDBHASHSIZE, "udplite_inpcb", udplite_inpcb_init,
221 	    IPI_HASHFIELDS_2TUPLE);
222 }
223 
224 /*
225  * Kernel module interface for updating udpstat.  The argument is an index
226  * into udpstat treated as an array of u_long.  While this encodes the
227  * general layout of udpstat into the caller, it doesn't encode its location,
228  * so that future changes to add, for example, per-CPU stats support won't
229  * cause binary compatibility problems for kernel modules.
230  */
231 void
232 kmod_udpstat_inc(int statnum)
233 {
234 
235 	counter_u64_add(VNET(udpstat)[statnum], 1);
236 }
237 
238 int
239 udp_newudpcb(struct inpcb *inp)
240 {
241 	struct udpcb *up;
242 
243 	up = uma_zalloc(V_udpcb_zone, M_NOWAIT | M_ZERO);
244 	if (up == NULL)
245 		return (ENOBUFS);
246 	inp->inp_ppcb = up;
247 	return (0);
248 }
249 
250 void
251 udp_discardcb(struct udpcb *up)
252 {
253 
254 	uma_zfree(V_udpcb_zone, up);
255 }
256 
257 #ifdef VIMAGE
258 static void
259 udp_destroy(void *unused __unused)
260 {
261 
262 	in_pcbinfo_destroy(&V_udbinfo);
263 	uma_zdestroy(V_udpcb_zone);
264 }
265 VNET_SYSUNINIT(udp, SI_SUB_PROTO_DOMAIN, SI_ORDER_FOURTH, udp_destroy, NULL);
266 
267 static void
268 udplite_destroy(void *unused __unused)
269 {
270 
271 	in_pcbinfo_destroy(&V_ulitecbinfo);
272 }
273 VNET_SYSUNINIT(udplite, SI_SUB_PROTO_DOMAIN, SI_ORDER_FOURTH, udplite_destroy,
274     NULL);
275 #endif
276 
277 #ifdef INET
278 /*
279  * Subroutine of udp_input(), which appends the provided mbuf chain to the
280  * passed pcb/socket.  The caller must provide a sockaddr_in via udp_in that
281  * contains the source address.  If the socket ends up being an IPv6 socket,
282  * udp_append() will convert to a sockaddr_in6 before passing the address
283  * into the socket code.
284  *
285  * In the normal case udp_append() will return 0, indicating that you
286  * must unlock the inp. However if a tunneling protocol is in place we increment
287  * the inpcb refcnt and unlock the inp, on return from the tunneling protocol we
288  * then decrement the reference count. If the inp_rele returns 1, indicating the
289  * inp is gone, we return that to the caller to tell them *not* to unlock
290  * the inp. In the case of multi-cast this will cause the distribution
291  * to stop (though most tunneling protocols known currently do *not* use
292  * multicast).
293  */
294 static int
295 udp_append(struct inpcb *inp, struct ip *ip, struct mbuf *n, int off,
296     struct sockaddr_in *udp_in)
297 {
298 	struct sockaddr *append_sa;
299 	struct socket *so;
300 	struct mbuf *tmpopts, *opts = NULL;
301 #ifdef INET6
302 	struct sockaddr_in6 udp_in6;
303 #endif
304 	struct udpcb *up;
305 
306 	INP_LOCK_ASSERT(inp);
307 
308 	/*
309 	 * Engage the tunneling protocol.
310 	 */
311 	up = intoudpcb(inp);
312 	if (up->u_tun_func != NULL) {
313 		in_pcbref(inp);
314 		INP_RUNLOCK(inp);
315 		(*up->u_tun_func)(n, off, inp, (struct sockaddr *)&udp_in[0],
316 		    up->u_tun_ctx);
317 		INP_RLOCK(inp);
318 		return (in_pcbrele_rlocked(inp));
319 	}
320 
321 	off += sizeof(struct udphdr);
322 
323 #if defined(IPSEC) || defined(IPSEC_SUPPORT)
324 	/* Check AH/ESP integrity. */
325 	if (IPSEC_ENABLED(ipv4) &&
326 	    IPSEC_CHECK_POLICY(ipv4, n, inp) != 0) {
327 		m_freem(n);
328 		return (0);
329 	}
330 	if (up->u_flags & UF_ESPINUDP) {/* IPSec UDP encaps. */
331 		if (IPSEC_ENABLED(ipv4) &&
332 		    UDPENCAP_INPUT(n, off, AF_INET) != 0)
333 			return (0);	/* Consumed. */
334 	}
335 #endif /* IPSEC */
336 #ifdef MAC
337 	if (mac_inpcb_check_deliver(inp, n) != 0) {
338 		m_freem(n);
339 		return (0);
340 	}
341 #endif /* MAC */
342 	if (inp->inp_flags & INP_CONTROLOPTS ||
343 	    inp->inp_socket->so_options & (SO_TIMESTAMP | SO_BINTIME)) {
344 #ifdef INET6
345 		if (inp->inp_vflag & INP_IPV6)
346 			(void)ip6_savecontrol_v4(inp, n, &opts, NULL);
347 		else
348 #endif /* INET6 */
349 			ip_savecontrol(inp, &opts, ip, n);
350 	}
351 	if ((inp->inp_vflag & INP_IPV4) && (inp->inp_flags2 & INP_ORIGDSTADDR)) {
352 		tmpopts = sbcreatecontrol((caddr_t)&udp_in[1],
353 			sizeof(struct sockaddr_in), IP_ORIGDSTADDR, IPPROTO_IP);
354 		if (tmpopts) {
355 			if (opts) {
356 				tmpopts->m_next = opts;
357 				opts = tmpopts;
358 			} else
359 				opts = tmpopts;
360 		}
361 	}
362 #ifdef INET6
363 	if (inp->inp_vflag & INP_IPV6) {
364 		bzero(&udp_in6, sizeof(udp_in6));
365 		udp_in6.sin6_len = sizeof(udp_in6);
366 		udp_in6.sin6_family = AF_INET6;
367 		in6_sin_2_v4mapsin6(&udp_in[0], &udp_in6);
368 		append_sa = (struct sockaddr *)&udp_in6;
369 	} else
370 #endif /* INET6 */
371 		append_sa = (struct sockaddr *)&udp_in[0];
372 	m_adj(n, off);
373 
374 	so = inp->inp_socket;
375 	SOCKBUF_LOCK(&so->so_rcv);
376 	if (sbappendaddr_locked(&so->so_rcv, append_sa, n, opts) == 0) {
377 		SOCKBUF_UNLOCK(&so->so_rcv);
378 		m_freem(n);
379 		if (opts)
380 			m_freem(opts);
381 		UDPSTAT_INC(udps_fullsock);
382 	} else
383 		sorwakeup_locked(so);
384 	return (0);
385 }
386 
387 int
388 udp_input(struct mbuf **mp, int *offp, int proto)
389 {
390 	struct ip *ip;
391 	struct udphdr *uh;
392 	struct ifnet *ifp;
393 	struct inpcb *inp;
394 	uint16_t len, ip_len;
395 	struct inpcbinfo *pcbinfo;
396 	struct ip save_ip;
397 	struct sockaddr_in udp_in[2];
398 	struct mbuf *m;
399 	struct m_tag *fwd_tag;
400 	int cscov_partial, iphlen;
401 
402 	m = *mp;
403 	iphlen = *offp;
404 	ifp = m->m_pkthdr.rcvif;
405 	*mp = NULL;
406 	UDPSTAT_INC(udps_ipackets);
407 
408 	/*
409 	 * Strip IP options, if any; should skip this, make available to
410 	 * user, and use on returned packets, but we don't yet have a way to
411 	 * check the checksum with options still present.
412 	 */
413 	if (iphlen > sizeof (struct ip)) {
414 		ip_stripoptions(m);
415 		iphlen = sizeof(struct ip);
416 	}
417 
418 	/*
419 	 * Get IP and UDP header together in first mbuf.
420 	 */
421 	ip = mtod(m, struct ip *);
422 	if (m->m_len < iphlen + sizeof(struct udphdr)) {
423 		if ((m = m_pullup(m, iphlen + sizeof(struct udphdr))) == NULL) {
424 			UDPSTAT_INC(udps_hdrops);
425 			return (IPPROTO_DONE);
426 		}
427 		ip = mtod(m, struct ip *);
428 	}
429 	uh = (struct udphdr *)((caddr_t)ip + iphlen);
430 	cscov_partial = (proto == IPPROTO_UDPLITE) ? 1 : 0;
431 
432 	/*
433 	 * Destination port of 0 is illegal, based on RFC768.
434 	 */
435 	if (uh->uh_dport == 0)
436 		goto badunlocked;
437 
438 	/*
439 	 * Construct sockaddr format source address.  Stuff source address
440 	 * and datagram in user buffer.
441 	 */
442 	bzero(&udp_in[0], sizeof(struct sockaddr_in) * 2);
443 	udp_in[0].sin_len = sizeof(struct sockaddr_in);
444 	udp_in[0].sin_family = AF_INET;
445 	udp_in[0].sin_port = uh->uh_sport;
446 	udp_in[0].sin_addr = ip->ip_src;
447 	udp_in[1].sin_len = sizeof(struct sockaddr_in);
448 	udp_in[1].sin_family = AF_INET;
449 	udp_in[1].sin_port = uh->uh_dport;
450 	udp_in[1].sin_addr = ip->ip_dst;
451 
452 	/*
453 	 * Make mbuf data length reflect UDP length.  If not enough data to
454 	 * reflect UDP length, drop.
455 	 */
456 	len = ntohs((u_short)uh->uh_ulen);
457 	ip_len = ntohs(ip->ip_len) - iphlen;
458 	if (proto == IPPROTO_UDPLITE && (len == 0 || len == ip_len)) {
459 		/* Zero means checksum over the complete packet. */
460 		if (len == 0)
461 			len = ip_len;
462 		cscov_partial = 0;
463 	}
464 	if (ip_len != len) {
465 		if (len > ip_len || len < sizeof(struct udphdr)) {
466 			UDPSTAT_INC(udps_badlen);
467 			goto badunlocked;
468 		}
469 		if (proto == IPPROTO_UDP)
470 			m_adj(m, len - ip_len);
471 	}
472 
473 	/*
474 	 * Save a copy of the IP header in case we want restore it for
475 	 * sending an ICMP error message in response.
476 	 */
477 	if (!V_udp_blackhole)
478 		save_ip = *ip;
479 	else
480 		memset(&save_ip, 0, sizeof(save_ip));
481 
482 	/*
483 	 * Checksum extended UDP header and data.
484 	 */
485 	if (uh->uh_sum) {
486 		u_short uh_sum;
487 
488 		if ((m->m_pkthdr.csum_flags & CSUM_DATA_VALID) &&
489 		    !cscov_partial) {
490 			if (m->m_pkthdr.csum_flags & CSUM_PSEUDO_HDR)
491 				uh_sum = m->m_pkthdr.csum_data;
492 			else
493 				uh_sum = in_pseudo(ip->ip_src.s_addr,
494 				    ip->ip_dst.s_addr, htonl((u_short)len +
495 				    m->m_pkthdr.csum_data + proto));
496 			uh_sum ^= 0xffff;
497 		} else {
498 			char b[9];
499 
500 			bcopy(((struct ipovly *)ip)->ih_x1, b, 9);
501 			bzero(((struct ipovly *)ip)->ih_x1, 9);
502 			((struct ipovly *)ip)->ih_len = (proto == IPPROTO_UDP) ?
503 			    uh->uh_ulen : htons(ip_len);
504 			uh_sum = in_cksum(m, len + sizeof (struct ip));
505 			bcopy(b, ((struct ipovly *)ip)->ih_x1, 9);
506 		}
507 		if (uh_sum) {
508 			UDPSTAT_INC(udps_badsum);
509 			m_freem(m);
510 			return (IPPROTO_DONE);
511 		}
512 	} else {
513 		if (proto == IPPROTO_UDP) {
514 			UDPSTAT_INC(udps_nosum);
515 		} else {
516 			/* UDPLite requires a checksum */
517 			/* XXX: What is the right UDPLite MIB counter here? */
518 			m_freem(m);
519 			return (IPPROTO_DONE);
520 		}
521 	}
522 
523 	pcbinfo = udp_get_inpcbinfo(proto);
524 	if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr)) ||
525 	    in_broadcast(ip->ip_dst, ifp)) {
526 		struct inpcb *last;
527 		struct inpcbhead *pcblist;
528 		struct ip_moptions *imo;
529 
530 		INP_INFO_RLOCK(pcbinfo);
531 		pcblist = udp_get_pcblist(proto);
532 		last = NULL;
533 		LIST_FOREACH(inp, pcblist, inp_list) {
534 			if (inp->inp_lport != uh->uh_dport)
535 				continue;
536 #ifdef INET6
537 			if ((inp->inp_vflag & INP_IPV4) == 0)
538 				continue;
539 #endif
540 			if (inp->inp_laddr.s_addr != INADDR_ANY &&
541 			    inp->inp_laddr.s_addr != ip->ip_dst.s_addr)
542 				continue;
543 			if (inp->inp_faddr.s_addr != INADDR_ANY &&
544 			    inp->inp_faddr.s_addr != ip->ip_src.s_addr)
545 				continue;
546 			if (inp->inp_fport != 0 &&
547 			    inp->inp_fport != uh->uh_sport)
548 				continue;
549 
550 			INP_RLOCK(inp);
551 
552 			/*
553 			 * XXXRW: Because we weren't holding either the inpcb
554 			 * or the hash lock when we checked for a match
555 			 * before, we should probably recheck now that the
556 			 * inpcb lock is held.
557 			 */
558 
559 			/*
560 			 * Handle socket delivery policy for any-source
561 			 * and source-specific multicast. [RFC3678]
562 			 */
563 			imo = inp->inp_moptions;
564 			if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) {
565 				struct sockaddr_in	 group;
566 				int			 blocked;
567 				if (imo == NULL) {
568 					INP_RUNLOCK(inp);
569 					continue;
570 				}
571 				bzero(&group, sizeof(struct sockaddr_in));
572 				group.sin_len = sizeof(struct sockaddr_in);
573 				group.sin_family = AF_INET;
574 				group.sin_addr = ip->ip_dst;
575 
576 				blocked = imo_multi_filter(imo, ifp,
577 					(struct sockaddr *)&group,
578 					(struct sockaddr *)&udp_in[0]);
579 				if (blocked != MCAST_PASS) {
580 					if (blocked == MCAST_NOTGMEMBER)
581 						IPSTAT_INC(ips_notmember);
582 					if (blocked == MCAST_NOTSMEMBER ||
583 					    blocked == MCAST_MUTED)
584 						UDPSTAT_INC(udps_filtermcast);
585 					INP_RUNLOCK(inp);
586 					continue;
587 				}
588 			}
589 			if (last != NULL) {
590 				struct mbuf *n;
591 
592 				if ((n = m_copym(m, 0, M_COPYALL, M_NOWAIT)) !=
593 				    NULL) {
594 					UDP_PROBE(receive, NULL, last, ip,
595 					    last, uh);
596 					if (udp_append(last, ip, n, iphlen,
597 						udp_in)) {
598 						goto inp_lost;
599 					}
600 				}
601 				INP_RUNLOCK(last);
602 			}
603 			last = inp;
604 			/*
605 			 * Don't look for additional matches if this one does
606 			 * not have either the SO_REUSEPORT or SO_REUSEADDR
607 			 * socket options set.  This heuristic avoids
608 			 * searching through all pcbs in the common case of a
609 			 * non-shared port.  It assumes that an application
610 			 * will never clear these options after setting them.
611 			 */
612 			if ((last->inp_socket->so_options &
613 			    (SO_REUSEPORT|SO_REUSEADDR)) == 0)
614 				break;
615 		}
616 
617 		if (last == NULL) {
618 			/*
619 			 * No matching pcb found; discard datagram.  (No need
620 			 * to send an ICMP Port Unreachable for a broadcast
621 			 * or multicast datgram.)
622 			 */
623 			UDPSTAT_INC(udps_noportbcast);
624 			if (inp)
625 				INP_RUNLOCK(inp);
626 			INP_INFO_RUNLOCK(pcbinfo);
627 			goto badunlocked;
628 		}
629 		UDP_PROBE(receive, NULL, last, ip, last, uh);
630 		if (udp_append(last, ip, m, iphlen, udp_in) == 0)
631 			INP_RUNLOCK(last);
632 	inp_lost:
633 		INP_INFO_RUNLOCK(pcbinfo);
634 		return (IPPROTO_DONE);
635 	}
636 
637 	/*
638 	 * Locate pcb for datagram.
639 	 */
640 
641 	/*
642 	 * Grab info from PACKET_TAG_IPFORWARD tag prepended to the chain.
643 	 */
644 	if ((m->m_flags & M_IP_NEXTHOP) &&
645 	    (fwd_tag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL)) != NULL) {
646 		struct sockaddr_in *next_hop;
647 
648 		next_hop = (struct sockaddr_in *)(fwd_tag + 1);
649 
650 		/*
651 		 * Transparently forwarded. Pretend to be the destination.
652 		 * Already got one like this?
653 		 */
654 		inp = in_pcblookup_mbuf(pcbinfo, ip->ip_src, uh->uh_sport,
655 		    ip->ip_dst, uh->uh_dport, INPLOOKUP_RLOCKPCB, ifp, m);
656 		if (!inp) {
657 			/*
658 			 * It's new.  Try to find the ambushing socket.
659 			 * Because we've rewritten the destination address,
660 			 * any hardware-generated hash is ignored.
661 			 */
662 			inp = in_pcblookup(pcbinfo, ip->ip_src,
663 			    uh->uh_sport, next_hop->sin_addr,
664 			    next_hop->sin_port ? htons(next_hop->sin_port) :
665 			    uh->uh_dport, INPLOOKUP_WILDCARD |
666 			    INPLOOKUP_RLOCKPCB, ifp);
667 		}
668 		/* Remove the tag from the packet. We don't need it anymore. */
669 		m_tag_delete(m, fwd_tag);
670 		m->m_flags &= ~M_IP_NEXTHOP;
671 	} else
672 		inp = in_pcblookup_mbuf(pcbinfo, ip->ip_src, uh->uh_sport,
673 		    ip->ip_dst, uh->uh_dport, INPLOOKUP_WILDCARD |
674 		    INPLOOKUP_RLOCKPCB, ifp, m);
675 	if (inp == NULL) {
676 		if (udp_log_in_vain) {
677 			char src[INET_ADDRSTRLEN];
678 			char dst[INET_ADDRSTRLEN];
679 
680 			log(LOG_INFO,
681 			    "Connection attempt to UDP %s:%d from %s:%d\n",
682 			    inet_ntoa_r(ip->ip_dst, dst), ntohs(uh->uh_dport),
683 			    inet_ntoa_r(ip->ip_src, src), ntohs(uh->uh_sport));
684 		}
685 		UDPSTAT_INC(udps_noport);
686 		if (m->m_flags & (M_BCAST | M_MCAST)) {
687 			UDPSTAT_INC(udps_noportbcast);
688 			goto badunlocked;
689 		}
690 		if (V_udp_blackhole)
691 			goto badunlocked;
692 		if (badport_bandlim(BANDLIM_ICMP_UNREACH) < 0)
693 			goto badunlocked;
694 		*ip = save_ip;
695 		icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_PORT, 0, 0);
696 		return (IPPROTO_DONE);
697 	}
698 
699 	/*
700 	 * Check the minimum TTL for socket.
701 	 */
702 	INP_RLOCK_ASSERT(inp);
703 	if (inp->inp_ip_minttl && inp->inp_ip_minttl > ip->ip_ttl) {
704 		INP_RUNLOCK(inp);
705 		m_freem(m);
706 		return (IPPROTO_DONE);
707 	}
708 	if (cscov_partial) {
709 		struct udpcb *up;
710 
711 		up = intoudpcb(inp);
712 		if (up->u_rxcslen == 0 || up->u_rxcslen > len) {
713 			INP_RUNLOCK(inp);
714 			m_freem(m);
715 			return (IPPROTO_DONE);
716 		}
717 	}
718 
719 	UDP_PROBE(receive, NULL, inp, ip, inp, uh);
720 	if (udp_append(inp, ip, m, iphlen, udp_in) == 0)
721 		INP_RUNLOCK(inp);
722 	return (IPPROTO_DONE);
723 
724 badunlocked:
725 	m_freem(m);
726 	return (IPPROTO_DONE);
727 }
728 #endif /* INET */
729 
730 /*
731  * Notify a udp user of an asynchronous error; just wake up so that they can
732  * collect error status.
733  */
734 struct inpcb *
735 udp_notify(struct inpcb *inp, int errno)
736 {
737 
738 	/*
739 	 * While udp_ctlinput() always calls udp_notify() with a read lock
740 	 * when invoking it directly, in_pcbnotifyall() currently uses write
741 	 * locks due to sharing code with TCP.  For now, accept either a read
742 	 * or a write lock, but a read lock is sufficient.
743 	 */
744 	INP_LOCK_ASSERT(inp);
745 	if ((errno == EHOSTUNREACH || errno == ENETUNREACH ||
746 	     errno == EHOSTDOWN) && inp->inp_route.ro_rt) {
747 		RTFREE(inp->inp_route.ro_rt);
748 		inp->inp_route.ro_rt = (struct rtentry *)NULL;
749 	}
750 
751 	inp->inp_socket->so_error = errno;
752 	sorwakeup(inp->inp_socket);
753 	sowwakeup(inp->inp_socket);
754 	return (inp);
755 }
756 
757 #ifdef INET
758 static void
759 udp_common_ctlinput(int cmd, struct sockaddr *sa, void *vip,
760     struct inpcbinfo *pcbinfo)
761 {
762 	struct ip *ip = vip;
763 	struct udphdr *uh;
764 	struct in_addr faddr;
765 	struct inpcb *inp;
766 
767 	faddr = ((struct sockaddr_in *)sa)->sin_addr;
768 	if (sa->sa_family != AF_INET || faddr.s_addr == INADDR_ANY)
769 		return;
770 
771 	if (PRC_IS_REDIRECT(cmd)) {
772 		/* signal EHOSTDOWN, as it flushes the cached route */
773 		in_pcbnotifyall(&V_udbinfo, faddr, EHOSTDOWN, udp_notify);
774 		return;
775 	}
776 
777 	/*
778 	 * Hostdead is ugly because it goes linearly through all PCBs.
779 	 *
780 	 * XXX: We never get this from ICMP, otherwise it makes an excellent
781 	 * DoS attack on machines with many connections.
782 	 */
783 	if (cmd == PRC_HOSTDEAD)
784 		ip = NULL;
785 	else if ((unsigned)cmd >= PRC_NCMDS || inetctlerrmap[cmd] == 0)
786 		return;
787 	if (ip != NULL) {
788 		uh = (struct udphdr *)((caddr_t)ip + (ip->ip_hl << 2));
789 		inp = in_pcblookup(pcbinfo, faddr, uh->uh_dport,
790 		    ip->ip_src, uh->uh_sport, INPLOOKUP_RLOCKPCB, NULL);
791 		if (inp != NULL) {
792 			INP_RLOCK_ASSERT(inp);
793 			if (inp->inp_socket != NULL) {
794 				udp_notify(inp, inetctlerrmap[cmd]);
795 			}
796 			INP_RUNLOCK(inp);
797 		} else {
798 			inp = in_pcblookup(pcbinfo, faddr, uh->uh_dport,
799 					   ip->ip_src, uh->uh_sport,
800 					   INPLOOKUP_WILDCARD | INPLOOKUP_RLOCKPCB, NULL);
801 			if (inp != NULL) {
802 				struct udpcb *up;
803 
804 				up = intoudpcb(inp);
805 				if (up->u_icmp_func != NULL) {
806 					INP_RUNLOCK(inp);
807 					(*up->u_icmp_func)(cmd, sa, vip, up->u_tun_ctx);
808 				} else {
809 					INP_RUNLOCK(inp);
810 				}
811 			}
812 		}
813 	} else
814 		in_pcbnotifyall(pcbinfo, faddr, inetctlerrmap[cmd],
815 		    udp_notify);
816 }
817 void
818 udp_ctlinput(int cmd, struct sockaddr *sa, void *vip)
819 {
820 
821 	return (udp_common_ctlinput(cmd, sa, vip, &V_udbinfo));
822 }
823 
824 void
825 udplite_ctlinput(int cmd, struct sockaddr *sa, void *vip)
826 {
827 
828 	return (udp_common_ctlinput(cmd, sa, vip, &V_ulitecbinfo));
829 }
830 #endif /* INET */
831 
832 static int
833 udp_pcblist(SYSCTL_HANDLER_ARGS)
834 {
835 	int error, i, n;
836 	struct inpcb *inp, **inp_list;
837 	inp_gen_t gencnt;
838 	struct xinpgen xig;
839 
840 	/*
841 	 * The process of preparing the PCB list is too time-consuming and
842 	 * resource-intensive to repeat twice on every request.
843 	 */
844 	if (req->oldptr == 0) {
845 		n = V_udbinfo.ipi_count;
846 		n += imax(n / 8, 10);
847 		req->oldidx = 2 * (sizeof xig) + n * sizeof(struct xinpcb);
848 		return (0);
849 	}
850 
851 	if (req->newptr != 0)
852 		return (EPERM);
853 
854 	/*
855 	 * OK, now we're committed to doing something.
856 	 */
857 	INP_INFO_RLOCK(&V_udbinfo);
858 	gencnt = V_udbinfo.ipi_gencnt;
859 	n = V_udbinfo.ipi_count;
860 	INP_INFO_RUNLOCK(&V_udbinfo);
861 
862 	error = sysctl_wire_old_buffer(req, 2 * (sizeof xig)
863 		+ n * sizeof(struct xinpcb));
864 	if (error != 0)
865 		return (error);
866 
867 	xig.xig_len = sizeof xig;
868 	xig.xig_count = n;
869 	xig.xig_gen = gencnt;
870 	xig.xig_sogen = so_gencnt;
871 	error = SYSCTL_OUT(req, &xig, sizeof xig);
872 	if (error)
873 		return (error);
874 
875 	inp_list = malloc(n * sizeof *inp_list, M_TEMP, M_WAITOK);
876 	if (inp_list == NULL)
877 		return (ENOMEM);
878 
879 	INP_INFO_RLOCK(&V_udbinfo);
880 	for (inp = LIST_FIRST(V_udbinfo.ipi_listhead), i = 0; inp && i < n;
881 	     inp = LIST_NEXT(inp, inp_list)) {
882 		INP_WLOCK(inp);
883 		if (inp->inp_gencnt <= gencnt &&
884 		    cr_canseeinpcb(req->td->td_ucred, inp) == 0) {
885 			in_pcbref(inp);
886 			inp_list[i++] = inp;
887 		}
888 		INP_WUNLOCK(inp);
889 	}
890 	INP_INFO_RUNLOCK(&V_udbinfo);
891 	n = i;
892 
893 	error = 0;
894 	for (i = 0; i < n; i++) {
895 		inp = inp_list[i];
896 		INP_RLOCK(inp);
897 		if (inp->inp_gencnt <= gencnt) {
898 			struct xinpcb xi;
899 
900 			in_pcbtoxinpcb(inp, &xi);
901 			INP_RUNLOCK(inp);
902 			error = SYSCTL_OUT(req, &xi, sizeof xi);
903 		} else
904 			INP_RUNLOCK(inp);
905 	}
906 	INP_INFO_WLOCK(&V_udbinfo);
907 	for (i = 0; i < n; i++) {
908 		inp = inp_list[i];
909 		INP_RLOCK(inp);
910 		if (!in_pcbrele_rlocked(inp))
911 			INP_RUNLOCK(inp);
912 	}
913 	INP_INFO_WUNLOCK(&V_udbinfo);
914 
915 	if (!error) {
916 		/*
917 		 * Give the user an updated idea of our state.  If the
918 		 * generation differs from what we told her before, she knows
919 		 * that something happened while we were processing this
920 		 * request, and it might be necessary to retry.
921 		 */
922 		INP_INFO_RLOCK(&V_udbinfo);
923 		xig.xig_gen = V_udbinfo.ipi_gencnt;
924 		xig.xig_sogen = so_gencnt;
925 		xig.xig_count = V_udbinfo.ipi_count;
926 		INP_INFO_RUNLOCK(&V_udbinfo);
927 		error = SYSCTL_OUT(req, &xig, sizeof xig);
928 	}
929 	free(inp_list, M_TEMP);
930 	return (error);
931 }
932 
933 SYSCTL_PROC(_net_inet_udp, UDPCTL_PCBLIST, pcblist,
934     CTLTYPE_OPAQUE | CTLFLAG_RD, NULL, 0,
935     udp_pcblist, "S,xinpcb", "List of active UDP sockets");
936 
937 #ifdef INET
938 static int
939 udp_getcred(SYSCTL_HANDLER_ARGS)
940 {
941 	struct xucred xuc;
942 	struct sockaddr_in addrs[2];
943 	struct inpcb *inp;
944 	int error;
945 
946 	error = priv_check(req->td, PRIV_NETINET_GETCRED);
947 	if (error)
948 		return (error);
949 	error = SYSCTL_IN(req, addrs, sizeof(addrs));
950 	if (error)
951 		return (error);
952 	inp = in_pcblookup(&V_udbinfo, addrs[1].sin_addr, addrs[1].sin_port,
953 	    addrs[0].sin_addr, addrs[0].sin_port,
954 	    INPLOOKUP_WILDCARD | INPLOOKUP_RLOCKPCB, NULL);
955 	if (inp != NULL) {
956 		INP_RLOCK_ASSERT(inp);
957 		if (inp->inp_socket == NULL)
958 			error = ENOENT;
959 		if (error == 0)
960 			error = cr_canseeinpcb(req->td->td_ucred, inp);
961 		if (error == 0)
962 			cru2x(inp->inp_cred, &xuc);
963 		INP_RUNLOCK(inp);
964 	} else
965 		error = ENOENT;
966 	if (error == 0)
967 		error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred));
968 	return (error);
969 }
970 
971 SYSCTL_PROC(_net_inet_udp, OID_AUTO, getcred,
972     CTLTYPE_OPAQUE|CTLFLAG_RW|CTLFLAG_PRISON, 0, 0,
973     udp_getcred, "S,xucred", "Get the xucred of a UDP connection");
974 #endif /* INET */
975 
976 int
977 udp_ctloutput(struct socket *so, struct sockopt *sopt)
978 {
979 	struct inpcb *inp;
980 	struct udpcb *up;
981 	int isudplite, error, optval;
982 
983 	error = 0;
984 	isudplite = (so->so_proto->pr_protocol == IPPROTO_UDPLITE) ? 1 : 0;
985 	inp = sotoinpcb(so);
986 	KASSERT(inp != NULL, ("%s: inp == NULL", __func__));
987 	INP_WLOCK(inp);
988 	if (sopt->sopt_level != so->so_proto->pr_protocol) {
989 #ifdef INET6
990 		if (INP_CHECK_SOCKAF(so, AF_INET6)) {
991 			INP_WUNLOCK(inp);
992 			error = ip6_ctloutput(so, sopt);
993 		}
994 #endif
995 #if defined(INET) && defined(INET6)
996 		else
997 #endif
998 #ifdef INET
999 		{
1000 			INP_WUNLOCK(inp);
1001 			error = ip_ctloutput(so, sopt);
1002 		}
1003 #endif
1004 		return (error);
1005 	}
1006 
1007 	switch (sopt->sopt_dir) {
1008 	case SOPT_SET:
1009 		switch (sopt->sopt_name) {
1010 #if defined(IPSEC) || defined(IPSEC_SUPPORT)
1011 #ifdef INET
1012 		case UDP_ENCAP:
1013 			if (!IPSEC_ENABLED(ipv4)) {
1014 				INP_WUNLOCK(inp);
1015 				return (ENOPROTOOPT);
1016 			}
1017 			error = UDPENCAP_PCBCTL(inp, sopt);
1018 			break;
1019 #endif /* INET */
1020 #endif /* IPSEC */
1021 		case UDPLITE_SEND_CSCOV:
1022 		case UDPLITE_RECV_CSCOV:
1023 			if (!isudplite) {
1024 				INP_WUNLOCK(inp);
1025 				error = ENOPROTOOPT;
1026 				break;
1027 			}
1028 			INP_WUNLOCK(inp);
1029 			error = sooptcopyin(sopt, &optval, sizeof(optval),
1030 			    sizeof(optval));
1031 			if (error != 0)
1032 				break;
1033 			inp = sotoinpcb(so);
1034 			KASSERT(inp != NULL, ("%s: inp == NULL", __func__));
1035 			INP_WLOCK(inp);
1036 			up = intoudpcb(inp);
1037 			KASSERT(up != NULL, ("%s: up == NULL", __func__));
1038 			if ((optval != 0 && optval < 8) || (optval > 65535)) {
1039 				INP_WUNLOCK(inp);
1040 				error = EINVAL;
1041 				break;
1042 			}
1043 			if (sopt->sopt_name == UDPLITE_SEND_CSCOV)
1044 				up->u_txcslen = optval;
1045 			else
1046 				up->u_rxcslen = optval;
1047 			INP_WUNLOCK(inp);
1048 			break;
1049 		default:
1050 			INP_WUNLOCK(inp);
1051 			error = ENOPROTOOPT;
1052 			break;
1053 		}
1054 		break;
1055 	case SOPT_GET:
1056 		switch (sopt->sopt_name) {
1057 #if defined(IPSEC) || defined(IPSEC_SUPPORT)
1058 #ifdef INET
1059 		case UDP_ENCAP:
1060 			if (!IPSEC_ENABLED(ipv4)) {
1061 				INP_WUNLOCK(inp);
1062 				return (ENOPROTOOPT);
1063 			}
1064 			error = UDPENCAP_PCBCTL(inp, sopt);
1065 			break;
1066 #endif /* INET */
1067 #endif /* IPSEC */
1068 		case UDPLITE_SEND_CSCOV:
1069 		case UDPLITE_RECV_CSCOV:
1070 			if (!isudplite) {
1071 				INP_WUNLOCK(inp);
1072 				error = ENOPROTOOPT;
1073 				break;
1074 			}
1075 			up = intoudpcb(inp);
1076 			KASSERT(up != NULL, ("%s: up == NULL", __func__));
1077 			if (sopt->sopt_name == UDPLITE_SEND_CSCOV)
1078 				optval = up->u_txcslen;
1079 			else
1080 				optval = up->u_rxcslen;
1081 			INP_WUNLOCK(inp);
1082 			error = sooptcopyout(sopt, &optval, sizeof(optval));
1083 			break;
1084 		default:
1085 			INP_WUNLOCK(inp);
1086 			error = ENOPROTOOPT;
1087 			break;
1088 		}
1089 		break;
1090 	}
1091 	return (error);
1092 }
1093 
1094 #ifdef INET
1095 #define	UH_WLOCKED	2
1096 #define	UH_RLOCKED	1
1097 #define	UH_UNLOCKED	0
1098 static int
1099 udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
1100     struct mbuf *control, struct thread *td)
1101 {
1102 	struct udpiphdr *ui;
1103 	int len = m->m_pkthdr.len;
1104 	struct in_addr faddr, laddr;
1105 	struct cmsghdr *cm;
1106 	struct inpcbinfo *pcbinfo;
1107 	struct sockaddr_in *sin, src;
1108 	int cscov_partial = 0;
1109 	int error = 0;
1110 	int ipflags;
1111 	u_short fport, lport;
1112 	int unlock_udbinfo, unlock_inp;
1113 	u_char tos;
1114 	uint8_t pr;
1115 	uint16_t cscov = 0;
1116 	uint32_t flowid = 0;
1117 	uint8_t flowtype = M_HASHTYPE_NONE;
1118 
1119 	/*
1120 	 * udp_output() may need to temporarily bind or connect the current
1121 	 * inpcb.  As such, we don't know up front whether we will need the
1122 	 * pcbinfo lock or not.  Do any work to decide what is needed up
1123 	 * front before acquiring any locks.
1124 	 */
1125 	if (len + sizeof(struct udpiphdr) > IP_MAXPACKET) {
1126 		if (control)
1127 			m_freem(control);
1128 		m_freem(m);
1129 		return (EMSGSIZE);
1130 	}
1131 
1132 	src.sin_family = 0;
1133 	sin = (struct sockaddr_in *)addr;
1134 	if (sin == NULL ||
1135 	    (inp->inp_laddr.s_addr == INADDR_ANY && inp->inp_lport == 0)) {
1136 		INP_WLOCK(inp);
1137 		unlock_inp = UH_WLOCKED;
1138 	} else {
1139 		INP_RLOCK(inp);
1140 		unlock_inp = UH_RLOCKED;
1141 	}
1142 	tos = inp->inp_ip_tos;
1143 	if (control != NULL) {
1144 		/*
1145 		 * XXX: Currently, we assume all the optional information is
1146 		 * stored in a single mbuf.
1147 		 */
1148 		if (control->m_next) {
1149 			if (unlock_inp == UH_WLOCKED)
1150 				INP_WUNLOCK(inp);
1151 			else
1152 				INP_RUNLOCK(inp);
1153 			m_freem(control);
1154 			m_freem(m);
1155 			return (EINVAL);
1156 		}
1157 		for (; control->m_len > 0;
1158 		    control->m_data += CMSG_ALIGN(cm->cmsg_len),
1159 		    control->m_len -= CMSG_ALIGN(cm->cmsg_len)) {
1160 			cm = mtod(control, struct cmsghdr *);
1161 			if (control->m_len < sizeof(*cm) || cm->cmsg_len == 0
1162 			    || cm->cmsg_len > control->m_len) {
1163 				error = EINVAL;
1164 				break;
1165 			}
1166 			if (cm->cmsg_level != IPPROTO_IP)
1167 				continue;
1168 
1169 			switch (cm->cmsg_type) {
1170 			case IP_SENDSRCADDR:
1171 				if (cm->cmsg_len !=
1172 				    CMSG_LEN(sizeof(struct in_addr))) {
1173 					error = EINVAL;
1174 					break;
1175 				}
1176 				bzero(&src, sizeof(src));
1177 				src.sin_family = AF_INET;
1178 				src.sin_len = sizeof(src);
1179 				src.sin_port = inp->inp_lport;
1180 				src.sin_addr =
1181 				    *(struct in_addr *)CMSG_DATA(cm);
1182 				break;
1183 
1184 			case IP_TOS:
1185 				if (cm->cmsg_len != CMSG_LEN(sizeof(u_char))) {
1186 					error = EINVAL;
1187 					break;
1188 				}
1189 				tos = *(u_char *)CMSG_DATA(cm);
1190 				break;
1191 
1192 			case IP_FLOWID:
1193 				if (cm->cmsg_len != CMSG_LEN(sizeof(uint32_t))) {
1194 					error = EINVAL;
1195 					break;
1196 				}
1197 				flowid = *(uint32_t *) CMSG_DATA(cm);
1198 				break;
1199 
1200 			case IP_FLOWTYPE:
1201 				if (cm->cmsg_len != CMSG_LEN(sizeof(uint32_t))) {
1202 					error = EINVAL;
1203 					break;
1204 				}
1205 				flowtype = *(uint32_t *) CMSG_DATA(cm);
1206 				break;
1207 
1208 #ifdef	RSS
1209 			case IP_RSSBUCKETID:
1210 				if (cm->cmsg_len != CMSG_LEN(sizeof(uint32_t))) {
1211 					error = EINVAL;
1212 					break;
1213 				}
1214 				/* This is just a placeholder for now */
1215 				break;
1216 #endif	/* RSS */
1217 			default:
1218 				error = ENOPROTOOPT;
1219 				break;
1220 			}
1221 			if (error)
1222 				break;
1223 		}
1224 		m_freem(control);
1225 	}
1226 	if (error) {
1227 		if (unlock_inp == UH_WLOCKED)
1228 			INP_WUNLOCK(inp);
1229 		else
1230 			INP_RUNLOCK(inp);
1231 		m_freem(m);
1232 		return (error);
1233 	}
1234 
1235 	/*
1236 	 * Depending on whether or not the application has bound or connected
1237 	 * the socket, we may have to do varying levels of work.  The optimal
1238 	 * case is for a connected UDP socket, as a global lock isn't
1239 	 * required at all.
1240 	 *
1241 	 * In order to decide which we need, we require stability of the
1242 	 * inpcb binding, which we ensure by acquiring a read lock on the
1243 	 * inpcb.  This doesn't strictly follow the lock order, so we play
1244 	 * the trylock and retry game; note that we may end up with more
1245 	 * conservative locks than required the second time around, so later
1246 	 * assertions have to accept that.  Further analysis of the number of
1247 	 * misses under contention is required.
1248 	 *
1249 	 * XXXRW: Check that hash locking update here is correct.
1250 	 */
1251 	pr = inp->inp_socket->so_proto->pr_protocol;
1252 	pcbinfo = udp_get_inpcbinfo(pr);
1253 	sin = (struct sockaddr_in *)addr;
1254 	if (sin != NULL &&
1255 	    (inp->inp_laddr.s_addr == INADDR_ANY && inp->inp_lport == 0)) {
1256 		INP_HASH_WLOCK(pcbinfo);
1257 		unlock_udbinfo = UH_WLOCKED;
1258 	} else if ((sin != NULL && (
1259 	    (sin->sin_addr.s_addr == INADDR_ANY) ||
1260 	    (sin->sin_addr.s_addr == INADDR_BROADCAST) ||
1261 	    (inp->inp_laddr.s_addr == INADDR_ANY) ||
1262 	    (inp->inp_lport == 0))) ||
1263 	    (src.sin_family == AF_INET)) {
1264 		INP_HASH_RLOCK(pcbinfo);
1265 		unlock_udbinfo = UH_RLOCKED;
1266 	} else
1267 		unlock_udbinfo = UH_UNLOCKED;
1268 
1269 	/*
1270 	 * If the IP_SENDSRCADDR control message was specified, override the
1271 	 * source address for this datagram.  Its use is invalidated if the
1272 	 * address thus specified is incomplete or clobbers other inpcbs.
1273 	 */
1274 	laddr = inp->inp_laddr;
1275 	lport = inp->inp_lport;
1276 	if (src.sin_family == AF_INET) {
1277 		INP_HASH_LOCK_ASSERT(pcbinfo);
1278 		if ((lport == 0) ||
1279 		    (laddr.s_addr == INADDR_ANY &&
1280 		     src.sin_addr.s_addr == INADDR_ANY)) {
1281 			error = EINVAL;
1282 			goto release;
1283 		}
1284 		error = in_pcbbind_setup(inp, (struct sockaddr *)&src,
1285 		    &laddr.s_addr, &lport, td->td_ucred);
1286 		if (error)
1287 			goto release;
1288 	}
1289 
1290 	/*
1291 	 * If a UDP socket has been connected, then a local address/port will
1292 	 * have been selected and bound.
1293 	 *
1294 	 * If a UDP socket has not been connected to, then an explicit
1295 	 * destination address must be used, in which case a local
1296 	 * address/port may not have been selected and bound.
1297 	 */
1298 	if (sin != NULL) {
1299 		INP_LOCK_ASSERT(inp);
1300 		if (inp->inp_faddr.s_addr != INADDR_ANY) {
1301 			error = EISCONN;
1302 			goto release;
1303 		}
1304 
1305 		/*
1306 		 * Jail may rewrite the destination address, so let it do
1307 		 * that before we use it.
1308 		 */
1309 		error = prison_remote_ip4(td->td_ucred, &sin->sin_addr);
1310 		if (error)
1311 			goto release;
1312 
1313 		/*
1314 		 * If a local address or port hasn't yet been selected, or if
1315 		 * the destination address needs to be rewritten due to using
1316 		 * a special INADDR_ constant, invoke in_pcbconnect_setup()
1317 		 * to do the heavy lifting.  Once a port is selected, we
1318 		 * commit the binding back to the socket; we also commit the
1319 		 * binding of the address if in jail.
1320 		 *
1321 		 * If we already have a valid binding and we're not
1322 		 * requesting a destination address rewrite, use a fast path.
1323 		 */
1324 		if (inp->inp_laddr.s_addr == INADDR_ANY ||
1325 		    inp->inp_lport == 0 ||
1326 		    sin->sin_addr.s_addr == INADDR_ANY ||
1327 		    sin->sin_addr.s_addr == INADDR_BROADCAST) {
1328 			INP_HASH_LOCK_ASSERT(pcbinfo);
1329 			error = in_pcbconnect_setup(inp, addr, &laddr.s_addr,
1330 			    &lport, &faddr.s_addr, &fport, NULL,
1331 			    td->td_ucred);
1332 			if (error)
1333 				goto release;
1334 
1335 			/*
1336 			 * XXXRW: Why not commit the port if the address is
1337 			 * !INADDR_ANY?
1338 			 */
1339 			/* Commit the local port if newly assigned. */
1340 			if (inp->inp_laddr.s_addr == INADDR_ANY &&
1341 			    inp->inp_lport == 0) {
1342 				INP_WLOCK_ASSERT(inp);
1343 				INP_HASH_WLOCK_ASSERT(pcbinfo);
1344 				/*
1345 				 * Remember addr if jailed, to prevent
1346 				 * rebinding.
1347 				 */
1348 				if (prison_flag(td->td_ucred, PR_IP4))
1349 					inp->inp_laddr = laddr;
1350 				inp->inp_lport = lport;
1351 				if (in_pcbinshash(inp) != 0) {
1352 					inp->inp_lport = 0;
1353 					error = EAGAIN;
1354 					goto release;
1355 				}
1356 				inp->inp_flags |= INP_ANONPORT;
1357 			}
1358 		} else {
1359 			faddr = sin->sin_addr;
1360 			fport = sin->sin_port;
1361 		}
1362 	} else {
1363 		INP_LOCK_ASSERT(inp);
1364 		faddr = inp->inp_faddr;
1365 		fport = inp->inp_fport;
1366 		if (faddr.s_addr == INADDR_ANY) {
1367 			error = ENOTCONN;
1368 			goto release;
1369 		}
1370 	}
1371 
1372 	/*
1373 	 * Calculate data length and get a mbuf for UDP, IP, and possible
1374 	 * link-layer headers.  Immediate slide the data pointer back forward
1375 	 * since we won't use that space at this layer.
1376 	 */
1377 	M_PREPEND(m, sizeof(struct udpiphdr) + max_linkhdr, M_NOWAIT);
1378 	if (m == NULL) {
1379 		error = ENOBUFS;
1380 		goto release;
1381 	}
1382 	m->m_data += max_linkhdr;
1383 	m->m_len -= max_linkhdr;
1384 	m->m_pkthdr.len -= max_linkhdr;
1385 
1386 	/*
1387 	 * Fill in mbuf with extended UDP header and addresses and length put
1388 	 * into network format.
1389 	 */
1390 	ui = mtod(m, struct udpiphdr *);
1391 	bzero(ui->ui_x1, sizeof(ui->ui_x1));	/* XXX still needed? */
1392 	ui->ui_pr = pr;
1393 	ui->ui_src = laddr;
1394 	ui->ui_dst = faddr;
1395 	ui->ui_sport = lport;
1396 	ui->ui_dport = fport;
1397 	ui->ui_ulen = htons((u_short)len + sizeof(struct udphdr));
1398 	if (pr == IPPROTO_UDPLITE) {
1399 		struct udpcb *up;
1400 		uint16_t plen;
1401 
1402 		up = intoudpcb(inp);
1403 		cscov = up->u_txcslen;
1404 		plen = (u_short)len + sizeof(struct udphdr);
1405 		if (cscov >= plen)
1406 			cscov = 0;
1407 		ui->ui_len = htons(plen);
1408 		ui->ui_ulen = htons(cscov);
1409 		/*
1410 		 * For UDP-Lite, checksum coverage length of zero means
1411 		 * the entire UDPLite packet is covered by the checksum.
1412 		 */
1413 		cscov_partial = (cscov == 0) ? 0 : 1;
1414 	} else
1415 		ui->ui_v = IPVERSION << 4;
1416 
1417 	/*
1418 	 * Set the Don't Fragment bit in the IP header.
1419 	 */
1420 	if (inp->inp_flags & INP_DONTFRAG) {
1421 		struct ip *ip;
1422 
1423 		ip = (struct ip *)&ui->ui_i;
1424 		ip->ip_off |= htons(IP_DF);
1425 	}
1426 
1427 	ipflags = 0;
1428 	if (inp->inp_socket->so_options & SO_DONTROUTE)
1429 		ipflags |= IP_ROUTETOIF;
1430 	if (inp->inp_socket->so_options & SO_BROADCAST)
1431 		ipflags |= IP_ALLOWBROADCAST;
1432 	if (inp->inp_flags & INP_ONESBCAST)
1433 		ipflags |= IP_SENDONES;
1434 
1435 #ifdef MAC
1436 	mac_inpcb_create_mbuf(inp, m);
1437 #endif
1438 
1439 	/*
1440 	 * Set up checksum and output datagram.
1441 	 */
1442 	ui->ui_sum = 0;
1443 	if (pr == IPPROTO_UDPLITE) {
1444 		if (inp->inp_flags & INP_ONESBCAST)
1445 			faddr.s_addr = INADDR_BROADCAST;
1446 		if (cscov_partial) {
1447 			if ((ui->ui_sum = in_cksum(m, sizeof(struct ip) + cscov)) == 0)
1448 				ui->ui_sum = 0xffff;
1449 		} else {
1450 			if ((ui->ui_sum = in_cksum(m, sizeof(struct udpiphdr) + len)) == 0)
1451 				ui->ui_sum = 0xffff;
1452 		}
1453 	} else if (V_udp_cksum) {
1454 		if (inp->inp_flags & INP_ONESBCAST)
1455 			faddr.s_addr = INADDR_BROADCAST;
1456 		ui->ui_sum = in_pseudo(ui->ui_src.s_addr, faddr.s_addr,
1457 		    htons((u_short)len + sizeof(struct udphdr) + pr));
1458 		m->m_pkthdr.csum_flags = CSUM_UDP;
1459 		m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum);
1460 	}
1461 	((struct ip *)ui)->ip_len = htons(sizeof(struct udpiphdr) + len);
1462 	((struct ip *)ui)->ip_ttl = inp->inp_ip_ttl;	/* XXX */
1463 	((struct ip *)ui)->ip_tos = tos;		/* XXX */
1464 	UDPSTAT_INC(udps_opackets);
1465 
1466 	/*
1467 	 * Setup flowid / RSS information for outbound socket.
1468 	 *
1469 	 * Once the UDP code decides to set a flowid some other way,
1470 	 * this allows the flowid to be overridden by userland.
1471 	 */
1472 	if (flowtype != M_HASHTYPE_NONE) {
1473 		m->m_pkthdr.flowid = flowid;
1474 		M_HASHTYPE_SET(m, flowtype);
1475 #ifdef	RSS
1476 	} else {
1477 		uint32_t hash_val, hash_type;
1478 		/*
1479 		 * Calculate an appropriate RSS hash for UDP and
1480 		 * UDP Lite.
1481 		 *
1482 		 * The called function will take care of figuring out
1483 		 * whether a 2-tuple or 4-tuple hash is required based
1484 		 * on the currently configured scheme.
1485 		 *
1486 		 * Later later on connected socket values should be
1487 		 * cached in the inpcb and reused, rather than constantly
1488 		 * re-calculating it.
1489 		 *
1490 		 * UDP Lite is a different protocol number and will
1491 		 * likely end up being hashed as a 2-tuple until
1492 		 * RSS / NICs grow UDP Lite protocol awareness.
1493 		 */
1494 		if (rss_proto_software_hash_v4(faddr, laddr, fport, lport,
1495 		    pr, &hash_val, &hash_type) == 0) {
1496 			m->m_pkthdr.flowid = hash_val;
1497 			M_HASHTYPE_SET(m, hash_type);
1498 		}
1499 #endif
1500 	}
1501 
1502 #ifdef	RSS
1503 	/*
1504 	 * Don't override with the inp cached flowid value.
1505 	 *
1506 	 * Depending upon the kind of send being done, the inp
1507 	 * flowid/flowtype values may actually not be appropriate
1508 	 * for this particular socket send.
1509 	 *
1510 	 * We should either leave the flowid at zero (which is what is
1511 	 * currently done) or set it to some software generated
1512 	 * hash value based on the packet contents.
1513 	 */
1514 	ipflags |= IP_NODEFAULTFLOWID;
1515 #endif	/* RSS */
1516 
1517 	if (unlock_udbinfo == UH_WLOCKED)
1518 		INP_HASH_WUNLOCK(pcbinfo);
1519 	else if (unlock_udbinfo == UH_RLOCKED)
1520 		INP_HASH_RUNLOCK(pcbinfo);
1521 	UDP_PROBE(send, NULL, inp, &ui->ui_i, inp, &ui->ui_u);
1522 	error = ip_output(m, inp->inp_options,
1523 	    (unlock_inp == UH_WLOCKED ? &inp->inp_route : NULL), ipflags,
1524 	    inp->inp_moptions, inp);
1525 	if (unlock_inp == UH_WLOCKED)
1526 		INP_WUNLOCK(inp);
1527 	else
1528 		INP_RUNLOCK(inp);
1529 	return (error);
1530 
1531 release:
1532 	if (unlock_udbinfo == UH_WLOCKED) {
1533 		KASSERT(unlock_inp == UH_WLOCKED,
1534 		    ("%s: excl udbinfo lock, shared inp lock", __func__));
1535 		INP_HASH_WUNLOCK(pcbinfo);
1536 		INP_WUNLOCK(inp);
1537 	} else if (unlock_udbinfo == UH_RLOCKED) {
1538 		KASSERT(unlock_inp == UH_RLOCKED,
1539 		    ("%s: shared udbinfo lock, excl inp lock", __func__));
1540 		INP_HASH_RUNLOCK(pcbinfo);
1541 		INP_RUNLOCK(inp);
1542 	} else if (unlock_inp == UH_WLOCKED)
1543 		INP_WUNLOCK(inp);
1544 	else
1545 		INP_RUNLOCK(inp);
1546 	m_freem(m);
1547 	return (error);
1548 }
1549 
1550 static void
1551 udp_abort(struct socket *so)
1552 {
1553 	struct inpcb *inp;
1554 	struct inpcbinfo *pcbinfo;
1555 
1556 	pcbinfo = udp_get_inpcbinfo(so->so_proto->pr_protocol);
1557 	inp = sotoinpcb(so);
1558 	KASSERT(inp != NULL, ("udp_abort: inp == NULL"));
1559 	INP_WLOCK(inp);
1560 	if (inp->inp_faddr.s_addr != INADDR_ANY) {
1561 		INP_HASH_WLOCK(pcbinfo);
1562 		in_pcbdisconnect(inp);
1563 		inp->inp_laddr.s_addr = INADDR_ANY;
1564 		INP_HASH_WUNLOCK(pcbinfo);
1565 		soisdisconnected(so);
1566 	}
1567 	INP_WUNLOCK(inp);
1568 }
1569 
1570 static int
1571 udp_attach(struct socket *so, int proto, struct thread *td)
1572 {
1573 	struct inpcb *inp;
1574 	struct inpcbinfo *pcbinfo;
1575 	int error;
1576 
1577 	pcbinfo = udp_get_inpcbinfo(so->so_proto->pr_protocol);
1578 	inp = sotoinpcb(so);
1579 	KASSERT(inp == NULL, ("udp_attach: inp != NULL"));
1580 	error = soreserve(so, udp_sendspace, udp_recvspace);
1581 	if (error)
1582 		return (error);
1583 	INP_INFO_WLOCK(pcbinfo);
1584 	error = in_pcballoc(so, pcbinfo);
1585 	if (error) {
1586 		INP_INFO_WUNLOCK(pcbinfo);
1587 		return (error);
1588 	}
1589 
1590 	inp = sotoinpcb(so);
1591 	inp->inp_vflag |= INP_IPV4;
1592 	inp->inp_ip_ttl = V_ip_defttl;
1593 
1594 	error = udp_newudpcb(inp);
1595 	if (error) {
1596 		in_pcbdetach(inp);
1597 		in_pcbfree(inp);
1598 		INP_INFO_WUNLOCK(pcbinfo);
1599 		return (error);
1600 	}
1601 
1602 	INP_WUNLOCK(inp);
1603 	INP_INFO_WUNLOCK(pcbinfo);
1604 	return (0);
1605 }
1606 #endif /* INET */
1607 
1608 int
1609 udp_set_kernel_tunneling(struct socket *so, udp_tun_func_t f, udp_tun_icmp_t i, void *ctx)
1610 {
1611 	struct inpcb *inp;
1612 	struct udpcb *up;
1613 
1614 	KASSERT(so->so_type == SOCK_DGRAM,
1615 	    ("udp_set_kernel_tunneling: !dgram"));
1616 	inp = sotoinpcb(so);
1617 	KASSERT(inp != NULL, ("udp_set_kernel_tunneling: inp == NULL"));
1618 	INP_WLOCK(inp);
1619 	up = intoudpcb(inp);
1620 	if ((up->u_tun_func != NULL) ||
1621 	    (up->u_icmp_func != NULL)) {
1622 		INP_WUNLOCK(inp);
1623 		return (EBUSY);
1624 	}
1625 	up->u_tun_func = f;
1626 	up->u_icmp_func = i;
1627 	up->u_tun_ctx = ctx;
1628 	INP_WUNLOCK(inp);
1629 	return (0);
1630 }
1631 
1632 #ifdef INET
1633 static int
1634 udp_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
1635 {
1636 	struct inpcb *inp;
1637 	struct inpcbinfo *pcbinfo;
1638 	int error;
1639 
1640 	pcbinfo = udp_get_inpcbinfo(so->so_proto->pr_protocol);
1641 	inp = sotoinpcb(so);
1642 	KASSERT(inp != NULL, ("udp_bind: inp == NULL"));
1643 	INP_WLOCK(inp);
1644 	INP_HASH_WLOCK(pcbinfo);
1645 	error = in_pcbbind(inp, nam, td->td_ucred);
1646 	INP_HASH_WUNLOCK(pcbinfo);
1647 	INP_WUNLOCK(inp);
1648 	return (error);
1649 }
1650 
1651 static void
1652 udp_close(struct socket *so)
1653 {
1654 	struct inpcb *inp;
1655 	struct inpcbinfo *pcbinfo;
1656 
1657 	pcbinfo = udp_get_inpcbinfo(so->so_proto->pr_protocol);
1658 	inp = sotoinpcb(so);
1659 	KASSERT(inp != NULL, ("udp_close: inp == NULL"));
1660 	INP_WLOCK(inp);
1661 	if (inp->inp_faddr.s_addr != INADDR_ANY) {
1662 		INP_HASH_WLOCK(pcbinfo);
1663 		in_pcbdisconnect(inp);
1664 		inp->inp_laddr.s_addr = INADDR_ANY;
1665 		INP_HASH_WUNLOCK(pcbinfo);
1666 		soisdisconnected(so);
1667 	}
1668 	INP_WUNLOCK(inp);
1669 }
1670 
1671 static int
1672 udp_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
1673 {
1674 	struct inpcb *inp;
1675 	struct inpcbinfo *pcbinfo;
1676 	struct sockaddr_in *sin;
1677 	int error;
1678 
1679 	pcbinfo = udp_get_inpcbinfo(so->so_proto->pr_protocol);
1680 	inp = sotoinpcb(so);
1681 	KASSERT(inp != NULL, ("udp_connect: inp == NULL"));
1682 	INP_WLOCK(inp);
1683 	if (inp->inp_faddr.s_addr != INADDR_ANY) {
1684 		INP_WUNLOCK(inp);
1685 		return (EISCONN);
1686 	}
1687 	sin = (struct sockaddr_in *)nam;
1688 	error = prison_remote_ip4(td->td_ucred, &sin->sin_addr);
1689 	if (error != 0) {
1690 		INP_WUNLOCK(inp);
1691 		return (error);
1692 	}
1693 	INP_HASH_WLOCK(pcbinfo);
1694 	error = in_pcbconnect(inp, nam, td->td_ucred);
1695 	INP_HASH_WUNLOCK(pcbinfo);
1696 	if (error == 0)
1697 		soisconnected(so);
1698 	INP_WUNLOCK(inp);
1699 	return (error);
1700 }
1701 
1702 static void
1703 udp_detach(struct socket *so)
1704 {
1705 	struct inpcb *inp;
1706 	struct inpcbinfo *pcbinfo;
1707 	struct udpcb *up;
1708 
1709 	pcbinfo = udp_get_inpcbinfo(so->so_proto->pr_protocol);
1710 	inp = sotoinpcb(so);
1711 	KASSERT(inp != NULL, ("udp_detach: inp == NULL"));
1712 	KASSERT(inp->inp_faddr.s_addr == INADDR_ANY,
1713 	    ("udp_detach: not disconnected"));
1714 	INP_INFO_WLOCK(pcbinfo);
1715 	INP_WLOCK(inp);
1716 	up = intoudpcb(inp);
1717 	KASSERT(up != NULL, ("%s: up == NULL", __func__));
1718 	inp->inp_ppcb = NULL;
1719 	in_pcbdetach(inp);
1720 	in_pcbfree(inp);
1721 	INP_INFO_WUNLOCK(pcbinfo);
1722 	udp_discardcb(up);
1723 }
1724 
1725 static int
1726 udp_disconnect(struct socket *so)
1727 {
1728 	struct inpcb *inp;
1729 	struct inpcbinfo *pcbinfo;
1730 
1731 	pcbinfo = udp_get_inpcbinfo(so->so_proto->pr_protocol);
1732 	inp = sotoinpcb(so);
1733 	KASSERT(inp != NULL, ("udp_disconnect: inp == NULL"));
1734 	INP_WLOCK(inp);
1735 	if (inp->inp_faddr.s_addr == INADDR_ANY) {
1736 		INP_WUNLOCK(inp);
1737 		return (ENOTCONN);
1738 	}
1739 	INP_HASH_WLOCK(pcbinfo);
1740 	in_pcbdisconnect(inp);
1741 	inp->inp_laddr.s_addr = INADDR_ANY;
1742 	INP_HASH_WUNLOCK(pcbinfo);
1743 	SOCK_LOCK(so);
1744 	so->so_state &= ~SS_ISCONNECTED;		/* XXX */
1745 	SOCK_UNLOCK(so);
1746 	INP_WUNLOCK(inp);
1747 	return (0);
1748 }
1749 
1750 static int
1751 udp_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr,
1752     struct mbuf *control, struct thread *td)
1753 {
1754 	struct inpcb *inp;
1755 
1756 	inp = sotoinpcb(so);
1757 	KASSERT(inp != NULL, ("udp_send: inp == NULL"));
1758 	return (udp_output(inp, m, addr, control, td));
1759 }
1760 #endif /* INET */
1761 
1762 int
1763 udp_shutdown(struct socket *so)
1764 {
1765 	struct inpcb *inp;
1766 
1767 	inp = sotoinpcb(so);
1768 	KASSERT(inp != NULL, ("udp_shutdown: inp == NULL"));
1769 	INP_WLOCK(inp);
1770 	socantsendmore(so);
1771 	INP_WUNLOCK(inp);
1772 	return (0);
1773 }
1774 
1775 #ifdef INET
1776 struct pr_usrreqs udp_usrreqs = {
1777 	.pru_abort =		udp_abort,
1778 	.pru_attach =		udp_attach,
1779 	.pru_bind =		udp_bind,
1780 	.pru_connect =		udp_connect,
1781 	.pru_control =		in_control,
1782 	.pru_detach =		udp_detach,
1783 	.pru_disconnect =	udp_disconnect,
1784 	.pru_peeraddr =		in_getpeeraddr,
1785 	.pru_send =		udp_send,
1786 	.pru_soreceive =	soreceive_dgram,
1787 	.pru_sosend =		sosend_dgram,
1788 	.pru_shutdown =		udp_shutdown,
1789 	.pru_sockaddr =		in_getsockaddr,
1790 	.pru_sosetlabel =	in_pcbsosetlabel,
1791 	.pru_close =		udp_close,
1792 };
1793 #endif /* INET */
1794