xref: /xnu-11215.41.3/bsd/netinet/in_proto.c (revision 33de042d024d46de5ff4e89f2471de6608e37fa4)
1*33de042dSApple OSS Distributions /*
2*33de042dSApple OSS Distributions  * Copyright (c) 2000-2024 Apple Inc. All rights reserved.
3*33de042dSApple OSS Distributions  *
4*33de042dSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*33de042dSApple OSS Distributions  *
6*33de042dSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*33de042dSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*33de042dSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*33de042dSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*33de042dSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*33de042dSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*33de042dSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*33de042dSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*33de042dSApple OSS Distributions  *
15*33de042dSApple OSS Distributions  * Please obtain a copy of the License at
16*33de042dSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*33de042dSApple OSS Distributions  *
18*33de042dSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*33de042dSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*33de042dSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*33de042dSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*33de042dSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*33de042dSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*33de042dSApple OSS Distributions  * limitations under the License.
25*33de042dSApple OSS Distributions  *
26*33de042dSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*33de042dSApple OSS Distributions  */
28*33de042dSApple OSS Distributions /*
29*33de042dSApple OSS Distributions  * Copyright (c) 1982, 1986, 1993
30*33de042dSApple OSS Distributions  *	The Regents of the University of California.  All rights reserved.
31*33de042dSApple OSS Distributions  *
32*33de042dSApple OSS Distributions  * Redistribution and use in source and binary forms, with or without
33*33de042dSApple OSS Distributions  * modification, are permitted provided that the following conditions
34*33de042dSApple OSS Distributions  * are met:
35*33de042dSApple OSS Distributions  * 1. Redistributions of source code must retain the above copyright
36*33de042dSApple OSS Distributions  *    notice, this list of conditions and the following disclaimer.
37*33de042dSApple OSS Distributions  * 2. Redistributions in binary form must reproduce the above copyright
38*33de042dSApple OSS Distributions  *    notice, this list of conditions and the following disclaimer in the
39*33de042dSApple OSS Distributions  *    documentation and/or other materials provided with the distribution.
40*33de042dSApple OSS Distributions  * 3. All advertising materials mentioning features or use of this software
41*33de042dSApple OSS Distributions  *    must display the following acknowledgement:
42*33de042dSApple OSS Distributions  *	This product includes software developed by the University of
43*33de042dSApple OSS Distributions  *	California, Berkeley and its contributors.
44*33de042dSApple OSS Distributions  * 4. Neither the name of the University nor the names of its contributors
45*33de042dSApple OSS Distributions  *    may be used to endorse or promote products derived from this software
46*33de042dSApple OSS Distributions  *    without specific prior written permission.
47*33de042dSApple OSS Distributions  *
48*33de042dSApple OSS Distributions  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49*33de042dSApple OSS Distributions  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50*33de042dSApple OSS Distributions  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51*33de042dSApple OSS Distributions  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52*33de042dSApple OSS Distributions  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53*33de042dSApple OSS Distributions  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54*33de042dSApple OSS Distributions  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55*33de042dSApple OSS Distributions  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56*33de042dSApple OSS Distributions  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57*33de042dSApple OSS Distributions  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58*33de042dSApple OSS Distributions  * SUCH DAMAGE.
59*33de042dSApple OSS Distributions  *
60*33de042dSApple OSS Distributions  *	@(#)in_proto.c	8.2 (Berkeley) 2/9/95
61*33de042dSApple OSS Distributions  */
62*33de042dSApple OSS Distributions 
63*33de042dSApple OSS Distributions #include <sys/param.h>
64*33de042dSApple OSS Distributions #include <sys/kernel.h>
65*33de042dSApple OSS Distributions #include <sys/socket.h>
66*33de042dSApple OSS Distributions #include <sys/domain.h>
67*33de042dSApple OSS Distributions #include <sys/protosw.h>
68*33de042dSApple OSS Distributions #include <sys/queue.h>
69*33de042dSApple OSS Distributions #include <sys/sysctl.h>
70*33de042dSApple OSS Distributions #include <sys/mbuf.h>
71*33de042dSApple OSS Distributions 
72*33de042dSApple OSS Distributions #include <kern/debug.h>
73*33de042dSApple OSS Distributions 
74*33de042dSApple OSS Distributions #include <net/if.h>
75*33de042dSApple OSS Distributions #include <net/route.h>
76*33de042dSApple OSS Distributions #include <net/kpi_protocol.h>
77*33de042dSApple OSS Distributions 
78*33de042dSApple OSS Distributions #include <netinet/in.h>
79*33de042dSApple OSS Distributions #include <netinet/in_var.h>
80*33de042dSApple OSS Distributions #include <netinet/in_systm.h>
81*33de042dSApple OSS Distributions #include <netinet/ip.h>
82*33de042dSApple OSS Distributions #include <netinet/ip_var.h>
83*33de042dSApple OSS Distributions #include <netinet/ip_icmp.h>
84*33de042dSApple OSS Distributions #include <netinet/igmp_var.h>
85*33de042dSApple OSS Distributions #include <netinet/tcp.h>
86*33de042dSApple OSS Distributions #include <netinet/tcp_timer.h>
87*33de042dSApple OSS Distributions #include <netinet/tcp_var.h>
88*33de042dSApple OSS Distributions #include <netinet/tcpip.h>
89*33de042dSApple OSS Distributions #include <netinet/udp.h>
90*33de042dSApple OSS Distributions #include <netinet/udp_var.h>
91*33de042dSApple OSS Distributions #include <netinet/ip_encap.h>
92*33de042dSApple OSS Distributions 
93*33de042dSApple OSS Distributions /*
94*33de042dSApple OSS Distributions  * TCP/IP protocol family: IP, ICMP, UDP, TCP.
95*33de042dSApple OSS Distributions  */
96*33de042dSApple OSS Distributions 
97*33de042dSApple OSS Distributions #if IPSEC
98*33de042dSApple OSS Distributions #include <netinet6/ipsec.h>
99*33de042dSApple OSS Distributions #include <netinet6/ah.h>
100*33de042dSApple OSS Distributions #if IPSEC_ESP
101*33de042dSApple OSS Distributions #include <netinet6/esp.h>
102*33de042dSApple OSS Distributions #endif
103*33de042dSApple OSS Distributions #endif /* IPSEC */
104*33de042dSApple OSS Distributions 
105*33de042dSApple OSS Distributions static void in_dinit(struct domain *);
106*33de042dSApple OSS Distributions static void ip_proto_input(protocol_family_t, mbuf_t);
107*33de042dSApple OSS Distributions 
108*33de042dSApple OSS Distributions extern struct domain inetdomain_s;
109*33de042dSApple OSS Distributions static struct pr_usrreqs nousrreqs;
110*33de042dSApple OSS Distributions extern struct pr_usrreqs icmp_dgram_usrreqs;
111*33de042dSApple OSS Distributions extern int icmp_dgram_ctloutput(struct socket *, struct sockopt *);
112*33de042dSApple OSS Distributions 
113*33de042dSApple OSS Distributions struct domain *inetdomain = NULL;
114*33de042dSApple OSS Distributions 
115*33de042dSApple OSS Distributions /* Thanks to PPP, this still needs to be exported */
116*33de042dSApple OSS Distributions lck_mtx_t       *inet_domain_mutex;
117*33de042dSApple OSS Distributions 
118*33de042dSApple OSS Distributions static struct protosw inetsw[] = {
119*33de042dSApple OSS Distributions 	{
120*33de042dSApple OSS Distributions 		.pr_type =              0,
121*33de042dSApple OSS Distributions 		.pr_protocol =          0,
122*33de042dSApple OSS Distributions 		.pr_init =              ip_init,
123*33de042dSApple OSS Distributions 		.pr_drain =             ip_drain,
124*33de042dSApple OSS Distributions 		.pr_usrreqs =           &nousrreqs,
125*33de042dSApple OSS Distributions 	},
126*33de042dSApple OSS Distributions 	{
127*33de042dSApple OSS Distributions 		.pr_type =              SOCK_DGRAM,
128*33de042dSApple OSS Distributions 		.pr_protocol =          IPPROTO_UDP,
129*33de042dSApple OSS Distributions 		.pr_flags =             PR_ATOMIC | PR_ADDR | PR_PROTOLOCK | PR_PCBLOCK |
130*33de042dSApple OSS Distributions     PR_EVCONNINFO | PR_PRECONN_WRITE,
131*33de042dSApple OSS Distributions 		.pr_input =             udp_input,
132*33de042dSApple OSS Distributions 		.pr_ctlinput =          udp_ctlinput,
133*33de042dSApple OSS Distributions 		.pr_ctloutput =         udp_ctloutput,
134*33de042dSApple OSS Distributions 		.pr_init =              udp_init,
135*33de042dSApple OSS Distributions 		.pr_usrreqs =           &udp_usrreqs,
136*33de042dSApple OSS Distributions 		.pr_lock =              udp_lock,
137*33de042dSApple OSS Distributions 		.pr_unlock =            udp_unlock,
138*33de042dSApple OSS Distributions 		.pr_getlock =           udp_getlock,
139*33de042dSApple OSS Distributions 		.pr_update_last_owner = inp_update_last_owner,
140*33de042dSApple OSS Distributions 		.pr_copy_last_owner =   inp_copy_last_owner,
141*33de042dSApple OSS Distributions 	},
142*33de042dSApple OSS Distributions 	{
143*33de042dSApple OSS Distributions 		.pr_type =              SOCK_STREAM,
144*33de042dSApple OSS Distributions 		.pr_protocol =          IPPROTO_TCP,
145*33de042dSApple OSS Distributions 		.pr_flags =             PR_CONNREQUIRED | PR_WANTRCVD | PR_PCBLOCK |
146*33de042dSApple OSS Distributions     PR_PROTOLOCK | PR_DISPOSE | PR_EVCONNINFO |
147*33de042dSApple OSS Distributions     PR_PRECONN_WRITE | PR_DATA_IDEMPOTENT,
148*33de042dSApple OSS Distributions 		.pr_input =             tcp_input,
149*33de042dSApple OSS Distributions 		.pr_ctlinput =          tcp_ctlinput,
150*33de042dSApple OSS Distributions 		.pr_ctloutput =         tcp_ctloutput,
151*33de042dSApple OSS Distributions 		.pr_init =              tcp_init,
152*33de042dSApple OSS Distributions 		.pr_drain =             tcp_drain,
153*33de042dSApple OSS Distributions 		.pr_usrreqs =           &tcp_usrreqs,
154*33de042dSApple OSS Distributions 		.pr_lock =              tcp_lock,
155*33de042dSApple OSS Distributions 		.pr_unlock =            tcp_unlock,
156*33de042dSApple OSS Distributions 		.pr_getlock =           tcp_getlock,
157*33de042dSApple OSS Distributions 		.pr_update_last_owner = inp_update_last_owner,
158*33de042dSApple OSS Distributions 		.pr_copy_last_owner =   inp_copy_last_owner,
159*33de042dSApple OSS Distributions 	},
160*33de042dSApple OSS Distributions 	{
161*33de042dSApple OSS Distributions 		.pr_type =              SOCK_RAW,
162*33de042dSApple OSS Distributions 		.pr_protocol =          IPPROTO_RAW,
163*33de042dSApple OSS Distributions 		.pr_flags =             PR_ATOMIC | PR_ADDR,
164*33de042dSApple OSS Distributions 		.pr_input =             rip_input,
165*33de042dSApple OSS Distributions 		.pr_ctlinput =          rip_ctlinput,
166*33de042dSApple OSS Distributions 		.pr_ctloutput =         rip_ctloutput,
167*33de042dSApple OSS Distributions 		.pr_usrreqs =           &rip_usrreqs,
168*33de042dSApple OSS Distributions 		.pr_unlock =            rip_unlock,
169*33de042dSApple OSS Distributions 		.pr_update_last_owner = inp_update_last_owner,
170*33de042dSApple OSS Distributions 		.pr_copy_last_owner =   inp_copy_last_owner,
171*33de042dSApple OSS Distributions 	},
172*33de042dSApple OSS Distributions 	{
173*33de042dSApple OSS Distributions 		.pr_type =              SOCK_RAW,
174*33de042dSApple OSS Distributions 		.pr_protocol =          IPPROTO_ICMP,
175*33de042dSApple OSS Distributions 		.pr_flags =             PR_ATOMIC | PR_ADDR | PR_LASTHDR,
176*33de042dSApple OSS Distributions 		.pr_input =             icmp_input,
177*33de042dSApple OSS Distributions 		.pr_ctloutput =         rip_ctloutput,
178*33de042dSApple OSS Distributions 		.pr_usrreqs =           &rip_usrreqs,
179*33de042dSApple OSS Distributions 		.pr_unlock =            rip_unlock,
180*33de042dSApple OSS Distributions 		.pr_update_last_owner = inp_update_last_owner,
181*33de042dSApple OSS Distributions 		.pr_copy_last_owner =   inp_copy_last_owner,
182*33de042dSApple OSS Distributions 	},
183*33de042dSApple OSS Distributions 	{
184*33de042dSApple OSS Distributions 		.pr_type =              SOCK_DGRAM,
185*33de042dSApple OSS Distributions 		.pr_protocol =          IPPROTO_ICMP,
186*33de042dSApple OSS Distributions 		.pr_flags =             PR_ATOMIC | PR_ADDR | PR_LASTHDR,
187*33de042dSApple OSS Distributions 		.pr_input =             icmp_input,
188*33de042dSApple OSS Distributions 		.pr_ctloutput =         icmp_dgram_ctloutput,
189*33de042dSApple OSS Distributions 		.pr_usrreqs =           &icmp_dgram_usrreqs,
190*33de042dSApple OSS Distributions 		.pr_unlock =            rip_unlock,
191*33de042dSApple OSS Distributions 		.pr_update_last_owner = inp_update_last_owner,
192*33de042dSApple OSS Distributions 		.pr_copy_last_owner =   inp_copy_last_owner,
193*33de042dSApple OSS Distributions 	},
194*33de042dSApple OSS Distributions 	{
195*33de042dSApple OSS Distributions 		.pr_type =              SOCK_RAW,
196*33de042dSApple OSS Distributions 		.pr_protocol =          IPPROTO_IGMP,
197*33de042dSApple OSS Distributions 		.pr_flags =             PR_ATOMIC | PR_ADDR | PR_LASTHDR,
198*33de042dSApple OSS Distributions 		.pr_input =             igmp_input,
199*33de042dSApple OSS Distributions 		.pr_ctloutput =         rip_ctloutput,
200*33de042dSApple OSS Distributions 		.pr_init =              igmp_init,
201*33de042dSApple OSS Distributions 		.pr_usrreqs =           &rip_usrreqs,
202*33de042dSApple OSS Distributions 		.pr_unlock =            rip_unlock,
203*33de042dSApple OSS Distributions 		.pr_update_last_owner = inp_update_last_owner,
204*33de042dSApple OSS Distributions 		.pr_copy_last_owner =   inp_copy_last_owner,
205*33de042dSApple OSS Distributions 	},
206*33de042dSApple OSS Distributions 	{
207*33de042dSApple OSS Distributions 		.pr_type =              SOCK_RAW,
208*33de042dSApple OSS Distributions 		.pr_protocol =          IPPROTO_GRE,
209*33de042dSApple OSS Distributions 		.pr_flags =             PR_ATOMIC | PR_ADDR,
210*33de042dSApple OSS Distributions 		.pr_input =             gre_input,
211*33de042dSApple OSS Distributions 		.pr_ctlinput =          rip_ctlinput,
212*33de042dSApple OSS Distributions 		.pr_ctloutput =         rip_ctloutput,
213*33de042dSApple OSS Distributions 		.pr_usrreqs =           &rip_usrreqs,
214*33de042dSApple OSS Distributions 		.pr_unlock =            rip_unlock,
215*33de042dSApple OSS Distributions 		.pr_update_last_owner = inp_update_last_owner,
216*33de042dSApple OSS Distributions 		.pr_copy_last_owner =   inp_copy_last_owner,
217*33de042dSApple OSS Distributions 	},
218*33de042dSApple OSS Distributions #if IPSEC
219*33de042dSApple OSS Distributions 	{
220*33de042dSApple OSS Distributions 		.pr_type =              SOCK_RAW,
221*33de042dSApple OSS Distributions 		.pr_protocol =          IPPROTO_AH,
222*33de042dSApple OSS Distributions 		.pr_flags =             PR_ATOMIC | PR_ADDR | PR_PROTOLOCK,
223*33de042dSApple OSS Distributions 		.pr_input =             ah4_input,
224*33de042dSApple OSS Distributions 		.pr_usrreqs =           &nousrreqs,
225*33de042dSApple OSS Distributions 	},
226*33de042dSApple OSS Distributions #if IPSEC_ESP
227*33de042dSApple OSS Distributions 	{
228*33de042dSApple OSS Distributions 		.pr_type =              SOCK_RAW,
229*33de042dSApple OSS Distributions 		.pr_protocol =          IPPROTO_ESP,
230*33de042dSApple OSS Distributions 		.pr_flags =             PR_ATOMIC | PR_ADDR | PR_PROTOLOCK,
231*33de042dSApple OSS Distributions 		.pr_input =             esp4_input,
232*33de042dSApple OSS Distributions 		.pr_usrreqs =           &nousrreqs,
233*33de042dSApple OSS Distributions 	},
234*33de042dSApple OSS Distributions #endif /* IPSEC_ESP */
235*33de042dSApple OSS Distributions #endif /* IPSEC */
236*33de042dSApple OSS Distributions 	{
237*33de042dSApple OSS Distributions 		.pr_type =              SOCK_RAW,
238*33de042dSApple OSS Distributions 		.pr_protocol =          IPPROTO_IPV4,
239*33de042dSApple OSS Distributions 		.pr_flags =             PR_ATOMIC | PR_ADDR | PR_LASTHDR,
240*33de042dSApple OSS Distributions 		.pr_input =             encap4_input,
241*33de042dSApple OSS Distributions 		.pr_ctloutput =         rip_ctloutput,
242*33de042dSApple OSS Distributions 		.pr_usrreqs =           &rip_usrreqs,
243*33de042dSApple OSS Distributions 		.pr_unlock =            rip_unlock,
244*33de042dSApple OSS Distributions 		.pr_update_last_owner = inp_update_last_owner,
245*33de042dSApple OSS Distributions 		.pr_copy_last_owner =   inp_copy_last_owner,
246*33de042dSApple OSS Distributions 	},
247*33de042dSApple OSS Distributions 	{
248*33de042dSApple OSS Distributions 		.pr_type =              SOCK_RAW,
249*33de042dSApple OSS Distributions 		.pr_protocol =          IPPROTO_IPV6,
250*33de042dSApple OSS Distributions 		.pr_flags =             PR_ATOMIC | PR_ADDR | PR_LASTHDR,
251*33de042dSApple OSS Distributions 		.pr_input =             encap4_input,
252*33de042dSApple OSS Distributions 		.pr_ctloutput =         rip_ctloutput,
253*33de042dSApple OSS Distributions 		.pr_usrreqs =           &rip_usrreqs,
254*33de042dSApple OSS Distributions 		.pr_unlock =            rip_unlock,
255*33de042dSApple OSS Distributions 		.pr_update_last_owner = inp_update_last_owner,
256*33de042dSApple OSS Distributions 		.pr_copy_last_owner =   inp_copy_last_owner,
257*33de042dSApple OSS Distributions 	},
258*33de042dSApple OSS Distributions /* raw wildcard */
259*33de042dSApple OSS Distributions 	{
260*33de042dSApple OSS Distributions 		.pr_type =              SOCK_RAW,
261*33de042dSApple OSS Distributions 		.pr_flags =             PR_ATOMIC | PR_ADDR | PR_LASTHDR,
262*33de042dSApple OSS Distributions 		.pr_input =             rip_input,
263*33de042dSApple OSS Distributions 		.pr_ctloutput =         rip_ctloutput,
264*33de042dSApple OSS Distributions 		.pr_init =              rip_init,
265*33de042dSApple OSS Distributions 		.pr_usrreqs =           &rip_usrreqs,
266*33de042dSApple OSS Distributions 		.pr_unlock =            rip_unlock,
267*33de042dSApple OSS Distributions 		.pr_update_last_owner = inp_update_last_owner,
268*33de042dSApple OSS Distributions 		.pr_copy_last_owner =   inp_copy_last_owner,
269*33de042dSApple OSS Distributions 	},
270*33de042dSApple OSS Distributions };
271*33de042dSApple OSS Distributions 
272*33de042dSApple OSS Distributions static int in_proto_count = (sizeof(inetsw) / sizeof(struct protosw));
273*33de042dSApple OSS Distributions 
274*33de042dSApple OSS Distributions struct domain inetdomain_s = {
275*33de042dSApple OSS Distributions 	.dom_family =           PF_INET,
276*33de042dSApple OSS Distributions 	.dom_flags =            DOM_REENTRANT,
277*33de042dSApple OSS Distributions 	.dom_name =             "internet",
278*33de042dSApple OSS Distributions 	.dom_init =             in_dinit,
279*33de042dSApple OSS Distributions 	.dom_rtattach =         in_inithead,
280*33de042dSApple OSS Distributions 	.dom_rtoffset =         32,
281*33de042dSApple OSS Distributions 	.dom_maxrtkey =         sizeof(struct sockaddr_in),
282*33de042dSApple OSS Distributions 	.dom_protohdrlen =      sizeof(struct tcpiphdr),
283*33de042dSApple OSS Distributions };
284*33de042dSApple OSS Distributions 
285*33de042dSApple OSS Distributions /* Initialize the PF_INET domain, and add in the pre-defined protos */
286*33de042dSApple OSS Distributions void
in_dinit(struct domain * dp)287*33de042dSApple OSS Distributions in_dinit(struct domain *dp)
288*33de042dSApple OSS Distributions {
289*33de042dSApple OSS Distributions 	struct protosw *pr;
290*33de042dSApple OSS Distributions 	int i;
291*33de042dSApple OSS Distributions 	domain_unguard_t __single unguard;
292*33de042dSApple OSS Distributions 
293*33de042dSApple OSS Distributions 	VERIFY(!(dp->dom_flags & DOM_INITIALIZED));
294*33de042dSApple OSS Distributions 	VERIFY(inetdomain == NULL);
295*33de042dSApple OSS Distributions 
296*33de042dSApple OSS Distributions 	inetdomain = dp;
297*33de042dSApple OSS Distributions 
298*33de042dSApple OSS Distributions 	/*
299*33de042dSApple OSS Distributions 	 * Verify that the maximum possible tcp/ip header will still
300*33de042dSApple OSS Distributions 	 * fit in a small mbuf because m_pullup only puls into 256
301*33de042dSApple OSS Distributions 	 * byte mbuf
302*33de042dSApple OSS Distributions 	 */
303*33de042dSApple OSS Distributions 	_CASSERT((sizeof(struct tcpiphdr) + TCP_MAXOLEN) <= _MHLEN);
304*33de042dSApple OSS Distributions 
305*33de042dSApple OSS Distributions 	/*
306*33de042dSApple OSS Distributions 	 * Attach first, then initialize; ip_init() needs raw IP handler.
307*33de042dSApple OSS Distributions 	 */
308*33de042dSApple OSS Distributions 	for (i = 0, pr = &inetsw[0]; i < in_proto_count; i++, pr++) {
309*33de042dSApple OSS Distributions 		net_add_proto(pr, dp, 0);
310*33de042dSApple OSS Distributions 	}
311*33de042dSApple OSS Distributions 	for (i = 0, pr = &inetsw[0]; i < in_proto_count; i++, pr++) {
312*33de042dSApple OSS Distributions 		net_init_proto(pr, dp);
313*33de042dSApple OSS Distributions 	}
314*33de042dSApple OSS Distributions 
315*33de042dSApple OSS Distributions 	inet_domain_mutex = dp->dom_mtx;
316*33de042dSApple OSS Distributions 
317*33de042dSApple OSS Distributions 	unguard = domain_unguard_deploy();
318*33de042dSApple OSS Distributions 	i = proto_register_input(PF_INET, ip_proto_input, NULL, 1);
319*33de042dSApple OSS Distributions 	if (i != 0) {
320*33de042dSApple OSS Distributions 		panic("%s: failed to register PF_INET protocol: %d",
321*33de042dSApple OSS Distributions 		    __func__, i);
322*33de042dSApple OSS Distributions 		/* NOTREACHED */
323*33de042dSApple OSS Distributions 	}
324*33de042dSApple OSS Distributions 	domain_unguard_release(unguard);
325*33de042dSApple OSS Distributions }
326*33de042dSApple OSS Distributions 
327*33de042dSApple OSS Distributions static void
ip_proto_input(protocol_family_t protocol,mbuf_t packet_list)328*33de042dSApple OSS Distributions ip_proto_input(protocol_family_t protocol, mbuf_t packet_list)
329*33de042dSApple OSS Distributions {
330*33de042dSApple OSS Distributions #pragma unused(protocol)
331*33de042dSApple OSS Distributions 
332*33de042dSApple OSS Distributions 	if (packet_list->m_nextpkt != NULL) {
333*33de042dSApple OSS Distributions 		ip_input_process_list(packet_list);
334*33de042dSApple OSS Distributions 	} else {
335*33de042dSApple OSS Distributions 		/*
336*33de042dSApple OSS Distributions 		 * XXX remove this path if ip_input_process_list is proven
337*33de042dSApple OSS Distributions 		 * to be stable and has minimum overhead on most platforms.
338*33de042dSApple OSS Distributions 		 */
339*33de042dSApple OSS Distributions 		ip_input(packet_list);
340*33de042dSApple OSS Distributions 	}
341*33de042dSApple OSS Distributions }
342*33de042dSApple OSS Distributions 
343*33de042dSApple OSS Distributions SYSCTL_NODE(_net, PF_INET, inet,
344*33de042dSApple OSS Distributions     CTLFLAG_RW | CTLFLAG_LOCKED, 0, "Internet Family");
345*33de042dSApple OSS Distributions 
346*33de042dSApple OSS Distributions SYSCTL_NODE(_net_inet, IPPROTO_IP, ip,
347*33de042dSApple OSS Distributions     CTLFLAG_RW | CTLFLAG_LOCKED, 0, "IP");
348*33de042dSApple OSS Distributions SYSCTL_NODE(_net_inet, IPPROTO_ICMP, icmp,
349*33de042dSApple OSS Distributions     CTLFLAG_RW | CTLFLAG_LOCKED, 0, "ICMP");
350*33de042dSApple OSS Distributions SYSCTL_NODE(_net_inet, IPPROTO_UDP, udp,
351*33de042dSApple OSS Distributions     CTLFLAG_RW | CTLFLAG_LOCKED, 0, "UDP");
352*33de042dSApple OSS Distributions SYSCTL_NODE(_net_inet, IPPROTO_TCP, tcp,
353*33de042dSApple OSS Distributions     CTLFLAG_RW | CTLFLAG_LOCKED, 0, "TCP");
354*33de042dSApple OSS Distributions SYSCTL_NODE(_net_inet, IPPROTO_IGMP, igmp,
355*33de042dSApple OSS Distributions     CTLFLAG_RW | CTLFLAG_LOCKED, 0, "IGMP");
356*33de042dSApple OSS Distributions #if IPSEC
357*33de042dSApple OSS Distributions SYSCTL_NODE(_net_inet, IPPROTO_AH, ipsec,
358*33de042dSApple OSS Distributions     CTLFLAG_RW | CTLFLAG_LOCKED, 0, "IPSEC");
359*33de042dSApple OSS Distributions #endif /* IPSEC */
360*33de042dSApple OSS Distributions SYSCTL_NODE(_net_inet, IPPROTO_RAW, raw,
361*33de042dSApple OSS Distributions     CTLFLAG_RW | CTLFLAG_LOCKED, 0, "RAW");
362