in_proto.c revision 34746
1179592Sbenno/*
2179718Sbenno * Copyright (c) 1982, 1986, 1993
3179592Sbenno *	The Regents of the University of California.  All rights reserved.
4179592Sbenno *
5179592Sbenno * Redistribution and use in source and binary forms, with or without
6179592Sbenno * modification, are permitted provided that the following conditions
7179592Sbenno * are met:
8179592Sbenno * 1. Redistributions of source code must retain the above copyright
9179592Sbenno *    notice, this list of conditions and the following disclaimer.
10179592Sbenno * 2. Redistributions in binary form must reproduce the above copyright
11179592Sbenno *    notice, this list of conditions and the following disclaimer in the
12179592Sbenno *    documentation and/or other materials provided with the distribution.
13179592Sbenno * 3. All advertising materials mentioning features or use of this software
14179592Sbenno *    must display the following acknowledgement:
15179592Sbenno *	This product includes software developed by the University of
16179592Sbenno *	California, Berkeley and its contributors.
17179592Sbenno * 4. Neither the name of the University nor the names of its contributors
18179592Sbenno *    may be used to endorse or promote products derived from this software
19179592Sbenno *    without specific prior written permission.
20179592Sbenno *
21179592Sbenno * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22179592Sbenno * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23179592Sbenno * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24179592Sbenno * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25179592Sbenno * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26179592Sbenno * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27179592Sbenno * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28179592Sbenno * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29179592Sbenno * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30179592Sbenno * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31179592Sbenno * SUCH DAMAGE.
32179592Sbenno *
33179592Sbenno *	@(#)in_proto.c	8.2 (Berkeley) 2/9/95
34179592Sbenno *	$Id: in_proto.c,v 1.45 1997/12/15 20:31:11 eivind Exp $
35179592Sbenno */
36179592Sbenno
37179592Sbenno#include "opt_ipdivert.h"
38179592Sbenno#include "opt_ipx.h"
39179592Sbenno
40179592Sbenno#include <sys/param.h>
41179592Sbenno#include <sys/kernel.h>
42179592Sbenno#include <sys/socket.h>
43179592Sbenno#include <sys/domain.h>
44179592Sbenno#include <sys/protosw.h>
45179592Sbenno#include <sys/sysctl.h>
46179592Sbenno
47179592Sbenno#include <net/if.h>
48179592Sbenno#include <net/route.h>
49179592Sbenno
50179592Sbenno#include <netinet/in.h>
51179592Sbenno#include <netinet/in_systm.h>
52179592Sbenno#include <netinet/ip.h>
53179592Sbenno#include <netinet/ip_var.h>
54179592Sbenno#include <netinet/ip_icmp.h>
55179592Sbenno#include <netinet/igmp_var.h>
56179592Sbenno#include <netinet/tcp.h>
57179592Sbenno#include <netinet/tcp_timer.h>
58179592Sbenno#include <netinet/tcp_var.h>
59179592Sbenno#include <netinet/udp.h>
60179592Sbenno#include <netinet/udp_var.h>
61179592Sbenno/*
62179592Sbenno * TCP/IP protocol family: IP, ICMP, UDP, TCP.
63179592Sbenno */
64179592Sbenno
65179592Sbenno#ifdef IPXIP
66179592Sbenno#include <netipx/ipx_ip.h>
67179592Sbenno#endif
68179592Sbenno
69179592Sbenno#ifdef NSIP
70179592Sbenno#include <netns/ns.h>
71179592Sbenno#include <netns/ns_if.h>
72179592Sbenno#endif
73179592Sbenno
74179592Sbenno#ifdef TPIP
75179592Sbennovoid	tpip_input(), tpip_ctlinput(), tp_init(), tp_slowtimo(), tp_drain();
76179592Sbennoint	tp_ctloutput(), tp_usrreq();
77226995Smarius#endif
78179592Sbenno
79179592Sbenno#ifdef EON
80179719Sbennovoid	eoninput(), eonctlinput(), eonprotoinit();
81179719Sbenno#endif /* EON */
82179719Sbenno
83179719Sbennoextern	struct domain inetdomain;
84179719Sbennostatic	struct pr_usrreqs nousrreqs;
85179719Sbenno
86179719Sbennostruct protosw inetsw[] = {
87179719Sbenno{ 0,		&inetdomain,	0,		0,
88179592Sbenno  0,		0,		0,		0,
89179592Sbenno  0,
90179592Sbenno  ip_init,	0,		ip_slowtimo,	ip_drain,
91179592Sbenno  &nousrreqs
92179592Sbenno},
93179592Sbenno{ SOCK_DGRAM,	&inetdomain,	IPPROTO_UDP,	PR_ATOMIC|PR_ADDR,
94179592Sbenno  udp_input,	0,		udp_ctlinput,	ip_ctloutput,
95179592Sbenno  0,
96179592Sbenno  udp_init,	0,		0,		0,
97179592Sbenno  &udp_usrreqs
98179592Sbenno},
99179592Sbenno{ SOCK_STREAM,	&inetdomain,	IPPROTO_TCP,
100179592Sbenno	PR_CONNREQUIRED|PR_IMPLOPCL|PR_WANTRCVD,
101179592Sbenno  tcp_input,	0,		tcp_ctlinput,	tcp_ctloutput,
102179592Sbenno  0,
103179592Sbenno  tcp_init,	tcp_fasttimo,	tcp_slowtimo,	tcp_drain,
104179592Sbenno  &tcp_usrreqs
105179744Sbenno},
106179592Sbenno{ SOCK_RAW,	&inetdomain,	IPPROTO_RAW,	PR_ATOMIC|PR_ADDR,
107179592Sbenno  rip_input,	0,		rip_ctlinput,	rip_ctloutput,
108179592Sbenno  0,
109179592Sbenno  0,		0,		0,		0,
110179592Sbenno  &rip_usrreqs
111179592Sbenno},
112179592Sbenno{ SOCK_RAW,	&inetdomain,	IPPROTO_ICMP,	PR_ATOMIC|PR_ADDR,
113179592Sbenno  icmp_input,	0,		0,		rip_ctloutput,
114179592Sbenno  0,
115179592Sbenno  0,		0,		0,		0,
116179592Sbenno  &rip_usrreqs
117179719Sbenno},
118179592Sbenno{ SOCK_RAW,	&inetdomain,	IPPROTO_IGMP,	PR_ATOMIC|PR_ADDR,
119179592Sbenno  igmp_input,	0,		0,		rip_ctloutput,
120179592Sbenno  0,
121179592Sbenno  igmp_init,	igmp_fasttimo,	igmp_slowtimo,	0,
122179592Sbenno  &rip_usrreqs
123179592Sbenno},
124179592Sbenno{ SOCK_RAW,	&inetdomain,	IPPROTO_RSVP,	PR_ATOMIC|PR_ADDR,
125179592Sbenno  rsvp_input,	0,		0,		rip_ctloutput,
126179592Sbenno  0,
127226995Smarius  0,		0,		0,		0,
128226995Smarius  &rip_usrreqs
129226995Smarius},
130226995Smarius{ SOCK_RAW,	&inetdomain,	IPPROTO_IPIP,	PR_ATOMIC|PR_ADDR,
131226995Smarius  ipip_input,	0,	 	0,		rip_ctloutput,
132226995Smarius  0,
133226995Smarius  0,		0,		0,		0,
134226995Smarius  &rip_usrreqs
135226995Smarius},
136226995Smarius#ifdef IPDIVERT
137226995Smarius{ SOCK_RAW,	&inetdomain,	IPPROTO_DIVERT,	PR_ATOMIC|PR_ADDR,
138226995Smarius  div_input,	0,	 	0,		ip_ctloutput,
139226995Smarius  0,
140226995Smarius  div_init,	0,		0,		0,
141226995Smarius  &div_usrreqs,
142226995Smarius},
143226995Smarius#endif
144226995Smarius#ifdef TPIP
145179592Sbenno{ SOCK_SEQPACKET,&inetdomain,	IPPROTO_TP,	PR_CONNREQUIRED|PR_WANTRCVD,
146179592Sbenno  tpip_input,	0,		tpip_ctlinput,	tp_ctloutput,
147179592Sbenno  tp_usrreq,
148179592Sbenno  tp_init,	0,		tp_slowtimo,	tp_drain,
149226995Smarius},
150226995Smarius#endif
151179718Sbenno/* EON (ISO CLNL over IP) */
152226995Smarius#ifdef EON
153226995Smarius{ SOCK_RAW,	&inetdomain,	IPPROTO_EON,	0,
154179592Sbenno  eoninput,	0,		eonctlinput,		0,
155179592Sbenno  0,
156179592Sbenno  eonprotoinit,	0,		0,		0,
157179592Sbenno},
158179592Sbenno#endif
159179592Sbenno#ifdef IPXIP
160179592Sbenno{ SOCK_RAW,	&inetdomain,	IPPROTO_IDP,	PR_ATOMIC|PR_ADDR,
161179718Sbenno  ipxip_input,	0,		ipxip_ctlinput,	0,
162179592Sbenno  0,
163179592Sbenno  0,		0,		0,		0,
164179718Sbenno  &rip_usrreqs
165179592Sbenno},
166179592Sbenno#endif
167179592Sbenno#ifdef NSIP
168179592Sbenno{ SOCK_RAW,	&inetdomain,	IPPROTO_IDP,	PR_ATOMIC|PR_ADDR,
169226995Smarius  idpip_input,	0,		nsip_ctlinput,	0,
170179592Sbenno  0,
171179592Sbenno  0,		0,		0,		0,
172179718Sbenno  &rip_usrreqs
173179592Sbenno},
174179592Sbenno#endif
175179592Sbenno	/* raw wildcard */
176226995Smarius{ SOCK_RAW,	&inetdomain,	0,		PR_ATOMIC|PR_ADDR,
177179592Sbenno  rip_input,	0,		0,		rip_ctloutput,
178179592Sbenno  0,
179179718Sbenno  rip_init,	0,		0,		0,
180179592Sbenno  &rip_usrreqs
181179592Sbenno},
182179592Sbenno};
183226995Smarius
184179592Sbennoextern int in_inithead __P((void **, int));
185179592Sbenno
186179718Sbennostruct domain inetdomain =
187179592Sbenno    { AF_INET, "internet", 0, 0, 0,
188179592Sbenno      inetsw, &inetsw[sizeof(inetsw)/sizeof(inetsw[0])], 0,
189179592Sbenno      in_inithead, 32, sizeof(struct sockaddr_in)
190226995Smarius    };
191179592Sbenno
192179592SbennoDOMAIN_SET(inet);
193179718Sbenno
194179592SbennoSYSCTL_NODE(_net,      PF_INET,		inet,	CTLFLAG_RW, 0,
195179592Sbenno	"Internet Family");
196179592Sbenno
197226995SmariusSYSCTL_NODE(_net_inet, IPPROTO_IP,	ip,	CTLFLAG_RW, 0,	"IP");
198179592SbennoSYSCTL_NODE(_net_inet, IPPROTO_ICMP,	icmp,	CTLFLAG_RW, 0,	"ICMP");
199179592SbennoSYSCTL_NODE(_net_inet, IPPROTO_UDP,	udp,	CTLFLAG_RW, 0,	"UDP");
200179592SbennoSYSCTL_NODE(_net_inet, IPPROTO_TCP,	tcp,	CTLFLAG_RW, 0,	"TCP");
201179718SbennoSYSCTL_NODE(_net_inet, IPPROTO_IGMP,	igmp,	CTLFLAG_RW, 0,	"IGMP");
202179592SbennoSYSCTL_NODE(_net_inet, IPPROTO_RAW,	raw,	CTLFLAG_RW, 0,	"RAW");
203179592Sbenno#ifdef IPDIVERT
204179592SbennoSYSCTL_NODE(_net_inet, IPPROTO_DIVERT,	div,	CTLFLAG_RW, 0,	"DIVERT");
205226995Smarius#endif
206179592Sbenno
207179592Sbenno