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