root/netinet/in_proto.c

/* [<][>][^][v][top][bottom][index][help] */
    1 /*      $OpenBSD: in_proto.c,v 1.46 2007/06/06 09:58:12 henning Exp $   */
    2 /*      $NetBSD: in_proto.c,v 1.14 1996/02/18 18:58:32 christos Exp $   */
    3 
    4 /*
    5  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
    6  * All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. Neither the name of the project nor the names of its contributors
   17  *    may be used to endorse or promote products derived from this software
   18  *    without specific prior written permission.
   19  *
   20  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
   21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
   24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   30  * SUCH DAMAGE.
   31  */
   32 
   33 /*
   34  * Copyright (c) 1982, 1986, 1993
   35  *      The Regents of the University of California.  All rights reserved.
   36  *
   37  * Redistribution and use in source and binary forms, with or without
   38  * modification, are permitted provided that the following conditions
   39  * are met:
   40  * 1. Redistributions of source code must retain the above copyright
   41  *    notice, this list of conditions and the following disclaimer.
   42  * 2. Redistributions in binary form must reproduce the above copyright
   43  *    notice, this list of conditions and the following disclaimer in the
   44  *    documentation and/or other materials provided with the distribution.
   45  * 3. Neither the name of the University nor the names of its contributors
   46  *    may be used to endorse or promote products derived from this software
   47  *    without specific prior written permission.
   48  *
   49  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   50  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   51  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   52  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   53  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   54  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   55  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   56  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   57  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   58  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   59  * SUCH DAMAGE.
   60  *
   61  *      @(#)COPYRIGHT   1.1 (NRL) 17 January 1995
   62  *
   63  * NRL grants permission for redistribution and use in source and binary
   64  * forms, with or without modification, of the software and documentation
   65  * created at NRL provided that the following conditions are met:
   66  *
   67  * 1. Redistributions of source code must retain the above copyright
   68  *    notice, this list of conditions and the following disclaimer.
   69  * 2. Redistributions in binary form must reproduce the above copyright
   70  *    notice, this list of conditions and the following disclaimer in the
   71  *    documentation and/or other materials provided with the distribution.
   72  * 3. All advertising materials mentioning features or use of this software
   73  *    must display the following acknowledgements:
   74  *      This product includes software developed by the University of
   75  *      California, Berkeley and its contributors.
   76  *      This product includes software developed at the Information
   77  *      Technology Division, US Naval Research Laboratory.
   78  * 4. Neither the name of the NRL nor the names of its contributors
   79  *    may be used to endorse or promote products derived from this software
   80  *    without specific prior written permission.
   81  *
   82  * THE SOFTWARE PROVIDED BY NRL IS PROVIDED BY NRL AND CONTRIBUTORS ``AS
   83  * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   84  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
   85  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL NRL OR
   86  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   87  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   88  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   89  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   90  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   91  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   92  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   93  *
   94  * The views and conclusions contained in the software and documentation
   95  * are those of the authors and should not be interpreted as representing
   96  * official policies, either expressed or implied, of the US Naval
   97  * Research Laboratory (NRL).
   98  */
   99 
  100 #include <sys/param.h>
  101 #include <sys/socket.h>
  102 #include <sys/protosw.h>
  103 #include <sys/domain.h>
  104 #include <sys/mbuf.h>
  105 
  106 #include <net/if.h>
  107 #include <net/route.h>
  108 #include <net/radix.h>
  109 #ifndef SMALL_KERNEL
  110 #include <net/radix_mpath.h>
  111 #endif
  112 
  113 #include <netinet/in.h>
  114 #include <netinet/in_systm.h>
  115 #include <netinet/ip.h>
  116 #include <netinet/ip_var.h>
  117 #include <netinet/ip_icmp.h>
  118 #include <netinet/in_pcb.h>
  119 
  120 #ifdef INET6
  121 #ifndef INET
  122 #include <netinet/in.h>
  123 #endif
  124 #include <netinet/ip6.h>
  125 #endif
  126 
  127 #include <netinet/igmp_var.h>
  128 #ifdef PIM
  129 #include <netinet/pim_var.h>
  130 #endif
  131 #include <netinet/tcp.h>
  132 #include <netinet/tcp_timer.h>
  133 #include <netinet/tcp_var.h>
  134 #include <netinet/udp.h>
  135 #include <netinet/udp_var.h>
  136 
  137 /*
  138  * TCP/IP protocol family: IP, ICMP, UDP, TCP.
  139  */
  140 
  141 #include "gif.h"
  142 #if NGIF > 0
  143 #include <netinet/in_gif.h>
  144 #endif
  145 
  146 #ifdef INET6
  147 #include <netinet6/ip6_var.h>
  148 #endif /* INET6 */
  149 
  150 #ifdef IPSEC
  151 #include <netinet/ip_ipsp.h>
  152 #include <netinet/ip_ether.h>
  153 #endif
  154 
  155 #include <netinet/ip_ipip.h>
  156 
  157 #include "gre.h"
  158 #if NGRE > 0
  159 #include <netinet/ip_gre.h>
  160 #include <net/if_gre.h>
  161 #endif
  162 
  163 #include "carp.h"
  164 #if NCARP > 0
  165 #include <netinet/ip_carp.h>
  166 #endif
  167 
  168 #include "pfsync.h"
  169 #if NPFSYNC > 0
  170 #include <net/pfvar.h>
  171 #include <net/if_pfsync.h>
  172 #endif
  173 
  174 extern  struct domain inetdomain;
  175 
  176 struct protosw inetsw[] = {
  177 { 0,            &inetdomain,    0,              0,
  178   0,            ip_output,      0,              0,
  179   0,
  180   ip_init,      0,              ip_slowtimo,    ip_drain,       ip_sysctl
  181 },
  182 { SOCK_DGRAM,   &inetdomain,    IPPROTO_UDP,    PR_ATOMIC|PR_ADDR,
  183   udp_input,    0,              udp_ctlinput,   ip_ctloutput,
  184   udp_usrreq,
  185   udp_init,     0,              0,              0,              udp_sysctl
  186 },
  187 { SOCK_STREAM,  &inetdomain,    IPPROTO_TCP,    PR_CONNREQUIRED|PR_WANTRCVD|PR_ABRTACPTDIS,
  188   tcp_input,    0,              tcp_ctlinput,   tcp_ctloutput,
  189   tcp_usrreq,
  190   tcp_init,     0,              tcp_slowtimo,   tcp_drain,      tcp_sysctl
  191 },
  192 { SOCK_RAW,     &inetdomain,    IPPROTO_RAW,    PR_ATOMIC|PR_ADDR,
  193   rip_input,    rip_output,     0,              rip_ctloutput,
  194   rip_usrreq,
  195   0,            0,              0,              0,
  196 },
  197 { SOCK_RAW,     &inetdomain,    IPPROTO_ICMP,   PR_ATOMIC|PR_ADDR,
  198   icmp_input,   rip_output,     0,              rip_ctloutput,
  199   rip_usrreq,
  200   icmp_init,    0,              0,              0,              icmp_sysctl
  201 },
  202 #if NGIF > 0
  203 { SOCK_RAW,     &inetdomain,    IPPROTO_IPV4,   PR_ATOMIC|PR_ADDR,
  204   in_gif_input, rip_output,     0,              rip_ctloutput,
  205   rip_usrreq,
  206   0,            0,              0,              0,              ipip_sysctl
  207 },
  208 #ifdef INET6
  209 { SOCK_RAW,     &inetdomain,    IPPROTO_IPV6,   PR_ATOMIC|PR_ADDR,
  210   in_gif_input, rip_output,      0,             0,
  211   rip_usrreq,   /*XXX*/
  212   0,            0,              0,              0,
  213 },
  214 #endif /* INET6 */
  215 #else /* NGIF */
  216 { SOCK_RAW,     &inetdomain,    IPPROTO_IPIP,   PR_ATOMIC|PR_ADDR,
  217   ip4_input,    rip_output,     0,              rip_ctloutput,
  218   rip_usrreq,
  219   0,            0,              0,              0,              ipip_sysctl
  220 },
  221 #ifdef INET6
  222 { SOCK_RAW,     &inetdomain,    IPPROTO_IPV6,   PR_ATOMIC|PR_ADDR,
  223   ip4_input,    rip_output,     0,              rip_ctloutput,
  224   rip_usrreq,   /*XXX*/
  225   0,            0,              0,              0,
  226 },
  227 #endif /* INET6 */
  228 #endif /*NGIF*/
  229 { SOCK_RAW,     &inetdomain,    IPPROTO_IGMP,   PR_ATOMIC|PR_ADDR,
  230   igmp_input,   rip_output,     0,              rip_ctloutput,
  231   rip_usrreq,
  232   igmp_init,    igmp_fasttimo,  igmp_slowtimo,  0,
  233 },
  234 #ifdef PIM
  235 { SOCK_RAW,     &inetdomain,    IPPROTO_PIM,    PR_ATOMIC|PR_ADDR,
  236   pim_input,    rip_output,     0,              rip_ctloutput,
  237   rip_usrreq,
  238   0,            0,              0,              0,
  239 },
  240 #endif /* PIM */
  241 #ifdef IPSEC
  242 { SOCK_RAW,   &inetdomain,    IPPROTO_AH,     PR_ATOMIC|PR_ADDR,
  243   ah4_input,   rip_output,    ah4_ctlinput,   rip_ctloutput,
  244   rip_usrreq,
  245   0,          0,              0,              0,                ah_sysctl
  246 },
  247 { SOCK_RAW,   &inetdomain,    IPPROTO_ESP,    PR_ATOMIC|PR_ADDR,
  248   esp4_input,  rip_output,    esp4_ctlinput,  rip_ctloutput,
  249   rip_usrreq,
  250   0,          0,              0,              0,                esp_sysctl
  251 },
  252 { SOCK_RAW,   &inetdomain,    IPPROTO_ETHERIP, PR_ATOMIC|PR_ADDR,
  253   etherip_input,  rip_output, 0,              rip_ctloutput,
  254   rip_usrreq,
  255   0,          0,              0,              0,                etherip_sysctl
  256 },
  257 { SOCK_RAW,   &inetdomain,    IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR,
  258   ipcomp4_input,  rip_output, 0,              rip_ctloutput,
  259   rip_usrreq,
  260   0,          0,              0,              0,                ipcomp_sysctl
  261 },
  262 #endif /* IPSEC */
  263 #if NGRE > 0
  264 { SOCK_RAW,     &inetdomain,    IPPROTO_GRE,    PR_ATOMIC|PR_ADDR,
  265   gre_input,    rip_output,     0,              rip_ctloutput,
  266   rip_usrreq,
  267   0,            0,              0,             0,               gre_sysctl
  268 },
  269 { SOCK_RAW,     &inetdomain,    IPPROTO_MOBILE, PR_ATOMIC|PR_ADDR,
  270   gre_mobile_input,     rip_output,     0,              rip_ctloutput,
  271   rip_usrreq,
  272   0,            0,              0,              0,              ipmobile_sysctl
  273 },
  274 #endif /* NGRE > 0 */
  275 #if NCARP > 0
  276 { SOCK_RAW,     &inetdomain,    IPPROTO_CARP,   PR_ATOMIC|PR_ADDR,
  277   carp_proto_input,     rip_output,     0,              rip_ctloutput,
  278   rip_usrreq,
  279   0,            0,              0,              0,              carp_sysctl
  280 },
  281 #endif /* NCARP > 0 */
  282 #if NPFSYNC > 0
  283 { SOCK_RAW,     &inetdomain,    IPPROTO_PFSYNC, PR_ATOMIC|PR_ADDR,
  284   pfsync_input, rip_output,     0,              rip_ctloutput,
  285   rip_usrreq,
  286   0,            0,              0,              0,
  287 },
  288 #endif /* NPFSYNC > 0 */
  289 /* raw wildcard */
  290 { SOCK_RAW,     &inetdomain,    0,              PR_ATOMIC|PR_ADDR,
  291   rip_input,    rip_output,     0,              rip_ctloutput,
  292   rip_usrreq,
  293   rip_init,     0,              0,              0,
  294 },
  295 };
  296 
  297 struct domain inetdomain =
  298     { AF_INET, "internet", 0, 0, 0,
  299       inetsw, &inetsw[sizeof(inetsw)/sizeof(inetsw[0])], 0,
  300 #ifndef SMALL_KERNEL
  301       rn_mpath_inithead,
  302 #else
  303       rn_inithead,
  304 #endif
  305       32, sizeof(struct sockaddr_in) };
  306 
  307 #ifdef notyet /* XXXX */
  308 #include "hy.h"
  309 #if NHY > 0
  310 /*
  311  * HYPERchannel protocol family: raw interface.
  312  */
  313 int     rhy_output();
  314 extern  struct domain hydomain;
  315 
  316 struct protosw hysw[] = {
  317 { SOCK_RAW,     &hydomain,      0,              PR_ATOMIC|PR_ADDR,
  318   0,            rhy_output,     0,              0,
  319   rip_usrreq,
  320   0,            0,              0,              0,
  321 },
  322 };
  323 
  324 struct domain hydomain =
  325     { AF_HYLINK, "hy", 0, 0, 0, hysw, &hysw[sizeof (hysw)/sizeof(hysw[0])] };
  326 #endif
  327 #endif

/* [<][>][^][v][top][bottom][index][help] */