]> git.saurik.com Git - apple/xnu.git/blame - bsd/netinet/in_proto.c
xnu-201.42.3.tar.gz
[apple/xnu.git] / bsd / netinet / in_proto.c
CommitLineData
1c79356b
A
1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22/*
23 * Copyright (c) 1982, 1986, 1993
24 * The Regents of the University of California. All rights reserved.
25 *
26 * Redistribution and use in source and binary forms, with or without
27 * modification, are permitted provided that the following conditions
28 * are met:
29 * 1. Redistributions of source code must retain the above copyright
30 * notice, this list of conditions and the following disclaimer.
31 * 2. Redistributions in binary form must reproduce the above copyright
32 * notice, this list of conditions and the following disclaimer in the
33 * documentation and/or other materials provided with the distribution.
34 * 3. All advertising materials mentioning features or use of this software
35 * must display the following acknowledgement:
36 * This product includes software developed by the University of
37 * California, Berkeley and its contributors.
38 * 4. Neither the name of the University nor the names of its contributors
39 * may be used to endorse or promote products derived from this software
40 * without specific prior written permission.
41 *
42 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
46 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52 * SUCH DAMAGE.
53 *
54 * @(#)in_proto.c 8.2 (Berkeley) 2/9/95
55 */
56
57#if ISFB31
58#include "opt_ipdivert.h"
59#include "opt_ipx.h"
60#endif
61
62#include <sys/param.h>
63#include <sys/kernel.h>
64#include <sys/socket.h>
65#include <sys/domain.h>
66#include <sys/protosw.h>
67
68
69#include <sys/sysctl.h>
70
71
72#include <net/if.h>
73#include <net/route.h>
74
75#include <netinet/in.h>
76#include <netinet/in_systm.h>
77#include <netinet/ip.h>
78#include <netinet/ip_var.h>
79#include <netinet/ip6.h>
80#include <netinet6/ip6_var.h>
81#include <netinet/ip_icmp.h>
82#include <netinet/igmp_var.h>
83#include <netinet/tcp.h>
84#include <netinet/tcp_timer.h>
85#include <netinet/tcp_var.h>
86#include <netinet/tcpip.h>
87#include <netinet/udp.h>
88#include <netinet/udp_var.h>
89/*
90 * TCP/IP protocol family: IP, ICMP, UDP, TCP.
91 */
92
93#if IPSEC
94#include <netinet6/ipsec.h>
95#include <netinet6/ah.h>
96#if IPSEC_ESP
97#include <netinet6/esp.h>
98#endif
99#include <netinet6/ipcomp.h>
100#endif /* IPSEC */
101
102#include "gif.h"
103#if NGIF > 0
104#include <netinet/in_gif.h>
105#endif
106
107#if IPXIP
108#include <netipx/ipx_ip.h>
109#endif
110
111#if NSIP
112#include <netns/ns.h>
113#include <netns/ns_if.h>
114#endif
115
116#if PM
117void pm_init __P((void));
118void pm_input __P((struct mbuf *, int));
119int pm_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
120struct pr_usrreqs pm_usrreqs;
121#endif
122
123#if NATPT
124void natpt_init __P((void));
125int natpt_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
126struct pr_usrreqs natpt_usrreqs;
127#endif
128
129extern struct domain inetdomain;
130static struct pr_usrreqs nousrreqs;
131
132struct protosw inetsw[] = {
133{ 0, &inetdomain, 0, 0,
134 0, 0, 0, 0,
135 0,
136 ip_init, 0, ip_slowtimo, ip_drain,
137 0, &nousrreqs
138},
139{ SOCK_DGRAM, &inetdomain, IPPROTO_UDP, PR_ATOMIC|PR_ADDR,
140 udp_input, 0, udp_ctlinput, ip_ctloutput,
141 0,
142 udp_init, 0, 0, 0,
143 0, &udp_usrreqs
144},
145{ SOCK_STREAM, &inetdomain, IPPROTO_TCP,
146 PR_CONNREQUIRED|PR_IMPLOPCL|PR_WANTRCVD,
147 tcp_input, 0, tcp_ctlinput, tcp_ctloutput,
148 0,
149 tcp_init, tcp_fasttimo, tcp_slowtimo, tcp_drain,
150 0, &tcp_usrreqs
151},
152{ SOCK_RAW, &inetdomain, IPPROTO_RAW, PR_ATOMIC|PR_ADDR,
153 rip_input, 0, rip_ctlinput, rip_ctloutput,
154 0,
155 0, 0, 0, 0,
156 0, &rip_usrreqs
157},
158{ SOCK_RAW, &inetdomain, IPPROTO_ICMP, PR_ATOMIC|PR_ADDR,
159 icmp_input, 0, 0, rip_ctloutput,
160 0,
161 0, 0, 0, 0,
162 0, &rip_usrreqs
163},
164{ SOCK_RAW, &inetdomain, IPPROTO_IGMP, PR_ATOMIC|PR_ADDR,
165 igmp_input, 0, 0, rip_ctloutput,
166 0,
167 igmp_init, igmp_fasttimo, igmp_slowtimo, 0,
168 0, &rip_usrreqs
169},
170{ SOCK_RAW, &inetdomain, IPPROTO_RSVP, PR_ATOMIC|PR_ADDR,
171 rsvp_input, 0, 0, rip_ctloutput,
172 0,
173 0, 0, 0, 0,
174 0, &rip_usrreqs
175},
176#if IPSEC
177{ SOCK_RAW, &inetdomain, IPPROTO_AH, PR_ATOMIC|PR_ADDR,
178 ah4_input, 0, 0, 0,
179 0,
180 0, 0, 0, 0,
181 0, &nousrreqs
182},
183#if IPSEC_ESP
184{ SOCK_RAW, &inetdomain, IPPROTO_ESP, PR_ATOMIC|PR_ADDR,
185 esp4_input, 0, 0, 0,
186 0,
187 0, 0, 0, 0,
188 0, &nousrreqs
189},
190#endif
191{ SOCK_RAW, &inetdomain, IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR,
192 ipcomp4_input, 0, 0, 0,
193 0,
194 0, 0, 0, 0,
195 0, &nousrreqs
196},
197#endif /* IPSEC */
198#if NGIF > 0
199{ SOCK_RAW, &inetdomain, IPPROTO_IPV4, PR_ATOMIC|PR_ADDR,
200 in_gif_input, 0, 0, 0,
201 0,
202 0, 0, 0, 0,
203 0, &nousrreqs
204},
205# if INET6
206{ SOCK_RAW, &inetdomain, IPPROTO_IPV6, PR_ATOMIC|PR_ADDR,
207 in_gif_input, 0, 0, 0,
208 0,
209 0, 0, 0, 0,
210 0, &nousrreqs
211},
212#endif
213#else /*NGIF*/
214{ SOCK_RAW, &inetdomain, IPPROTO_IPIP, PR_ATOMIC|PR_ADDR,
215 ipip_input, 0, 0, rip_ctloutput,
216 0,
217 0, 0, 0, 0,
218 0, &rip_usrreqs
219},
220#endif /*NGIF*/
221#if IPDIVERT
222{ SOCK_RAW, &inetdomain, IPPROTO_DIVERT, PR_ATOMIC|PR_ADDR,
223 div_input, 0, 0, ip_ctloutput,
224 0,
225 div_init, 0, 0, 0,
226 0, &div_usrreqs,
227},
228#endif
229#if TPIP
230{ SOCK_SEQPACKET,&inetdomain, IPPROTO_TP, PR_CONNREQUIRED|PR_WANTRCVD,
231 tpip_input, 0, tpip_ctlinput, tp_ctloutput,
232 0, tp_usrreq,
233 tp_init, 0, tp_slowtimo, tp_drain,
234},
235#endif
236/* EON (ISO CLNL over IP) */
237#if EON
238{ SOCK_RAW, &inetdomain, IPPROTO_EON, 0,
239 eoninput, 0, eonctlinput, 0,
240 0,
241 eonprotoinit, 0, 0, 0,
242},
243#endif
244#if IPXIP
245{ SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR,
246 ipxip_input, 0, ipxip_ctlinput, 0,
247 0,
248 0, 0, 0, 0,
249 0, &rip_usrreqs
250},
251#endif
252#if NSIP
253{ SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR,
254 idpip_input, 0, nsip_ctlinput, 0,
255 0,
256 0, 0, 0, 0,
257 0, &rip_usrreqs
258},
259#endif
260 /* raw wildcard */
261{ SOCK_RAW, &inetdomain, 0, PR_ATOMIC|PR_ADDR,
262 rip_input, 0, 0, rip_ctloutput,
263 0,
264 rip_init, 0, 0, 0,
265 0, &rip_usrreqs
266},
267};
268
269#if NGIF > 0
270struct protosw in_gif_protosw =
271{ SOCK_RAW, &inetdomain, 0/*IPPROTO_IPV[46]*/, PR_ATOMIC|PR_ADDR,
272 in_gif_input, rip_output, 0, rip_ctloutput,
273 0,
274 0, 0, 0, 0,
275 0, &rip_usrreqs
276};
277#endif /*NGIF*/
278
279extern int in_inithead __P((void **, int));
280
281int in_proto_count = (sizeof (inetsw) / sizeof (struct protosw));
282
283extern void in_dinit(void);
284/* A routing init function, and a header size */
285struct domain inetdomain =
286 { AF_INET, "internet", in_dinit, 0, 0,
287 inetsw, 0,
288 in_inithead, 32, sizeof(struct sockaddr_in),
289 sizeof(struct tcpiphdr), 0
290 };
291
292DOMAIN_SET(inet);
293
294
295SYSCTL_NODE(_net, PF_INET, inet, CTLFLAG_RW, 0,
296 "Internet Family");
297
298SYSCTL_NODE(_net_inet, IPPROTO_IP, ip, CTLFLAG_RW, 0, "IP");
299SYSCTL_NODE(_net_inet, IPPROTO_ICMP, icmp, CTLFLAG_RW, 0, "ICMP");
300SYSCTL_NODE(_net_inet, IPPROTO_UDP, udp, CTLFLAG_RW, 0, "UDP");
301SYSCTL_NODE(_net_inet, IPPROTO_TCP, tcp, CTLFLAG_RW, 0, "TCP");
302SYSCTL_NODE(_net_inet, IPPROTO_IGMP, igmp, CTLFLAG_RW, 0, "IGMP");
303#if IPSEC
304SYSCTL_NODE(_net_inet, IPPROTO_AH, ipsec, CTLFLAG_RW, 0, "IPSEC");
305#endif /* IPSEC */
306SYSCTL_NODE(_net_inet, IPPROTO_RAW, raw, CTLFLAG_RW, 0, "RAW");
307#if IPDIVERT
308SYSCTL_NODE(_net_inet, IPPROTO_DIVERT, div, CTLFLAG_RW, 0, "DIVERT");
309#endif
310