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