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