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