in_proto.c revision 78064
162143Sarchie/*
262143Sarchie * Copyright (c) 1982, 1986, 1993
362143Sarchie *	The Regents of the University of California.  All rights reserved.
462143Sarchie *
562143Sarchie * Redistribution and use in source and binary forms, with or without
662143Sarchie * modification, are permitted provided that the following conditions
762143Sarchie * are met:
862143Sarchie * 1. Redistributions of source code must retain the above copyright
962143Sarchie *    notice, this list of conditions and the following disclaimer.
1062143Sarchie * 2. Redistributions in binary form must reproduce the above copyright
1162143Sarchie *    notice, this list of conditions and the following disclaimer in the
1262143Sarchie *    documentation and/or other materials provided with the distribution.
1362143Sarchie * 3. All advertising materials mentioning features or use of this software
1462143Sarchie *    must display the following acknowledgement:
1562143Sarchie *	This product includes software developed by the University of
1662143Sarchie *	California, Berkeley and its contributors.
1762143Sarchie * 4. Neither the name of the University nor the names of its contributors
1862143Sarchie *    may be used to endorse or promote products derived from this software
1962143Sarchie *    without specific prior written permission.
2062143Sarchie *
2162143Sarchie * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2262143Sarchie * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2362143Sarchie * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2462143Sarchie * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2562143Sarchie * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2662143Sarchie * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2762143Sarchie * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2862143Sarchie * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2962143Sarchie * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3062143Sarchie * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3162143Sarchie * SUCH DAMAGE.
3262143Sarchie *
3362143Sarchie *	@(#)in_proto.c	8.2 (Berkeley) 2/9/95
3462143Sarchie * $FreeBSD: head/sys/netinet/in_proto.c 78064 2001-06-11 12:39:29Z ume $
3562143Sarchie */
3662143Sarchie
3762143Sarchie#include "opt_ipdivert.h"
3862143Sarchie#include "opt_ipx.h"
3962143Sarchie#include "opt_ipsec.h"
4062143Sarchie#include "opt_inet6.h"
4162143Sarchie
4262143Sarchie#include <sys/param.h>
4362143Sarchie#include <sys/kernel.h>
4462143Sarchie#include <sys/socket.h>
4562143Sarchie#include <sys/domain.h>
4662143Sarchie#include <sys/protosw.h>
4762143Sarchie#include <sys/queue.h>
4862143Sarchie#include <sys/sysctl.h>
4962143Sarchie
5062143Sarchie#include <net/if.h>
5162143Sarchie#include <net/route.h>
5262143Sarchie
5362143Sarchie#include <netinet/in.h>
5462143Sarchie#include <netinet/in_systm.h>
5562143Sarchie#include <netinet/ip.h>
5662143Sarchie#include <netinet/ip_var.h>
5762143Sarchie#include <netinet/ip_icmp.h>
5862143Sarchie#include <netinet/igmp_var.h>
5962143Sarchie#include <netinet/tcp.h>
6062143Sarchie#include <netinet/tcp_timer.h>
6162143Sarchie#include <netinet/tcp_var.h>
6262143Sarchie#include <netinet/udp.h>
6362143Sarchie#include <netinet/udp_var.h>
6462143Sarchie#include <netinet/ip_encap.h>
6562143Sarchie
6662143Sarchie#include <netinet/ipprotosw.h>
6762678Sjulian
6862143Sarchie/*
6962143Sarchie * TCP/IP protocol family: IP, ICMP, UDP, TCP.
7062143Sarchie */
7162143Sarchie
7262143Sarchie#ifdef IPSEC
7362143Sarchie#include <netinet6/ipsec.h>
7462143Sarchie#include <netinet6/ah.h>
7562143Sarchie#ifdef IPSEC_ESP
7664358Sarchie#include <netinet6/esp.h>
7764358Sarchie#endif
7871849Sjulian#include <netinet6/ipcomp.h>
7962143Sarchie#endif /* IPSEC */
8062143Sarchie
8162143Sarchie#include "gif.h"
8262143Sarchie#if NGIF > 0
8362143Sarchie#include <netinet/in_gif.h>
8462143Sarchie#endif
8562143Sarchie
8662143Sarchie#include "stf.h"
8762143Sarchie#if NSTF > 0
8862143Sarchie#include <net/if_stf.h>
8962143Sarchie#endif
9062143Sarchie
9162143Sarchie#ifdef IPXIP
9262143Sarchie#include <netipx/ipx_ip.h>
9362143Sarchie#endif
9462143Sarchie
9562143Sarchie#ifdef NSIP
9662143Sarchie#include <netns/ns.h>
9762143Sarchie#include <netns/ns_if.h>
9862143Sarchie#endif
9962143Sarchie
10062143Sarchieextern	struct domain inetdomain;
10162143Sarchiestatic	struct pr_usrreqs nousrreqs;
10270700Sjulian
10362143Sarchiestruct ipprotosw inetsw[] = {
10469922Sjulian{ 0,		&inetdomain,	0,		0,
10562143Sarchie  0,		0,		0,		0,
10662143Sarchie  0,
10762143Sarchie  ip_init,	0,		ip_slowtimo,	ip_drain,
10862143Sarchie  &nousrreqs
10964653Sarchie},
11064653Sarchie{ SOCK_DGRAM,	&inetdomain,	IPPROTO_UDP,	PR_ATOMIC|PR_ADDR,
11164653Sarchie  udp_input,	0,		udp_ctlinput,	ip_ctloutput,
11264653Sarchie  0,
11364653Sarchie  udp_init,	0,		0,		0,
11464653Sarchie  &udp_usrreqs
11564653Sarchie},
11664653Sarchie{ SOCK_STREAM,	&inetdomain,	IPPROTO_TCP,
11764653Sarchie	PR_CONNREQUIRED|PR_IMPLOPCL|PR_WANTRCVD,
11864653Sarchie  tcp_input,	0,		tcp_ctlinput,	tcp_ctloutput,
11964653Sarchie  0,
12064358Sarchie  tcp_init,	0,		tcp_slowtimo,	tcp_drain,
12164358Sarchie  &tcp_usrreqs
12262143Sarchie},
12362143Sarchie{ SOCK_RAW,	&inetdomain,	IPPROTO_RAW,	PR_ATOMIC|PR_ADDR,
12462143Sarchie  rip_input,	0,		rip_ctlinput,	rip_ctloutput,
12562143Sarchie  0,
12662143Sarchie  0,		0,		0,		0,
12762143Sarchie  &rip_usrreqs
12862143Sarchie},
12962143Sarchie{ SOCK_RAW,	&inetdomain,	IPPROTO_ICMP,	PR_ATOMIC|PR_ADDR|PR_LASTHDR,
13062143Sarchie  icmp_input,	0,		0,		rip_ctloutput,
13162143Sarchie  0,
13262143Sarchie  0,		0,		0,		0,
13362143Sarchie  &rip_usrreqs
13462143Sarchie},
13562143Sarchie{ SOCK_RAW,	&inetdomain,	IPPROTO_IGMP,	PR_ATOMIC|PR_ADDR|PR_LASTHDR,
13662143Sarchie  igmp_input,	0,		0,		rip_ctloutput,
13762143Sarchie  0,
13864358Sarchie  igmp_init,	igmp_fasttimo,	igmp_slowtimo,	0,
13964358Sarchie  &rip_usrreqs
14064358Sarchie},
14164358Sarchie{ SOCK_RAW,	&inetdomain,	IPPROTO_RSVP,	PR_ATOMIC|PR_ADDR|PR_LASTHDR,
14264358Sarchie  rsvp_input,	0,		0,		rip_ctloutput,
14364358Sarchie  0,
14464358Sarchie  0,		0,		0,		0,
14564358Sarchie  &rip_usrreqs
14664358Sarchie},
14764653Sarchie#ifdef IPSEC
14864653Sarchie{ SOCK_RAW,	&inetdomain,	IPPROTO_AH,	PR_ATOMIC|PR_ADDR,
14964653Sarchie  ah4_input,	0,	 	0,		0,
15064653Sarchie  0,
15164653Sarchie  0,		0,		0,		0,
15264653Sarchie  &nousrreqs
15364653Sarchie},
15464653Sarchie#ifdef IPSEC_ESP
15564653Sarchie{ SOCK_RAW,	&inetdomain,	IPPROTO_ESP,	PR_ATOMIC|PR_ADDR,
15664653Sarchie  esp4_input,	0,	 	0,		0,
15764653Sarchie  0,
15864653Sarchie  0,		0,		0,		0,
15964653Sarchie  &nousrreqs
16064653Sarchie},
16164358Sarchie#endif
16264358Sarchie{ SOCK_RAW,	&inetdomain,	IPPROTO_IPCOMP,	PR_ATOMIC|PR_ADDR,
16364358Sarchie  ipcomp4_input, 0,	 	0,		0,
16464358Sarchie  0,
16564358Sarchie  0,		0,		0,		0,
16664358Sarchie  &nousrreqs
16764358Sarchie},
16864653Sarchie#endif /* IPSEC */
16964653Sarchie{ SOCK_RAW,	&inetdomain,	IPPROTO_IPV4,	PR_ATOMIC|PR_ADDR|PR_LASTHDR,
17064653Sarchie  encap4_input,	0,	 	0,		rip_ctloutput,
17164653Sarchie  0,
17264653Sarchie  encap_init,		0,		0,		0,
17364653Sarchie  &rip_usrreqs
17464653Sarchie},
17564358Sarchie# ifdef INET6
17664358Sarchie{ SOCK_RAW,	&inetdomain,	IPPROTO_IPV6,	PR_ATOMIC|PR_ADDR|PR_LASTHDR,
17764358Sarchie  encap4_input,	0,	 	0,		rip_ctloutput,
17864358Sarchie  0,
17964358Sarchie  encap_init,	0,		0,		0,
18062143Sarchie  &rip_usrreqs
18162143Sarchie},
18262143Sarchie#endif
18362143Sarchie#ifdef IPDIVERT
18470159Sjulian{ SOCK_RAW,	&inetdomain,	IPPROTO_DIVERT,	PR_ATOMIC|PR_ADDR,
18562143Sarchie  div_input,	0,	 	0,		ip_ctloutput,
18662143Sarchie  0,
18762143Sarchie  div_init,	0,		0,		0,
18862143Sarchie  &div_usrreqs,
18970700Sjulian},
19062143Sarchie#endif
19162143Sarchie#ifdef IPXIP
19269922Sjulian{ SOCK_RAW,	&inetdomain,	IPPROTO_IDP,	PR_ATOMIC|PR_ADDR|PR_LASTHDR,
19362143Sarchie  ipxip_input,	0,		ipxip_ctlinput,	0,
19462143Sarchie  0,
19562143Sarchie  0,		0,		0,		0,
19662143Sarchie  &rip_usrreqs
19771047Sjulian},
19862143Sarchie#endif
19962143Sarchie#ifdef NSIP
20062143Sarchie{ SOCK_RAW,	&inetdomain,	IPPROTO_IDP,	PR_ATOMIC|PR_ADDR|PR_LASTHDR,
20162143Sarchie  idpip_input,	0,		nsip_ctlinput,	0,
20262143Sarchie  0,
20362143Sarchie  0,		0,		0,		0,
20462143Sarchie  &rip_usrreqs
20562143Sarchie},
20662143Sarchie#endif
20762143Sarchie	/* raw wildcard */
20862143Sarchie{ SOCK_RAW,	&inetdomain,	0,		PR_ATOMIC|PR_ADDR,
20962143Sarchie  rip_input,	0,		0,		rip_ctloutput,
21062143Sarchie  0,
21162143Sarchie  rip_init,	0,		0,		0,
21262143Sarchie  &rip_usrreqs
21362143Sarchie},
21462143Sarchie};
21570784Sjulian
21662143Sarchie#if NGIF > 0
21762143Sarchiestruct ipprotosw in_gif_protosw =
21862143Sarchie{ SOCK_RAW,	&inetdomain,	0/*IPPROTO_IPV[46]*/,	PR_ATOMIC|PR_ADDR,
21962143Sarchie  in_gif_input, rip_output,	0,		rip_ctloutput,
22062143Sarchie  0,
22162143Sarchie  0,            0,              0,              0,
22262143Sarchie  &rip_usrreqs
22362143Sarchie};
22462143Sarchie#endif /*NGIF*/
22562143Sarchie
22662143Sarchie#if NSTF > 0
22762143Sarchiestruct ipprotosw in_stf_protosw =
22862143Sarchie{ SOCK_RAW,	&inetdomain,	IPPROTO_IPV6,	PR_ATOMIC|PR_ADDR,
22962143Sarchie  in_stf_input, rip_output,	0,		rip_ctloutput,
23062143Sarchie  0,
23162143Sarchie  0,            0,              0,              0,
23262143Sarchie  &rip_usrreqs
23362143Sarchie};
23470784Sjulian#endif /*NSTF*/
23562143Sarchie
23662143Sarchieextern int in_inithead __P((void **, int));
23762143Sarchie
23862143Sarchiestruct domain inetdomain =
23962143Sarchie    { AF_INET, "internet", 0, 0, 0,
24062143Sarchie      (struct protosw *)inetsw,
24162143Sarchie      (struct protosw *)&inetsw[sizeof(inetsw)/sizeof(inetsw[0])], 0,
24262143Sarchie      in_inithead, 32, sizeof(struct sockaddr_in)
24362143Sarchie    };
24462143Sarchie
24562143SarchieDOMAIN_SET(inet);
24662143Sarchie
24769922SjulianSYSCTL_NODE(_net,      PF_INET,		inet,	CTLFLAG_RW, 0,
24862143Sarchie	"Internet Family");
24962143Sarchie
25062143SarchieSYSCTL_NODE(_net_inet, IPPROTO_IP,	ip,	CTLFLAG_RW, 0,	"IP");
25162143SarchieSYSCTL_NODE(_net_inet, IPPROTO_ICMP,	icmp,	CTLFLAG_RW, 0,	"ICMP");
25262143SarchieSYSCTL_NODE(_net_inet, IPPROTO_UDP,	udp,	CTLFLAG_RW, 0,	"UDP");
25362143SarchieSYSCTL_NODE(_net_inet, IPPROTO_TCP,	tcp,	CTLFLAG_RW, 0,	"TCP");
25462143SarchieSYSCTL_NODE(_net_inet, IPPROTO_IGMP,	igmp,	CTLFLAG_RW, 0,	"IGMP");
25562143Sarchie#ifdef IPSEC
25670784SjulianSYSCTL_NODE(_net_inet, IPPROTO_AH,	ipsec,	CTLFLAG_RW, 0,	"IPSEC");
25762143Sarchie#endif /* IPSEC */
25862143SarchieSYSCTL_NODE(_net_inet, IPPROTO_RAW,	raw,	CTLFLAG_RW, 0,	"RAW");
25962143Sarchie#ifdef IPDIVERT
26062143SarchieSYSCTL_NODE(_net_inet, IPPROTO_DIVERT,	divert,	CTLFLAG_RW, 0,	"DIVERT");
26162143Sarchie#endif
26262143Sarchie
26362143Sarchie