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" 391e78ac21SJeffrey Hsu #include "opt_mrouting.h" 406a800098SYoshinobu Inoue #include "opt_ipsec.h" 416a800098SYoshinobu Inoue #include "opt_inet6.h" 42fbd1372aSJoerg Wunsch 43df8bae1dSRodney W. Grimes #include <sys/param.h> 44340c35deSJonathan Lemon #include <sys/systm.h> 45748e0b0aSGarrett Wollman #include <sys/kernel.h> 46df8bae1dSRodney W. Grimes #include <sys/socket.h> 47df8bae1dSRodney W. Grimes #include <sys/domain.h> 48dcc3cb75SPoul-Henning Kamp #include <sys/protosw.h> 49ce02431fSDoug Rabson #include <sys/queue.h> 5098163b98SPoul-Henning Kamp #include <sys/sysctl.h> 51df8bae1dSRodney W. Grimes 52df8bae1dSRodney W. Grimes #include <net/if.h> 53df8bae1dSRodney W. Grimes #include <net/route.h> 54df8bae1dSRodney W. Grimes 55df8bae1dSRodney W. Grimes #include <netinet/in.h> 56df8bae1dSRodney W. Grimes #include <netinet/in_systm.h> 57df8bae1dSRodney W. Grimes #include <netinet/ip.h> 58df8bae1dSRodney W. Grimes #include <netinet/ip_var.h> 59df8bae1dSRodney W. Grimes #include <netinet/ip_icmp.h> 60df8bae1dSRodney W. Grimes #include <netinet/igmp_var.h> 611e78ac21SJeffrey Hsu #ifdef PIM 621e78ac21SJeffrey Hsu #include <netinet/pim_var.h> 631e78ac21SJeffrey Hsu #endif 64df8bae1dSRodney W. Grimes #include <netinet/tcp.h> 65df8bae1dSRodney W. Grimes #include <netinet/tcp_timer.h> 66df8bae1dSRodney W. Grimes #include <netinet/tcp_var.h> 67df8bae1dSRodney W. Grimes #include <netinet/udp.h> 68df8bae1dSRodney W. Grimes #include <netinet/udp_var.h> 69686cdd19SJun-ichiro itojun Hagino #include <netinet/ip_encap.h> 706a800098SYoshinobu Inoue 71df8bae1dSRodney W. Grimes /* 72df8bae1dSRodney W. Grimes * TCP/IP protocol family: IP, ICMP, UDP, TCP. 73df8bae1dSRodney W. Grimes */ 74df8bae1dSRodney W. Grimes 756a800098SYoshinobu Inoue #ifdef IPSEC 766a800098SYoshinobu Inoue #include <netinet6/ipsec.h> 776a800098SYoshinobu Inoue #include <netinet6/ah.h> 786a800098SYoshinobu Inoue #ifdef IPSEC_ESP 796a800098SYoshinobu Inoue #include <netinet6/esp.h> 806a800098SYoshinobu Inoue #endif 8133841545SHajimu UMEMOTO #include <netinet6/ipcomp.h> 826a800098SYoshinobu Inoue #endif /* IPSEC */ 836a800098SYoshinobu Inoue 84e8539d32SSam Leffler #ifdef FAST_IPSEC 85b9234fafSSam Leffler #include <netipsec/ipsec.h> 86b9234fafSSam Leffler #endif /* FAST_IPSEC */ 87b9234fafSSam Leffler 88cc6a66f2SJulian Elischer #ifdef IPXIP 89ce7609a4SBruce Evans #include <netipx/ipx_ip.h> 90cc6a66f2SJulian Elischer #endif 91cc6a66f2SJulian Elischer 92df8bae1dSRodney W. Grimes extern struct domain inetdomain; 93a29f300eSGarrett Wollman static struct pr_usrreqs nousrreqs; 94df8bae1dSRodney W. Grimes 95f0ffb944SJulian Elischer struct protosw inetsw[] = { 96df8bae1dSRodney W. Grimes { 0, &inetdomain, 0, 0, 97dbe4b3f0SGarrett Wollman 0, 0, 0, 0, 98df8bae1dSRodney W. Grimes 0, 99a29f300eSGarrett Wollman ip_init, 0, ip_slowtimo, ip_drain, 100a29f300eSGarrett Wollman &nousrreqs 101df8bae1dSRodney W. Grimes }, 102df8bae1dSRodney W. Grimes { SOCK_DGRAM, &inetdomain, IPPROTO_UDP, PR_ATOMIC|PR_ADDR, 103df8bae1dSRodney W. Grimes udp_input, 0, udp_ctlinput, ip_ctloutput, 104d0390e05SGarrett Wollman 0, 105d0390e05SGarrett Wollman udp_init, 0, 0, 0, 106d0390e05SGarrett Wollman &udp_usrreqs 107df8bae1dSRodney W. Grimes }, 108999f1343SGarrett Wollman { SOCK_STREAM, &inetdomain, IPPROTO_TCP, 109999f1343SGarrett Wollman PR_CONNREQUIRED|PR_IMPLOPCL|PR_WANTRCVD, 110df8bae1dSRodney W. Grimes tcp_input, 0, tcp_ctlinput, tcp_ctloutput, 1112c37256eSGarrett Wollman 0, 1129b8b58e0SJonathan Lemon tcp_init, 0, tcp_slowtimo, tcp_drain, 1132c37256eSGarrett Wollman &tcp_usrreqs 114df8bae1dSRodney W. Grimes }, 115df8bae1dSRodney W. Grimes { SOCK_RAW, &inetdomain, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, 11639191c8eSGarrett Wollman rip_input, 0, rip_ctlinput, rip_ctloutput, 117117bcae7SGarrett Wollman 0, 118df8bae1dSRodney W. Grimes 0, 0, 0, 0, 119117bcae7SGarrett Wollman &rip_usrreqs 120df8bae1dSRodney W. Grimes }, 12133841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_ICMP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 122b1e8a2c5SGary Palmer icmp_input, 0, 0, rip_ctloutput, 123117bcae7SGarrett Wollman 0, 124117bcae7SGarrett Wollman 0, 0, 0, 0, 125117bcae7SGarrett Wollman &rip_usrreqs 126df8bae1dSRodney W. Grimes }, 12733841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_IGMP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 128b1e8a2c5SGary Palmer igmp_input, 0, 0, rip_ctloutput, 129117bcae7SGarrett Wollman 0, 130117bcae7SGarrett Wollman igmp_init, igmp_fasttimo, igmp_slowtimo, 0, 131117bcae7SGarrett Wollman &rip_usrreqs 132df8bae1dSRodney W. Grimes }, 13333841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_RSVP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 134b1e8a2c5SGary Palmer rsvp_input, 0, 0, rip_ctloutput, 135117bcae7SGarrett Wollman 0, 136f0068c4aSGarrett Wollman 0, 0, 0, 0, 137117bcae7SGarrett Wollman &rip_usrreqs 138f0068c4aSGarrett Wollman }, 1396a800098SYoshinobu Inoue #ifdef IPSEC 1406a800098SYoshinobu Inoue { SOCK_RAW, &inetdomain, IPPROTO_AH, PR_ATOMIC|PR_ADDR, 1416a800098SYoshinobu Inoue ah4_input, 0, 0, 0, 1426a800098SYoshinobu Inoue 0, 1436a800098SYoshinobu Inoue 0, 0, 0, 0, 1446a800098SYoshinobu Inoue &nousrreqs 1456a800098SYoshinobu Inoue }, 1466a800098SYoshinobu Inoue #ifdef IPSEC_ESP 1476a800098SYoshinobu Inoue { SOCK_RAW, &inetdomain, IPPROTO_ESP, PR_ATOMIC|PR_ADDR, 1486a800098SYoshinobu Inoue esp4_input, 0, 0, 0, 1496a800098SYoshinobu Inoue 0, 1506a800098SYoshinobu Inoue 0, 0, 0, 0, 1516a800098SYoshinobu Inoue &nousrreqs 1526a800098SYoshinobu Inoue }, 1536a800098SYoshinobu Inoue #endif 15433841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR, 15533841545SHajimu UMEMOTO ipcomp4_input, 0, 0, 0, 156cfa1ca9dSYoshinobu Inoue 0, 157cfa1ca9dSYoshinobu Inoue 0, 0, 0, 0, 158cfa1ca9dSYoshinobu Inoue &nousrreqs 159cfa1ca9dSYoshinobu Inoue }, 16033841545SHajimu UMEMOTO #endif /* IPSEC */ 161e8539d32SSam Leffler #ifdef FAST_IPSEC 162e8539d32SSam Leffler { SOCK_RAW, &inetdomain, IPPROTO_AH, PR_ATOMIC|PR_ADDR, 163e8539d32SSam Leffler ah4_input, 0, 0, 0, 164e8539d32SSam Leffler 0, 165e8539d32SSam Leffler 0, 0, 0, 0, 166e8539d32SSam Leffler &nousrreqs 167e8539d32SSam Leffler }, 168e8539d32SSam Leffler { SOCK_RAW, &inetdomain, IPPROTO_ESP, PR_ATOMIC|PR_ADDR, 169e8539d32SSam Leffler esp4_input, 0, 0, 0, 170e8539d32SSam Leffler 0, 171e8539d32SSam Leffler 0, 0, 0, 0, 172e8539d32SSam Leffler &nousrreqs 173e8539d32SSam Leffler }, 174e8539d32SSam Leffler { SOCK_RAW, &inetdomain, IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR, 175e8539d32SSam Leffler ipcomp4_input, 0, 0, 0, 176e8539d32SSam Leffler 0, 177e8539d32SSam Leffler 0, 0, 0, 0, 178e8539d32SSam Leffler &nousrreqs 179e8539d32SSam Leffler }, 180e8539d32SSam Leffler #endif /* FAST_IPSEC */ 18133841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_IPV4, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 18233841545SHajimu UMEMOTO encap4_input, 0, 0, rip_ctloutput, 18333841545SHajimu UMEMOTO 0, 18433841545SHajimu UMEMOTO encap_init, 0, 0, 0, 18533841545SHajimu UMEMOTO &rip_usrreqs 18633841545SHajimu UMEMOTO }, 1878e96e13eSMaxim Sobolev { SOCK_RAW, &inetdomain, IPPROTO_MOBILE, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 1888e96e13eSMaxim Sobolev encap4_input, 0, 0, rip_ctloutput, 1898e96e13eSMaxim Sobolev 0, 1908e96e13eSMaxim Sobolev encap_init, 0, 0, 0, 1918e96e13eSMaxim Sobolev &rip_usrreqs 1928e96e13eSMaxim Sobolev }, 1938e96e13eSMaxim Sobolev { SOCK_RAW, &inetdomain, IPPROTO_GRE, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 1948e96e13eSMaxim Sobolev encap4_input, 0, 0, rip_ctloutput, 1958e96e13eSMaxim Sobolev 0, 1968e96e13eSMaxim Sobolev encap_init, 0, 0, 0, 1978e96e13eSMaxim Sobolev &rip_usrreqs 1988e96e13eSMaxim Sobolev }, 19933841545SHajimu UMEMOTO # ifdef INET6 20033841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_IPV6, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 20133841545SHajimu UMEMOTO encap4_input, 0, 0, rip_ctloutput, 20233841545SHajimu UMEMOTO 0, 20333841545SHajimu UMEMOTO encap_init, 0, 0, 0, 20433841545SHajimu UMEMOTO &rip_usrreqs 20533841545SHajimu UMEMOTO }, 206cfa1ca9dSYoshinobu Inoue #endif 20793e0e116SJulian Elischer #ifdef IPDIVERT 20893e0e116SJulian Elischer { SOCK_RAW, &inetdomain, IPPROTO_DIVERT, PR_ATOMIC|PR_ADDR, 20993e0e116SJulian Elischer div_input, 0, 0, ip_ctloutput, 21077d1915bSPeter Wemm 0, 21193e0e116SJulian Elischer div_init, 0, 0, 0, 21277d1915bSPeter Wemm &div_usrreqs, 21393e0e116SJulian Elischer }, 21493e0e116SJulian Elischer #endif 215cc6a66f2SJulian Elischer #ifdef IPXIP 21633841545SHajimu UMEMOTO { SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 217b1e8a2c5SGary Palmer ipxip_input, 0, ipxip_ctlinput, 0, 218117bcae7SGarrett Wollman 0, 219cc6a66f2SJulian Elischer 0, 0, 0, 0, 220117bcae7SGarrett Wollman &rip_usrreqs 221cc6a66f2SJulian Elischer }, 222cc6a66f2SJulian Elischer #endif 2231e78ac21SJeffrey Hsu #ifdef PIM 2241e78ac21SJeffrey Hsu { SOCK_RAW, &inetdomain, IPPROTO_PIM, PR_ATOMIC|PR_ADDR|PR_LASTHDR, 2251e78ac21SJeffrey Hsu pim_input, 0, 0, rip_ctloutput, 2261e78ac21SJeffrey Hsu 0, 2271e78ac21SJeffrey Hsu 0, 0, 0, 0, 2281e78ac21SJeffrey Hsu &rip_usrreqs 2291e78ac21SJeffrey Hsu }, 2301e78ac21SJeffrey Hsu #endif /* PIM */ 231df8bae1dSRodney W. Grimes /* raw wildcard */ 232df8bae1dSRodney W. Grimes { SOCK_RAW, &inetdomain, 0, PR_ATOMIC|PR_ADDR, 233b1e8a2c5SGary Palmer rip_input, 0, 0, rip_ctloutput, 234117bcae7SGarrett Wollman 0, 235df8bae1dSRodney W. Grimes rip_init, 0, 0, 0, 236117bcae7SGarrett Wollman &rip_usrreqs 237df8bae1dSRodney W. Grimes }, 238df8bae1dSRodney W. Grimes }; 239df8bae1dSRodney W. Grimes 2404d77a549SAlfred Perlstein extern int in_inithead(void **, int); 2415c2dae8eSGarrett Wollman 242df8bae1dSRodney W. Grimes struct domain inetdomain = 243df8bae1dSRodney W. Grimes { AF_INET, "internet", 0, 0, 0, 244f0ffb944SJulian Elischer inetsw, 245f0ffb944SJulian Elischer &inetsw[sizeof(inetsw)/sizeof(inetsw[0])], 0, 2465c2dae8eSGarrett Wollman in_inithead, 32, sizeof(struct sockaddr_in) 2475c2dae8eSGarrett Wollman }; 248df8bae1dSRodney W. Grimes 249748e0b0aSGarrett Wollman DOMAIN_SET(inet); 250748e0b0aSGarrett Wollman 251602d513cSGarrett Wollman SYSCTL_NODE(_net, PF_INET, inet, CTLFLAG_RW, 0, 252602d513cSGarrett Wollman "Internet Family"); 25398163b98SPoul-Henning Kamp 25498163b98SPoul-Henning Kamp SYSCTL_NODE(_net_inet, IPPROTO_IP, ip, CTLFLAG_RW, 0, "IP"); 25598163b98SPoul-Henning Kamp SYSCTL_NODE(_net_inet, IPPROTO_ICMP, icmp, CTLFLAG_RW, 0, "ICMP"); 25698163b98SPoul-Henning Kamp SYSCTL_NODE(_net_inet, IPPROTO_UDP, udp, CTLFLAG_RW, 0, "UDP"); 25798163b98SPoul-Henning Kamp SYSCTL_NODE(_net_inet, IPPROTO_TCP, tcp, CTLFLAG_RW, 0, "TCP"); 25898163b98SPoul-Henning Kamp SYSCTL_NODE(_net_inet, IPPROTO_IGMP, igmp, CTLFLAG_RW, 0, "IGMP"); 259b9234fafSSam Leffler #ifdef FAST_IPSEC 260b9234fafSSam Leffler /* XXX no protocol # to use, pick something "reserved" */ 261b9234fafSSam Leffler SYSCTL_NODE(_net_inet, 253, ipsec, CTLFLAG_RW, 0, "IPSEC"); 262b9234fafSSam Leffler SYSCTL_NODE(_net_inet, IPPROTO_AH, ah, CTLFLAG_RW, 0, "AH"); 263b9234fafSSam Leffler SYSCTL_NODE(_net_inet, IPPROTO_ESP, esp, CTLFLAG_RW, 0, "ESP"); 264b9234fafSSam Leffler SYSCTL_NODE(_net_inet, IPPROTO_IPCOMP, ipcomp, CTLFLAG_RW, 0, "IPCOMP"); 265b9234fafSSam Leffler SYSCTL_NODE(_net_inet, IPPROTO_IPIP, ipip, CTLFLAG_RW, 0, "IPIP"); 266b9234fafSSam Leffler #else 2676a800098SYoshinobu Inoue #ifdef IPSEC 2686a800098SYoshinobu Inoue SYSCTL_NODE(_net_inet, IPPROTO_AH, ipsec, CTLFLAG_RW, 0, "IPSEC"); 2696a800098SYoshinobu Inoue #endif /* IPSEC */ 270b9234fafSSam Leffler #endif /* !FAST_IPSEC */ 271117bcae7SGarrett Wollman SYSCTL_NODE(_net_inet, IPPROTO_RAW, raw, CTLFLAG_RW, 0, "RAW"); 27293e0e116SJulian Elischer #ifdef IPDIVERT 273cec335f9SRuslan Ermilov SYSCTL_NODE(_net_inet, IPPROTO_DIVERT, divert, CTLFLAG_RW, 0, "DIVERT"); 27493e0e116SJulian Elischer #endif 2751e78ac21SJeffrey Hsu #ifdef PIM 2761e78ac21SJeffrey Hsu SYSCTL_NODE(_net_inet, IPPROTO_PIM, pim, CTLFLAG_RW, 0, "PIM"); 2771e78ac21SJeffrey Hsu #endif 278