[BACK]Return to in6_proto.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / netinet6

Annotation of src/sys/netinet6/in6_proto.c, Revision 1.62

1.62    ! rpaulo      1: /*     $NetBSD: in6_proto.c,v 1.61 2005/12/11 12:25:02 christos Exp $  */
1.21      itojun      2: /*     $KAME: in6_proto.c,v 1.66 2000/10/10 15:35:47 itojun Exp $      */
1.3       thorpej     3:
1.2       itojun      4: /*
                      5:  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
                      6:  * All rights reserved.
1.18      itojun      7:  *
1.2       itojun      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.
1.18      itojun     19:  *
1.2       itojun     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.
1.49      agc        45:  * 3. Neither the name of the University nor the names of its contributors
1.2       itojun     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:  */
1.34      lukem      63:
                     64: #include <sys/cdefs.h>
1.62    ! rpaulo     65: __KERNEL_RCSID(0, "$NetBSD: in6_proto.c,v 1.61 2005/12/11 12:25:02 christos Exp $");
1.2       itojun     66:
                     67: #include "opt_inet.h"
1.4       thorpej    68: #include "opt_ipsec.h"
1.26      itojun     69: #include "opt_iso.h"
1.2       itojun     70:
                     71: #include <sys/param.h>
                     72: #include <sys/socket.h>
                     73: #include <sys/protosw.h>
                     74: #include <sys/kernel.h>
                     75: #include <sys/domain.h>
                     76: #include <sys/mbuf.h>
                     77:
                     78: #include <net/if.h>
                     79: #include <net/radix.h>
                     80: #include <net/route.h>
                     81:
                     82: #include <netinet/in.h>
                     83: #include <netinet/in_systm.h>
                     84: #include <netinet/in_var.h>
1.17      itojun     85: #include <netinet/ip_encap.h>
1.2       itojun     86: #include <netinet/ip.h>
                     87: #include <netinet/ip_var.h>
                     88: #include <netinet/in_pcb.h>
1.13      itojun     89: #include <netinet/ip6.h>
1.2       itojun     90: #include <netinet6/ip6_var.h>
1.13      itojun     91: #include <netinet/icmp6.h>
1.2       itojun     92: #include <netinet6/in6_pcb.h>
                     93:
                     94: #include <netinet/tcp.h>
                     95: #include <netinet/tcp_fsm.h>
                     96: #include <netinet/tcp_seq.h>
                     97: #include <netinet/tcp_timer.h>
                     98: #include <netinet/tcp_var.h>
                     99: #include <netinet/tcpip.h>
                    100: #include <netinet/tcp_debug.h>
                    101:
                    102: #include <netinet6/udp6.h>
                    103: #include <netinet6/udp6_var.h>
                    104:
                    105: #include <netinet6/pim6_var.h>
                    106:
                    107: #include <netinet6/nd6.h>
                    108:
                    109: #ifdef IPSEC
1.9       itojun    110: #include <netinet6/ipsec.h>
1.2       itojun    111: #include <netinet6/ah.h>
                    112: #ifdef IPSEC_ESP
                    113: #include <netinet6/esp.h>
                    114: #endif
                    115: #include <netinet6/ipcomp.h>
1.32      itojun    116: #endif /* IPSEC */
1.2       itojun    117:
                    118: #include <netinet6/ip6protosw.h>
                    119:
1.35      itojun    120: #include <net/net_osdep.h>
                    121:
1.47      thorpej   122: #ifndef offsetof               /* XXX */
1.2       itojun    123: #define        offsetof(type, member)  ((size_t)(&((type *)0)->member))
1.47      thorpej   124: #endif
1.2       itojun    125:
                    126: /*
                    127:  * TCP/IP protocol family: IP6, ICMP6, UDP, TCP.
                    128:  */
                    129:
1.58      matt      130: DOMAIN_DEFINE(inet6domain);    /* forward declare and add to link set */
1.2       itojun    131:
1.57      matt      132: const struct ip6protosw inet6sw[] = {
1.2       itojun    133: { 0,           &inet6domain,   IPPROTO_IPV6,   0,
                    134:   0,           0,              0,              0,
                    135:   0,
1.9       itojun    136:   ip6_init,    0,              frag6_slowtimo, frag6_drain,
1.56      atatat    137:   NULL,
1.2       itojun    138: },
1.60      gdt       139: { SOCK_DGRAM,  &inet6domain,   IPPROTO_UDP,    PR_ATOMIC|PR_ADDR|PR_PURGEIF,
1.2       itojun    140:   udp6_input,  0,              udp6_ctlinput,  ip6_ctloutput,
1.12      itojun    141:   udp6_usrreq, udp6_init,
1.9       itojun    142:   0,           0,              0,
1.56      atatat    143:   NULL,
1.2       itojun    144: },
1.60      gdt       145: { SOCK_STREAM, &inet6domain,   IPPROTO_TCP,    PR_CONNREQUIRED|PR_WANTRCVD|PR_LISTEN|PR_ABRTACPTDIS|PR_PURGEIF,
1.2       itojun    146:   tcp6_input,  0,              tcp6_ctlinput,  tcp_ctloutput,
                    147:   tcp_usrreq,
1.20      enami     148: #ifdef INET    /* don't call initialization and timeout routines twice */
1.51      itojun    149:   0,           0,              0,              0,
1.9       itojun    150: #else
1.52      itojun    151:   tcp_init,    0,              tcp_slowtimo,   tcp_drain,
1.9       itojun    152: #endif
1.56      atatat    153:   NULL,
1.2       itojun    154: },
1.60      gdt       155: { SOCK_RAW,    &inet6domain,   IPPROTO_RAW,    PR_ATOMIC|PR_ADDR|PR_PURGEIF,
1.16      itojun    156:   rip6_input,  rip6_output,    rip6_ctlinput,  rip6_ctloutput,
1.2       itojun    157:   rip6_usrreq,
1.9       itojun    158:   0,           0,              0,              0,
1.2       itojun    159: },
1.28      itojun    160: { SOCK_RAW,    &inet6domain,   IPPROTO_ICMPV6, PR_ATOMIC|PR_ADDR|PR_LASTHDR,
1.25      itojun    161:   icmp6_input, rip6_output,    rip6_ctlinput,  rip6_ctloutput,
1.2       itojun    162:   rip6_usrreq,
1.62    ! rpaulo    163:   icmp6_init,  0,              0,              0,
1.2       itojun    164: },
                    165: { SOCK_RAW,    &inet6domain,   IPPROTO_DSTOPTS,PR_ATOMIC|PR_ADDR,
                    166:   dest6_input, 0,              0,              0,
1.43      itojun    167:   0,
1.2       itojun    168:   0,           0,              0,              0,
                    169: },
                    170: { SOCK_RAW,    &inet6domain,   IPPROTO_ROUTING,PR_ATOMIC|PR_ADDR,
                    171:   route6_input,        0,              0,              0,
1.43      itojun    172:   0,
1.2       itojun    173:   0,           0,              0,              0,
                    174: },
                    175: { SOCK_RAW,    &inet6domain,   IPPROTO_FRAGMENT,PR_ATOMIC|PR_ADDR,
                    176:   frag6_input, 0,              0,              0,
1.43      itojun    177:   0,
1.2       itojun    178:   0,           0,              0,              0,
                    179: },
                    180: #ifdef IPSEC
                    181: { SOCK_RAW,    &inet6domain,   IPPROTO_AH,     PR_ATOMIC|PR_ADDR,
1.22      itojun    182:   ah6_input,   0,              ah6_ctlinput,   0,
1.43      itojun    183:   0,
1.9       itojun    184:   0,           0,              0,              0,
1.56      atatat    185:   NULL,
1.2       itojun    186: },
                    187: #ifdef IPSEC_ESP
                    188: { SOCK_RAW,    &inet6domain,   IPPROTO_ESP,    PR_ATOMIC|PR_ADDR,
1.22      itojun    189:   esp6_input,  0,              esp6_ctlinput,  0,
1.43      itojun    190:   0,
1.9       itojun    191:   0,           0,              0,              0,
1.56      atatat    192:   NULL,
1.2       itojun    193: },
                    194: #endif
                    195: { SOCK_RAW,    &inet6domain,   IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR,
                    196:   ipcomp6_input, 0,            0,              0,
1.43      itojun    197:   0,
1.9       itojun    198:   0,           0,              0,              0,
1.56      atatat    199:   NULL,
1.2       itojun    200: },
                    201: #endif /* IPSEC */
1.17      itojun    202: #ifdef INET
1.28      itojun    203: { SOCK_RAW,    &inet6domain,   IPPROTO_IPV4,   PR_ATOMIC|PR_ADDR|PR_LASTHDR,
1.38      itojun    204:   encap6_input,        rip6_output,    encap6_ctlinput, rip6_ctloutput,
1.17      itojun    205:   rip6_usrreq,
1.37      itojun    206:   encap_init,  0,              0,              0,
1.2       itojun    207: },
1.17      itojun    208: #endif
1.28      itojun    209: { SOCK_RAW,    &inet6domain,   IPPROTO_IPV6,   PR_ATOMIC|PR_ADDR|PR_LASTHDR,
1.38      itojun    210:   encap6_input, rip6_output,   encap6_ctlinput, rip6_ctloutput,
1.17      itojun    211:   rip6_usrreq,
                    212:   encap_init,  0,              0,              0,
1.2       itojun    213: },
1.26      itojun    214: #ifdef ISO
1.28      itojun    215: { SOCK_RAW,    &inet6domain,   IPPROTO_EON,    PR_ATOMIC|PR_ADDR|PR_LASTHDR,
1.38      itojun    216:   encap6_input,        rip6_output,    encap6_ctlinput, rip6_ctloutput,
1.27      itojun    217:   rip6_usrreq, /*XXX*/
1.37      itojun    218:   encap_init,  0,              0,              0,
1.26      itojun    219: },
                    220: #endif
1.28      itojun    221: { SOCK_RAW,     &inet6domain,  IPPROTO_PIM,    PR_ATOMIC|PR_ADDR|PR_LASTHDR,
1.42      itojun    222:   pim6_input,  rip6_output,    0,              rip6_ctloutput,
1.2       itojun    223:   rip6_usrreq,
                    224:   0,            0,              0,              0,
                    225: },
                    226: /* raw wildcard */
1.50      itojun    227: { SOCK_RAW,    &inet6domain,   0,              PR_ATOMIC|PR_ADDR|PR_LASTHDR,
1.2       itojun    228:   rip6_input,  rip6_output,    0,              rip6_ctloutput,
1.15      itojun    229:   rip6_usrreq,
                    230:   rip6_init,   0,              0,              0,
1.2       itojun    231: },
                    232: };
1.17      itojun    233:
1.2       itojun    234: struct domain inet6domain =
1.24      itojun    235:     { AF_INET6, "internet6", 0, 0, 0,
1.59      christos  236:       (const struct protosw *)inet6sw,
                    237:       (const struct protosw *)&inet6sw[sizeof(inet6sw)/sizeof(inet6sw[0])],
1.9       itojun    238:       rn_inithead,
                    239:       offsetof(struct sockaddr_in6, sin6_addr) << 3,
1.41      itojun    240:       sizeof(struct sockaddr_in6),
                    241:       in6_domifattach, in6_domifdetach, };
1.2       itojun    242:
                    243: /*
                    244:  * Internet configuration info
                    245:  */
                    246: #ifndef        IPV6FORWARDING
                    247: #ifdef GATEWAY6
                    248: #define        IPV6FORWARDING  1       /* forward IP6 packets not for us */
                    249: #else
                    250: #define        IPV6FORWARDING  0       /* don't forward IP6 packets not for us */
                    251: #endif /* GATEWAY6 */
                    252: #endif /* !IPV6FORWARDING */
                    253:
                    254: int    ip6_forwarding = IPV6FORWARDING;        /* act as router? */
1.48      itojun    255: int    ip6_sendredirects = 1;
1.2       itojun    256: int    ip6_defhlim = IPV6_DEFHLIM;
                    257: int    ip6_defmcasthlim = IPV6_DEFAULT_MULTICAST_HOPS;
                    258: int    ip6_accept_rtadv = 0;   /* "IPV6FORWARDING ? 0 : 1" is dangerous */
                    259: int    ip6_maxfragpackets = 200;
1.40      itojun    260: int    ip6_maxfrags = 200;
1.2       itojun    261: int    ip6_log_interval = 5;
                    262: int    ip6_hdrnestlimit = 50;  /* appropriate? */
                    263: int    ip6_dad_count = 1;      /* DupAddrDetectionTransmits */
                    264: int    ip6_auto_flowlabel = 1;
1.45      itojun    265: int    ip6_use_deprecated = 1; /* allow deprecated addr (RFC2462 5.5.4) */
1.9       itojun    266: int    ip6_rr_prune = 5;       /* router renumbering prefix
1.38      itojun    267:                                 * walk list every 5 sec. */
1.62    ! rpaulo    268: int    ip6_mcast_pmtu = 0;     /* enable pMTU discovery for multicast? */
1.55      briggs    269: int    ip6_v6only = 1;
1.11      itojun    270:
1.2       itojun    271: int    ip6_keepfaith = 0;
                    272: time_t ip6_log_time = (time_t)0L;
                    273:
                    274: /* icmp6 */
1.9       itojun    275: /*
                    276:  * BSDI4 defines these variables in in_proto.c...
                    277:  * XXX: what if we don't define INET? Should we define pmtu6_expire
                    278:  * or so? (jinmei@kame.net 19990310)
                    279:  */
1.2       itojun    280: int pmtu_expire = 60*10;
                    281:
                    282: /* raw IP6 parameters */
                    283: /*
                    284:  * Nominal space allocated to a raw ip socket.
                    285:  */
                    286: #define        RIPV6SNDQ       8192
                    287: #define        RIPV6RCVQ       8192
                    288:
                    289: u_long rip6_sendspace = RIPV6SNDQ;
                    290: u_long rip6_recvspace = RIPV6RCVQ;
                    291:
                    292: /* ICMPV6 parameters */
                    293: int    icmp6_rediraccept = 1;          /* accept and process redirects */
                    294: int    icmp6_redirtimeout = 10 * 60;   /* 10 minutes */
1.18      itojun    295: int    icmp6errppslim = 100;           /* 100pps */
1.10      itojun    296: int    icmp6_nodeinfo = 1;             /* enable/disable NI response */
1.2       itojun    297:
                    298: /* UDP on IP6 parameters */
                    299: int    udp6_sendspace = 9216;          /* really max datagram size */
                    300: int    udp6_recvspace = 40 * (1024 + sizeof(struct sockaddr_in6));
                    301:                                        /* 40 1K datagrams */

CVSweb <webmaster@jp.NetBSD.org>