Define in_inithead in net/route.h, it's purpose is the initialisation
[dragonfly.git] / sys / netinet / in_proto.c
CommitLineData
984263bc
MD
1/*
2 * Copyright (c) 1982, 1986, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)in_proto.c 8.2 (Berkeley) 2/9/95
f1f552f6 34 * $FreeBSD: src/sys/netinet/in_proto.c,v 1.53.2.7 2003/08/24 08:24:38 hsu Exp $
977b2184 35 * $DragonFly: src/sys/netinet/in_proto.c,v 1.11 2005/01/31 21:44:10 joerg Exp $
984263bc
MD
36 */
37
38#include "opt_ipdivert.h"
39#include "opt_ipx.h"
f1f552f6 40#include "opt_mrouting.h"
984263bc
MD
41#include "opt_ipsec.h"
42#include "opt_inet6.h"
43
44#include <sys/param.h>
45#include <sys/kernel.h>
46#include <sys/socket.h>
47#include <sys/domain.h>
48#include <sys/protosw.h>
49#include <sys/queue.h>
50#include <sys/sysctl.h>
51
52#include <net/if.h>
53#include <net/route.h>
54
55#include <netinet/in.h>
56#include <netinet/in_systm.h>
57#include <netinet/ip.h>
58#include <netinet/ip_var.h>
59#include <netinet/ip_icmp.h>
60#include <netinet/igmp_var.h>
f1f552f6
JH
61#ifdef PIM
62#include <netinet/pim_var.h>
63#endif
984263bc
MD
64#include <netinet/tcp.h>
65#include <netinet/tcp_timer.h>
66#include <netinet/tcp_var.h>
67#include <netinet/udp.h>
68#include <netinet/udp_var.h>
69#include <netinet/ip_encap.h>
70
984263bc
MD
71
72/*
73 * TCP/IP protocol family: IP, ICMP, UDP, TCP.
74 */
75
76#ifdef IPSEC
77#include <netinet6/ipsec.h>
78#include <netinet6/ah.h>
79#ifdef IPSEC_ESP
80#include <netinet6/esp.h>
81#endif
82#include <netinet6/ipcomp.h>
83#endif /* IPSEC */
84
85#ifdef FAST_IPSEC
bf844ffa 86#include <netproto/ipsec/ipsec.h>
984263bc
MD
87#endif /* FAST_IPSEC */
88
89#ifdef IPXIP
d2438d69 90#include <netproto/ipx/ipx_ip.h>
984263bc
MD
91#endif
92
93#ifdef NSIP
94#include <netns/ns.h>
95#include <netns/ns_if.h>
96#endif
97
9eeaa8a9
JH
98#include <net/netisr.h> /* for cpu0_soport */
99
984263bc
MD
100extern struct domain inetdomain;
101static struct pr_usrreqs nousrreqs;
102
4468b0b4 103struct protosw inetsw[] = {
984263bc
MD
104{ 0, &inetdomain, 0, 0,
105 0, 0, 0, 0,
9eeaa8a9 106 cpu0_soport,
984263bc
MD
107 ip_init, 0, ip_slowtimo, ip_drain,
108 &nousrreqs
109},
110{ SOCK_DGRAM, &inetdomain, IPPROTO_UDP, PR_ATOMIC|PR_ADDR,
111 udp_input, 0, udp_ctlinput, ip_ctloutput,
9eeaa8a9 112 udp_soport,
984263bc
MD
113 udp_init, 0, 0, 0,
114 &udp_usrreqs
115},
116{ SOCK_STREAM, &inetdomain, IPPROTO_TCP,
117 PR_CONNREQUIRED|PR_IMPLOPCL|PR_WANTRCVD,
118 tcp_input, 0, tcp_ctlinput, tcp_ctloutput,
9eeaa8a9 119 tcp_soport,
984263bc
MD
120 tcp_init, 0, tcp_slowtimo, tcp_drain,
121 &tcp_usrreqs
122},
123{ SOCK_RAW, &inetdomain, IPPROTO_RAW, PR_ATOMIC|PR_ADDR,
124 rip_input, 0, rip_ctlinput, rip_ctloutput,
9eeaa8a9 125 cpu0_soport,
984263bc
MD
126 0, 0, 0, 0,
127 &rip_usrreqs
128},
129{ SOCK_RAW, &inetdomain, IPPROTO_ICMP, PR_ATOMIC|PR_ADDR|PR_LASTHDR,
130 icmp_input, 0, 0, rip_ctloutput,
9eeaa8a9 131 cpu0_soport,
984263bc
MD
132 0, 0, 0, 0,
133 &rip_usrreqs
134},
135{ SOCK_RAW, &inetdomain, IPPROTO_IGMP, PR_ATOMIC|PR_ADDR|PR_LASTHDR,
136 igmp_input, 0, 0, rip_ctloutput,
9eeaa8a9 137 cpu0_soport,
984263bc
MD
138 igmp_init, igmp_fasttimo, igmp_slowtimo, 0,
139 &rip_usrreqs
140},
141{ SOCK_RAW, &inetdomain, IPPROTO_RSVP, PR_ATOMIC|PR_ADDR|PR_LASTHDR,
142 rsvp_input, 0, 0, rip_ctloutput,
9eeaa8a9 143 cpu0_soport,
984263bc
MD
144 0, 0, 0, 0,
145 &rip_usrreqs
146},
147#ifdef IPSEC
148{ SOCK_RAW, &inetdomain, IPPROTO_AH, PR_ATOMIC|PR_ADDR,
f23061d4 149 ah4_input, 0, 0, 0,
9eeaa8a9 150 cpu0_soport,
984263bc
MD
151 0, 0, 0, 0,
152 &nousrreqs
153},
154#ifdef IPSEC_ESP
155{ SOCK_RAW, &inetdomain, IPPROTO_ESP, PR_ATOMIC|PR_ADDR,
f23061d4 156 esp4_input, 0, 0, 0,
9eeaa8a9 157 cpu0_soport,
984263bc
MD
158 0, 0, 0, 0,
159 &nousrreqs
160},
161#endif
162{ SOCK_RAW, &inetdomain, IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR,
f23061d4 163 ipcomp4_input, 0, 0, 0,
9eeaa8a9 164 cpu0_soport,
984263bc
MD
165 0, 0, 0, 0,
166 &nousrreqs
167},
168#endif /* IPSEC */
169#ifdef FAST_IPSEC
170{ SOCK_RAW, &inetdomain, IPPROTO_AH, PR_ATOMIC|PR_ADDR,
f23061d4 171 ipsec4_common_input, 0, 0, 0,
9eeaa8a9 172 cpu0_soport,
984263bc
MD
173 0, 0, 0, 0,
174 &nousrreqs
175},
176{ SOCK_RAW, &inetdomain, IPPROTO_ESP, PR_ATOMIC|PR_ADDR,
f23061d4 177 ipsec4_common_input, 0, 0, 0,
9eeaa8a9 178 cpu0_soport,
984263bc
MD
179 0, 0, 0, 0,
180 &nousrreqs
181},
182{ SOCK_RAW, &inetdomain, IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR,
f23061d4 183 ipsec4_common_input, 0, 0, 0,
9eeaa8a9 184 cpu0_soport,
984263bc
MD
185 0, 0, 0, 0,
186 &nousrreqs
187},
188#endif /* FAST_IPSEC */
189{ SOCK_RAW, &inetdomain, IPPROTO_IPV4, PR_ATOMIC|PR_ADDR|PR_LASTHDR,
f23061d4 190 encap4_input, 0, 0, rip_ctloutput,
9eeaa8a9 191 cpu0_soport,
f23061d4 192 encap_init, 0, 0, 0,
984263bc
MD
193 &rip_usrreqs
194},
195{ SOCK_RAW, &inetdomain, IPPROTO_MOBILE, PR_ATOMIC|PR_ADDR|PR_LASTHDR,
196 encap4_input, 0, 0, rip_ctloutput,
9eeaa8a9 197 cpu0_soport,
984263bc
MD
198 encap_init, 0, 0, 0,
199 &rip_usrreqs
200},
201{ SOCK_RAW, &inetdomain, IPPROTO_GRE, PR_ATOMIC|PR_ADDR|PR_LASTHDR,
202 encap4_input, 0, 0, rip_ctloutput,
9eeaa8a9 203 cpu0_soport,
984263bc
MD
204 encap_init, 0, 0, 0,
205 &rip_usrreqs
206},
207# ifdef INET6
208{ SOCK_RAW, &inetdomain, IPPROTO_IPV6, PR_ATOMIC|PR_ADDR|PR_LASTHDR,
f23061d4 209 encap4_input, 0, 0, rip_ctloutput,
9eeaa8a9 210 cpu0_soport,
984263bc
MD
211 encap_init, 0, 0, 0,
212 &rip_usrreqs
213},
214#endif
215#ifdef IPDIVERT
216{ SOCK_RAW, &inetdomain, IPPROTO_DIVERT, PR_ATOMIC|PR_ADDR,
f23061d4 217 div_input, 0, 0, ip_ctloutput,
9eeaa8a9 218 cpu0_soport,
984263bc
MD
219 div_init, 0, 0, 0,
220 &div_usrreqs,
221},
222#endif
223#ifdef IPXIP
224{ SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR|PR_LASTHDR,
225 ipxip_input, 0, ipxip_ctlinput, 0,
9eeaa8a9 226 cpu0_soport,
984263bc
MD
227 0, 0, 0, 0,
228 &rip_usrreqs
229},
230#endif
231#ifdef NSIP
232{ SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR|PR_LASTHDR,
233 idpip_input, 0, nsip_ctlinput, 0,
9eeaa8a9 234 cpu0_soport,
984263bc
MD
235 0, 0, 0, 0,
236 &rip_usrreqs
237},
f1f552f6
JH
238#endif
239#ifdef PIM
240{ SOCK_RAW, &inetdomain, IPPROTO_PIM, PR_ATOMIC|PR_ADDR|PR_LASTHDR,
241 pim_input, 0, 0, rip_ctloutput,
9eeaa8a9 242 cpu0_soport,
f1f552f6
JH
243 0, 0, 0, 0,
244 &rip_usrreqs
245},
984263bc 246#endif
02742ec6
JS
247#ifdef NPFSYNC
248{ SOCK_RAW, &inetdomain, IPPROTO_PFSYNC, PR_ATOMIC|PR_ADDR,
249 pfsync_input, 0, 0, rip_ctloutput,
250 0,
251 0, 0, 0, 0,
252 &rip_usrreqs
253},
254#endif /* NPFSYNC */
984263bc
MD
255 /* raw wildcard */
256{ SOCK_RAW, &inetdomain, 0, PR_ATOMIC|PR_ADDR,
257 rip_input, 0, 0, rip_ctloutput,
9eeaa8a9 258 cpu0_soport,
984263bc
MD
259 rip_init, 0, 0, 0,
260 &rip_usrreqs
261},
262};
263
984263bc 264struct domain inetdomain =
f23061d4 265 { AF_INET, "internet", 0, 0, 0,
984263bc
MD
266 (struct protosw *)inetsw,
267 (struct protosw *)&inetsw[sizeof(inetsw)/sizeof(inetsw[0])], 0,
268 in_inithead, 32, sizeof(struct sockaddr_in)
269 };
270
271DOMAIN_SET(inet);
272
273SYSCTL_NODE(_net, PF_INET, inet, CTLFLAG_RW, 0,
274 "Internet Family");
275
276SYSCTL_NODE(_net_inet, IPPROTO_IP, ip, CTLFLAG_RW, 0, "IP");
277SYSCTL_NODE(_net_inet, IPPROTO_ICMP, icmp, CTLFLAG_RW, 0, "ICMP");
278SYSCTL_NODE(_net_inet, IPPROTO_UDP, udp, CTLFLAG_RW, 0, "UDP");
279SYSCTL_NODE(_net_inet, IPPROTO_TCP, tcp, CTLFLAG_RW, 0, "TCP");
280SYSCTL_NODE(_net_inet, IPPROTO_IGMP, igmp, CTLFLAG_RW, 0, "IGMP");
281#ifdef FAST_IPSEC
282/* XXX no protocol # to use, pick something "reserved" */
283SYSCTL_NODE(_net_inet, 253, ipsec, CTLFLAG_RW, 0, "IPSEC");
284SYSCTL_NODE(_net_inet, IPPROTO_AH, ah, CTLFLAG_RW, 0, "AH");
285SYSCTL_NODE(_net_inet, IPPROTO_ESP, esp, CTLFLAG_RW, 0, "ESP");
286SYSCTL_NODE(_net_inet, IPPROTO_IPCOMP, ipcomp, CTLFLAG_RW, 0, "IPCOMP");
287SYSCTL_NODE(_net_inet, IPPROTO_IPIP, ipip, CTLFLAG_RW, 0, "IPIP");
288#else
289#ifdef IPSEC
290SYSCTL_NODE(_net_inet, IPPROTO_AH, ipsec, CTLFLAG_RW, 0, "IPSEC");
291#endif /* IPSEC */
292#endif /* !FAST_IPSEC */
293SYSCTL_NODE(_net_inet, IPPROTO_RAW, raw, CTLFLAG_RW, 0, "RAW");
294#ifdef IPDIVERT
295SYSCTL_NODE(_net_inet, IPPROTO_DIVERT, divert, CTLFLAG_RW, 0, "DIVERT");
296#endif
f1f552f6
JH
297#ifdef PIM
298SYSCTL_NODE(_net_inet, IPPROTO_PIM, pim, CTLFLAG_RW, 0, "PIM");
299#endif