[BACK]Return to in6_proto.c CVS log [TXT][DIR] Up to [local] / sys / netinet6

Annotation of sys/netinet6/in6_proto.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: in6_proto.c,v 1.52 2007/05/03 15:47:47 claudio Exp $  */
                      2: /*     $KAME: in6_proto.c,v 1.66 2000/10/10 15:35:47 itojun 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:  *     @(#)in_proto.c  8.1 (Berkeley) 6/10/93
                     62:  */
                     63:
                     64: #include <sys/param.h>
                     65: #include <sys/socket.h>
                     66: #include <sys/protosw.h>
                     67: #include <sys/kernel.h>
                     68: #include <sys/domain.h>
                     69: #include <sys/mbuf.h>
                     70:
                     71: #include <net/if.h>
                     72: #include <net/radix.h>
                     73: #ifndef SMALL_KERNEL
                     74: #include <net/radix_mpath.h>
                     75: #endif
                     76: #include <net/route.h>
                     77:
                     78: #include <netinet/in.h>
                     79: #include <netinet/in_systm.h>
                     80: #include <netinet/in_var.h>
                     81: #include <netinet/ip.h>
                     82: #include <netinet/ip_var.h>
                     83: #include <netinet/in_pcb.h>
                     84: #include <netinet/ip6.h>
                     85: #include <netinet6/ip6_var.h>
                     86: #include <netinet/icmp6.h>
                     87:
                     88: #include <netinet/tcp.h>
                     89: #include <netinet/tcp_timer.h>
                     90: #include <netinet/tcp_var.h>
                     91: #include <netinet/udp.h>
                     92: #include <netinet/udp_var.h>
                     93: #include <netinet/ip_ipsp.h>
                     94: #include <netinet/ip_ah.h>
                     95: #include <netinet/ip_esp.h>
                     96: #include <netinet/ip_ipip.h>
                     97:
                     98: #ifdef MROUTING
                     99: #include <netinet6/pim6_var.h>
                    100: #endif
                    101:
                    102: #include <netinet6/nd6.h>
                    103:
                    104: #include <netinet6/ip6protosw.h>
                    105:
                    106: #include "gif.h"
                    107: #if NGIF > 0
                    108: #include <netinet6/in6_gif.h>
                    109: #endif
                    110:
                    111: #include "carp.h"
                    112: #if NCARP > 0
                    113: #include <netinet/ip_carp.h>
                    114: #endif
                    115:
                    116: /*
                    117:  * TCP/IP protocol family: IP6, ICMP6, UDP, TCP.
                    118:  */
                    119:
                    120: extern struct domain inet6domain;
                    121:
                    122: struct ip6protosw inet6sw[] = {
                    123: { 0,           &inet6domain,   IPPROTO_IPV6,   0,
                    124:   0,           0,              0,              0,
                    125:   0,
                    126:   ip6_init,    0,              frag6_slowtimo, frag6_drain,
                    127:   ip6_sysctl,
                    128: },
                    129: { SOCK_DGRAM,  &inet6domain,   IPPROTO_UDP,    PR_ATOMIC|PR_ADDR,
                    130:   udp6_input,  0,              udp6_ctlinput,  ip6_ctloutput,
                    131:   udp6_usrreq, 0,
                    132:   0,           0,              0,
                    133:   udp_sysctl,
                    134: },
                    135: { SOCK_STREAM, &inet6domain,   IPPROTO_TCP,    PR_CONNREQUIRED|PR_WANTRCVD|PR_ABRTACPTDIS,
                    136:   tcp6_input,  0,              tcp6_ctlinput,  tcp_ctloutput,
                    137:   tcp6_usrreq,
                    138: #ifdef INET    /* don't call initialization and timeout routines twice */
                    139:   0,           0,              0,              tcp_drain,
                    140: #else
                    141:   tcp_init,    tcp_fasttimo,   tcp_slowtimo,   tcp_drain,
                    142: #endif
                    143:   tcp_sysctl,
                    144: },
                    145: { SOCK_RAW,    &inet6domain,   IPPROTO_RAW,    PR_ATOMIC|PR_ADDR,
                    146:   rip6_input,  rip6_output,    rip6_ctlinput,  rip6_ctloutput,
                    147:   rip6_usrreq,
                    148:   0,           0,              0,              0,
                    149: },
                    150: { SOCK_RAW,    &inet6domain,   IPPROTO_ICMPV6, PR_ATOMIC|PR_ADDR,
                    151:   icmp6_input, rip6_output,    rip6_ctlinput,  rip6_ctloutput,
                    152:   rip6_usrreq,
                    153:   icmp6_init,  icmp6_fasttimo, 0,              0,
                    154:   icmp6_sysctl,
                    155: },
                    156: { SOCK_RAW,    &inet6domain,   IPPROTO_DSTOPTS,PR_ATOMIC|PR_ADDR,
                    157:   dest6_input, 0,              0,              0,
                    158:   0,
                    159:   0,           0,              0,              0,
                    160: },
                    161: { SOCK_RAW,    &inet6domain,   IPPROTO_ROUTING,PR_ATOMIC|PR_ADDR,
                    162:   route6_input,        0,              0,              0,
                    163:   0,
                    164:   0,           0,              0,              0,
                    165: },
                    166: { SOCK_RAW,    &inet6domain,   IPPROTO_FRAGMENT,PR_ATOMIC|PR_ADDR,
                    167:   frag6_input, 0,              0,              0,
                    168:   0,
                    169:   0,           0,              0,              0,
                    170: },
                    171: #ifdef IPSEC
                    172: { SOCK_RAW,    &inet6domain,   IPPROTO_AH,     PR_ATOMIC|PR_ADDR,
                    173:   ah6_input,   0,              0,              0,
                    174:   0,
                    175:   0,           0,              0,              0,
                    176:   ah_sysctl,
                    177: },
                    178: { SOCK_RAW,    &inet6domain,   IPPROTO_ESP,    PR_ATOMIC|PR_ADDR,
                    179:   esp6_input,  0,              0,              0,
                    180:   0,
                    181:   0,           0,              0,              0,
                    182:   esp_sysctl,
                    183: },
                    184: { SOCK_RAW,    &inet6domain,   IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR,
                    185:   ipcomp6_input, 0,            0,              0,
                    186:   0,
                    187:   0,           0,              0,              0,
                    188:   ipcomp_sysctl,
                    189: },
                    190: #endif /* IPSEC */
                    191: #if NGIF > 0
                    192: { SOCK_RAW,    &inet6domain,   IPPROTO_IPV6,   PR_ATOMIC|PR_ADDR,
                    193:   in6_gif_input, rip6_output,          0,              rip6_ctloutput,
                    194:   rip6_usrreq, /* XXX */
                    195:   0,           0,              0,              0,
                    196: },
                    197: #ifdef INET
                    198: { SOCK_RAW,    &inet6domain,   IPPROTO_IPV4,   PR_ATOMIC|PR_ADDR,
                    199:   in6_gif_input, rip6_output,  0,              rip6_ctloutput,
                    200:   rip6_usrreq, /* XXX */
                    201:   0,           0,              0,              0,
                    202: },
                    203: #endif /* INET */
                    204: #else /* NGIF */
                    205: { SOCK_RAW,    &inet6domain,   IPPROTO_IPV6,   PR_ATOMIC|PR_ADDR,
                    206:   ip4_input6,  rip6_output,    0,              rip6_ctloutput,
                    207:   rip6_usrreq, /* XXX */
                    208:   0,           0,              0,              0,              ipip_sysctl
                    209: },
                    210: #ifdef INET
                    211: { SOCK_RAW,    &inet6domain,   IPPROTO_IPV4,   PR_ATOMIC|PR_ADDR,
                    212:   ip4_input6,  rip6_output,    0,              rip6_ctloutput,
                    213:   rip6_usrreq, /* XXX */
                    214:   0,           0,              0,              0,
                    215: },
                    216: #endif /* INET */
                    217: #endif /* GIF */
                    218: #ifdef MROUTING
                    219: { SOCK_RAW,    &inet6domain,   IPPROTO_PIM,    PR_ATOMIC|PR_ADDR,
                    220:   pim6_input,  rip6_output,    0,              rip6_ctloutput,
                    221:   rip6_usrreq,
                    222:   0,           0,              0,              0,
                    223: },
                    224: #endif
                    225: #if NCARP > 0
                    226: { SOCK_RAW,    &inet6domain,   IPPROTO_CARP,   PR_ATOMIC|PR_ADDR,
                    227:   carp6_proto_input,   rip6_output,    0,              rip6_ctloutput,
                    228:   rip6_usrreq,
                    229:   0,           0,              0,              0,              carp_sysctl
                    230: },
                    231: #endif /* NCARP */
                    232: /* raw wildcard */
                    233: { SOCK_RAW,    &inet6domain,   0,              PR_ATOMIC|PR_ADDR,
                    234:   rip6_input,  rip6_output,    0,              rip6_ctloutput,
                    235:   rip6_usrreq, rip6_init,
                    236:   0,           0,              0,
                    237: },
                    238: };
                    239:
                    240: struct domain inet6domain =
                    241:     { AF_INET6, "internet6", 0, 0, 0,
                    242:       (struct protosw *)inet6sw,
                    243:       (struct protosw *)&inet6sw[sizeof(inet6sw)/sizeof(inet6sw[0])], 0,
                    244: #ifndef SMALL_KERNEL
                    245:       rn_mpath_inithead,
                    246: #else
                    247:       rn_inithead,
                    248: #endif
                    249:       offsetof(struct sockaddr_in6, sin6_addr) << 3,
                    250:       sizeof(struct sockaddr_in6),
                    251:       in6_domifattach, in6_domifdetach, };
                    252:
                    253: /*
                    254:  * Internet configuration info
                    255:  */
                    256: int    ip6_forwarding = 0;     /* no forwarding unless sysctl'd to enable */
                    257: int    ip6_mforwarding = 0;    /* no multicast forwarding unless ... */
                    258: int    ip6_multipath = 0;      /* no using multipath routes unless ... */
                    259: int    ip6_sendredirects = 1;
                    260: int    ip6_defhlim = IPV6_DEFHLIM;
                    261: int    ip6_defmcasthlim = IPV6_DEFAULT_MULTICAST_HOPS;
                    262: int    ip6_accept_rtadv = 0;   /* enabling forwarding and rtadv concurrently is dangerous */
                    263: int    ip6_maxfragpackets = 200;
                    264: int    ip6_maxfrags = 200;
                    265: int    ip6_log_interval = 5;
                    266: int    ip6_hdrnestlimit = 10;  /* appropriate? */
                    267: int    ip6_dad_count = 1;      /* DupAddrDetectionTransmits */
                    268: int    ip6_auto_flowlabel = 1;
                    269: int    ip6_use_deprecated = 1; /* allow deprecated addr (RFC2462 5.5.4) */
                    270: int    ip6_rr_prune = 5;       /* router renumbering prefix
                    271:                                 * walk list every 5 sec.    */
                    272: int    ip6_mcast_pmtu = 0;     /* enable pMTU discovery for multicast? */
                    273: const int ip6_v6only = 1;
                    274: u_int32_t ip6_id = 0UL;
                    275: int    ip6_keepfaith = 0;
                    276: time_t ip6_log_time = (time_t)0L;
                    277:
                    278: /* icmp6 */
                    279: /*
                    280:  * BSDI4 defines these variables in in_proto.c...
                    281:  * XXX: what if we don't define INET? Should we define pmtu6_expire
                    282:  * or so? (jinmei@kame.net 19990310)
                    283:  */
                    284: int pmtu_expire = 60*10;
                    285:
                    286: /* raw IP6 parameters */
                    287: /*
                    288:  * Nominal space allocated to a raw ip socket.
                    289:  */
                    290: #define        RIPV6SNDQ       8192
                    291: #define        RIPV6RCVQ       8192
                    292:
                    293: u_long rip6_sendspace = RIPV6SNDQ;
                    294: u_long rip6_recvspace = RIPV6RCVQ;
                    295:
                    296: /* ICMPV6 parameters */
                    297: int    icmp6_rediraccept = 1;          /* accept and process redirects */
                    298: int    icmp6_redirtimeout = 10 * 60;   /* 10 minutes */
                    299: struct timeval icmp6errratelim = { 0, 0 };     /* no ratelimit */
                    300: int    icmp6errppslim = 100;           /* 100pps */
                    301: int    icmp6_nodeinfo = 1;             /* enable/disable NI response */
                    302:
                    303: /* UDP on IP6 parameters */
                    304: int    udp6_sendspace = 9216;          /* really max datagram size */
                    305: int    udp6_recvspace = 40 * (1024 + sizeof(struct sockaddr_in6));
                    306:                                        /* 40 1K datagrams */

CVSweb