1df8bae1dSRodney W. Grimes /* 2df8bae1dSRodney W. Grimes * Copyright (c) 1982, 1986, 1993 3df8bae1dSRodney W. Grimes * The Regents of the University of California. All rights reserved. 4df8bae1dSRodney W. Grimes * 5df8bae1dSRodney W. Grimes * Redistribution and use in source and binary forms, with or without 6df8bae1dSRodney W. Grimes * modification, are permitted provided that the following conditions 7df8bae1dSRodney W. Grimes * are met: 8df8bae1dSRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 9df8bae1dSRodney W. Grimes * notice, this list of conditions and the following disclaimer. 10df8bae1dSRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 11df8bae1dSRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 12df8bae1dSRodney W. Grimes * documentation and/or other materials provided with the distribution. 13df8bae1dSRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 14df8bae1dSRodney W. Grimes * must display the following acknowledgement: 15df8bae1dSRodney W. Grimes * This product includes software developed by the University of 16df8bae1dSRodney W. Grimes * California, Berkeley and its contributors. 17df8bae1dSRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 18df8bae1dSRodney W. Grimes * may be used to endorse or promote products derived from this software 19df8bae1dSRodney W. Grimes * without specific prior written permission. 20df8bae1dSRodney W. Grimes * 21df8bae1dSRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22df8bae1dSRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23df8bae1dSRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24df8bae1dSRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25df8bae1dSRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26df8bae1dSRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27df8bae1dSRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28df8bae1dSRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29df8bae1dSRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30df8bae1dSRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31df8bae1dSRodney W. Grimes * SUCH DAMAGE. 32df8bae1dSRodney W. Grimes * 33425f123eSGarrett Wollman * @(#)in_proto.c 8.2 (Berkeley) 2/9/95 34c3aac50fSPeter Wemm * $FreeBSD$ 35df8bae1dSRodney W. Grimes */ 36df8bae1dSRodney W. Grimes 37fbd1372aSJoerg Wunsch #include "opt_ipdivert.h" 38430df5f4SEivind Eklund #include "opt_ipx.h" 396a800098SYoshinobu Inoue #include "opt_ipsec.h" 406a800098SYoshinobu Inoue #include "opt_inet6.h" 41fbd1372aSJoerg Wunsch 42df8bae1dSRodney W. Grimes #include <sys/param.h> 43340c35deSJonathan Lemon #include <sys/systm.h> 44748e0b0aSGarrett Wollman #include <sys/kernel.h> 45df8bae1dSRodney W. Grimes #include <sys/socket.h> 46df8bae1dSRodney W. Grimes #include <sys/domain.h> 47dcc3cb75SPoul-Henning Kamp #include <sys/protosw.h> 48ce02431fSDoug Rabson #include <sys/queue.h> 4998163b98SPoul-Henning Kamp #include <sys/sysctl.h> 50df8bae1dSRodney W. Grimes 51df8bae1dSRodney W. Grimes #include <net/if.h> 52df8bae1dSRodney W. Grimes #include <net/route.h> 53df8bae1dSRodney W. Grimes 54df8bae1dSRodney W. Grimes #include <netinet/in.h> 55df8bae1dSRodney W. Grimes #include <netinet/in_systm.h> 56df8bae1dSRodney W. Grimes #include <netinet/ip.h> 57df8bae1dSRodney W. Grimes #include <netinet/ip_var.h> 58df8bae1dSRodney W. Grimes #include <netinet/ip_icmp.h> 59df8bae1dSRodney W. Grimes #include <netinet/igmp_var.h> 60df8bae1dSRodney W. Grimes #include <netinet/tcp.h> 61df8bae1dSRodney W. Grimes #include <netinet/tcp_timer.h> 62df8bae1dSRodney W. Grimes #include <netinet/tcp_var.h> 63df8bae1dSRodney W. Grimes #include <netinet/udp.h> 64df8bae1dSRodney W. Grimes #include <netinet/udp_var.h> 65686cdd19SJun-ichiro itojun Hagino #include <netinet/ip_encap.h> 666a800098SYoshinobu Inoue 67df8bae1dSRodney W. Grimes /* 68df8bae1dSRodney W. Grimes * TCP/IP protocol family: IP, ICMP, UDP, TCP. 69df8bae1dSRodney W. Grimes */ 70df8bae1dSRodney W. Grimes 716a800098SYoshinobu Inoue #ifdef IPSEC 726a800098SYoshinobu Inoue #include <netinet6/ipsec.h> 736a800098SYoshinobu Inoue #include <netinet6/ah.h> 746a800098SYoshinobu Inoue #ifdef IPSEC_ESP 756a800098SYoshinobu Inoue #include <netinet6/esp.h> 766a800098SYoshinobu Inoue #endif 7733841545SHajimu UMEMOTO #include <netinet6/ipcomp.h> 786a800098SYoshinobu Inoue #endif /* IPSEC */ 796a800098SYoshinobu Inoue 80e8539d32SSam Leffler #ifdef FAST_IPSEC 81b9234fafSSam Leffler #include <netipsec/ipsec.h> 82b9234fafSSam Leffler #endif /* FAST_IPSEC */ 83b9234fafSSam Leffler 84cc6a66f2SJulian Elischer #ifdef IPXIP 85ce7609a4SBruce Evans #include <netipx/ipx_ip.h> 86cc6a66f2SJulian Elischer #endif 87cc6a66f2SJulian Elischer 88df8bae1dSRodney W. Grimes #ifdef NSIP 89ce7609a4SBruce Evans #include <netns/ns.h> 90ce7609a4SBruce Evans #include <netns/ns_if.h> 91df8bae1dSRodney W. Grimes #endif 92df8bae1dSRodney W. Grimes 93df8bae1dSRodney W. Grimes extern struct domain inetdomain; 94a29f300eSGarrett Wollman static struct pr_usrreqs nousrreqs; 95df8bae1dSRodney W. Grimes 96f0ffb944SJulian Elischer struct protosw inetsw[] = { 97df8bae1dSRodney W. Grimes { 0, &inetdomain, 0, 0, 98dbe4b3f0SGarrett Wollman 0, 0, 0, 0, 99df8bae1dSRodney W. Grimes 0, 100a29f300eSGarrett Wollman ip_init, 0, ip_slowtimo, ip_drain, 101a29f300eSGarrett Wollman &nousrreqs 102df8bae1dSRodney W. Grimes }, 103df8bae1dSRodney W. Grimes { SOCK_DGRAM, &inetdomain, IPPROTO_UDP, PR_ATOMIC|PR_ADDR, 104df8bae1dSRodney W. Grimes udp_input, 0, udp_ctlinput, ip_ctloutput, 105d0390e05SGarrett Wollman 0, 106d0390e05SGarrett Wollman udp_init, 0, 0, 0, 107d0390e05SGarrett Wollman &udp_usrreqs 108df8bae1dSRodney W. Grimes }, 109999f1343SGarrett Wollman { SOCK_STREAM, &inetdomain, IPPROTO_TCP, 110999f1343SGarrett Wollman PR_CONNREQUIRED|PR_IMPLOPCL|PR_WANTRCVD, 111df8bae1dSRodney W. Grimes tcp_input, 0, tcp_ctlinput, tcp_ctloutput, 1122c37256eSGarrett Wollman 0, 1139b8b58e0SJonathan Lemon tcp_init, 0, tcp_slowtimo, tcp_drain, 1142c37256eSGarrett Wollman &tcp_usrreqs 115df8bae1dSRodney W. Grimes }, 116df8bae1dSRodney W. Grimes { SOCK_RAW, &inetdomain, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, 11739191c8eSGarrett Wollman rip_input, 0, rip_ctlinput, rip_ctloutput, 118117bcae7SGarrett Wollman 0, 119df8bae1dSRodney W. Grimes 0, 0, 0, 0, 120117bcae7SGarrett Wollman &rip_usrreqs 121df8bae1dSRodney W. Grimes }, 12233841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_ICMP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 123b1e8a2c5SGary Palmer icmp_input, 0, 0, rip_ctloutput, 124117bcae7SGarrett Wollman 0, 125117bcae7SGarrett Wollman 0, 0, 0, 0, 126117bcae7SGarrett Wollman &rip_usrreqs 127df8bae1dSRodney W. Grimes }, 12833841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_IGMP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 129b1e8a2c5SGary Palmer igmp_input, 0, 0, rip_ctloutput, 130117bcae7SGarrett Wollman 0, 131117bcae7SGarrett Wollman igmp_init, igmp_fasttimo, igmp_slowtimo, 0, 132117bcae7SGarrett Wollman &rip_usrreqs 133df8bae1dSRodney W. Grimes }, 13433841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_RSVP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 135b1e8a2c5SGary Palmer rsvp_input, 0, 0, rip_ctloutput, 136117bcae7SGarrett Wollman 0, 137f0068c4aSGarrett Wollman 0, 0, 0, 0, 138117bcae7SGarrett Wollman &rip_usrreqs 139f0068c4aSGarrett Wollman }, 1406a800098SYoshinobu Inoue #ifdef IPSEC 1416a800098SYoshinobu Inoue { SOCK_RAW, &inetdomain, IPPROTO_AH, PR_ATOMIC|PR_ADDR, 1426a800098SYoshinobu Inoue ah4_input, 0, 0, 0, 1436a800098SYoshinobu Inoue 0, 1446a800098SYoshinobu Inoue 0, 0, 0, 0, 1456a800098SYoshinobu Inoue &nousrreqs 1466a800098SYoshinobu Inoue }, 1476a800098SYoshinobu Inoue #ifdef IPSEC_ESP 1486a800098SYoshinobu Inoue { SOCK_RAW, &inetdomain, IPPROTO_ESP, PR_ATOMIC|PR_ADDR, 1496a800098SYoshinobu Inoue esp4_input, 0, 0, 0, 1506a800098SYoshinobu Inoue 0, 1516a800098SYoshinobu Inoue 0, 0, 0, 0, 1526a800098SYoshinobu Inoue &nousrreqs 1536a800098SYoshinobu Inoue }, 1546a800098SYoshinobu Inoue #endif 15533841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR, 15633841545SHajimu UMEMOTO ipcomp4_input, 0, 0, 0, 157cfa1ca9dSYoshinobu Inoue 0, 158cfa1ca9dSYoshinobu Inoue 0, 0, 0, 0, 159cfa1ca9dSYoshinobu Inoue &nousrreqs 160cfa1ca9dSYoshinobu Inoue }, 16133841545SHajimu UMEMOTO #endif /* IPSEC */ 162e8539d32SSam Leffler #ifdef FAST_IPSEC 163e8539d32SSam Leffler { SOCK_RAW, &inetdomain, IPPROTO_AH, PR_ATOMIC|PR_ADDR, 164e8539d32SSam Leffler ah4_input, 0, 0, 0, 165e8539d32SSam Leffler 0, 166e8539d32SSam Leffler 0, 0, 0, 0, 167e8539d32SSam Leffler &nousrreqs 168e8539d32SSam Leffler }, 169e8539d32SSam Leffler { SOCK_RAW, &inetdomain, IPPROTO_ESP, PR_ATOMIC|PR_ADDR, 170e8539d32SSam Leffler esp4_input, 0, 0, 0, 171e8539d32SSam Leffler 0, 172e8539d32SSam Leffler 0, 0, 0, 0, 173e8539d32SSam Leffler &nousrreqs 174e8539d32SSam Leffler }, 175e8539d32SSam Leffler { SOCK_RAW, &inetdomain, IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR, 176e8539d32SSam Leffler ipcomp4_input, 0, 0, 0, 177e8539d32SSam Leffler 0, 178e8539d32SSam Leffler 0, 0, 0, 0, 179e8539d32SSam Leffler &nousrreqs 180e8539d32SSam Leffler }, 181e8539d32SSam Leffler #endif /* FAST_IPSEC */ 18233841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_IPV4, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 18333841545SHajimu UMEMOTO encap4_input, 0, 0, rip_ctloutput, 18433841545SHajimu UMEMOTO 0, 18533841545SHajimu UMEMOTO encap_init, 0, 0, 0, 18633841545SHajimu UMEMOTO &rip_usrreqs 18733841545SHajimu UMEMOTO }, 1888e96e13eSMaxim Sobolev { SOCK_RAW, &inetdomain, IPPROTO_MOBILE, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 1898e96e13eSMaxim Sobolev encap4_input, 0, 0, rip_ctloutput, 1908e96e13eSMaxim Sobolev 0, 1918e96e13eSMaxim Sobolev encap_init, 0, 0, 0, 1928e96e13eSMaxim Sobolev &rip_usrreqs 1938e96e13eSMaxim Sobolev }, 1948e96e13eSMaxim Sobolev { SOCK_RAW, &inetdomain, IPPROTO_GRE, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 1958e96e13eSMaxim Sobolev encap4_input, 0, 0, rip_ctloutput, 1968e96e13eSMaxim Sobolev 0, 1978e96e13eSMaxim Sobolev encap_init, 0, 0, 0, 1988e96e13eSMaxim Sobolev &rip_usrreqs 1998e96e13eSMaxim Sobolev }, 20033841545SHajimu UMEMOTO # ifdef INET6 20133841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_IPV6, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 20233841545SHajimu UMEMOTO encap4_input, 0, 0, rip_ctloutput, 20333841545SHajimu UMEMOTO 0, 20433841545SHajimu UMEMOTO encap_init, 0, 0, 0, 20533841545SHajimu UMEMOTO &rip_usrreqs 20633841545SHajimu UMEMOTO }, 207cfa1ca9dSYoshinobu Inoue #endif 20893e0e116SJulian Elischer #ifdef IPDIVERT 20993e0e116SJulian Elischer { SOCK_RAW, &inetdomain, IPPROTO_DIVERT, PR_ATOMIC|PR_ADDR, 21093e0e116SJulian Elischer div_input, 0, 0, ip_ctloutput, 21177d1915bSPeter Wemm 0, 21293e0e116SJulian Elischer div_init, 0, 0, 0, 21377d1915bSPeter Wemm &div_usrreqs, 21493e0e116SJulian Elischer }, 21593e0e116SJulian Elischer #endif 216cc6a66f2SJulian Elischer #ifdef IPXIP 21733841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 218b1e8a2c5SGary Palmer ipxip_input, 0, ipxip_ctlinput, 0, 219117bcae7SGarrett Wollman 0, 220cc6a66f2SJulian Elischer 0, 0, 0, 0, 221117bcae7SGarrett Wollman &rip_usrreqs 222cc6a66f2SJulian Elischer }, 223cc6a66f2SJulian Elischer #endif 224df8bae1dSRodney W. Grimes #ifdef NSIP 22533841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 226d7e74838SBill Fenner idpip_input, 0, nsip_ctlinput, 0, 227117bcae7SGarrett Wollman 0, 228df8bae1dSRodney W. Grimes 0, 0, 0, 0, 229117bcae7SGarrett Wollman &rip_usrreqs 230df8bae1dSRodney W. Grimes }, 231df8bae1dSRodney W. Grimes #endif 232df8bae1dSRodney W. Grimes /* raw wildcard */ 233df8bae1dSRodney W. Grimes { SOCK_RAW, &inetdomain, 0, PR_ATOMIC|PR_ADDR, 234b1e8a2c5SGary Palmer rip_input, 0, 0, rip_ctloutput, 235117bcae7SGarrett Wollman 0, 236df8bae1dSRodney W. Grimes rip_init, 0, 0, 0, 237117bcae7SGarrett Wollman &rip_usrreqs 238df8bae1dSRodney W. Grimes }, 239df8bae1dSRodney W. Grimes }; 240df8bae1dSRodney W. Grimes 2414d77a549SAlfred Perlstein extern int in_inithead(void **, int); 2425c2dae8eSGarrett Wollman 243df8bae1dSRodney W. Grimes struct domain inetdomain = 244df8bae1dSRodney W. Grimes { AF_INET, "internet", 0, 0, 0, 245f0ffb944SJulian Elischer inetsw, 246f0ffb944SJulian Elischer &inetsw[sizeof(inetsw)/sizeof(inetsw[0])], 0, 2475c2dae8eSGarrett Wollman in_inithead, 32, sizeof(struct sockaddr_in) 2485c2dae8eSGarrett Wollman }; 249df8bae1dSRodney W. Grimes 250748e0b0aSGarrett Wollman DOMAIN_SET(inet); 251748e0b0aSGarrett Wollman 252602d513cSGarrett Wollman SYSCTL_NODE(_net, PF_INET, inet, CTLFLAG_RW, 0, 253602d513cSGarrett Wollman "Internet Family"); 25498163b98SPoul-Henning Kamp 25598163b98SPoul-Henning Kamp SYSCTL_NODE(_net_inet, IPPROTO_IP, ip, CTLFLAG_RW, 0, "IP"); 25698163b98SPoul-Henning Kamp SYSCTL_NODE(_net_inet, IPPROTO_ICMP, icmp, CTLFLAG_RW, 0, "ICMP"); 25798163b98SPoul-Henning Kamp SYSCTL_NODE(_net_inet, IPPROTO_UDP, udp, CTLFLAG_RW, 0, "UDP"); 25898163b98SPoul-Henning Kamp SYSCTL_NODE(_net_inet, IPPROTO_TCP, tcp, CTLFLAG_RW, 0, "TCP"); 25998163b98SPoul-Henning Kamp SYSCTL_NODE(_net_inet, IPPROTO_IGMP, igmp, CTLFLAG_RW, 0, "IGMP"); 260b9234fafSSam Leffler #ifdef FAST_IPSEC 261b9234fafSSam Leffler /* XXX no protocol # to use, pick something "reserved" */ 262b9234fafSSam Leffler SYSCTL_NODE(_net_inet, 253, ipsec, CTLFLAG_RW, 0, "IPSEC"); 263b9234fafSSam Leffler SYSCTL_NODE(_net_inet, IPPROTO_AH, ah, CTLFLAG_RW, 0, "AH"); 264b9234fafSSam Leffler SYSCTL_NODE(_net_inet, IPPROTO_ESP, esp, CTLFLAG_RW, 0, "ESP"); 265b9234fafSSam Leffler SYSCTL_NODE(_net_inet, IPPROTO_IPCOMP, ipcomp, CTLFLAG_RW, 0, "IPCOMP"); 266b9234fafSSam Leffler SYSCTL_NODE(_net_inet, IPPROTO_IPIP, ipip, CTLFLAG_RW, 0, "IPIP"); 267b9234fafSSam Leffler #else 2686a800098SYoshinobu Inoue #ifdef IPSEC 2696a800098SYoshinobu Inoue SYSCTL_NODE(_net_inet, IPPROTO_AH, ipsec, CTLFLAG_RW, 0, "IPSEC"); 2706a800098SYoshinobu Inoue #endif /* IPSEC */ 271b9234fafSSam Leffler #endif /* !FAST_IPSEC */ 272117bcae7SGarrett Wollman SYSCTL_NODE(_net_inet, IPPROTO_RAW, raw, CTLFLAG_RW, 0, "RAW"); 27393e0e116SJulian Elischer #ifdef IPDIVERT 274cec335f9SRuslan Ermilov SYSCTL_NODE(_net_inet, IPPROTO_DIVERT, divert, CTLFLAG_RW, 0, "DIVERT"); 27593e0e116SJulian Elischer #endif 27698163b98SPoul-Henning Kamp 277