root/netinet6/in6.h

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

INCLUDED FROM


    1 /*      $OpenBSD: in6.h,v 1.44 2007/01/22 06:12:18 miod Exp $   */
    2 /*      $KAME: in6.h,v 1.83 2001/03/29 02:55:07 jinmei 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, 1990, 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.h        8.3 (Berkeley) 1/3/94
   62  */
   63 
   64 #ifndef __KAME_NETINET_IN_H_INCLUDED_
   65 #error "do not include netinet6/in6.h directly, include netinet/in.h.  see RFC2553"
   66 #endif
   67 
   68 #ifndef _NETINET6_IN6_H_
   69 #define _NETINET6_IN6_H_
   70 
   71 /*
   72  * Identification of the network protocol stack
   73  * for *BSD-current/release: http://www.kame.net/dev/cvsweb2.cgi/kame/COVERAGE
   74  * has the table of implementation/integration differences.
   75  */
   76 #define __KAME__
   77 #define __KAME_VERSION          "OpenBSD-current"
   78 
   79 /*
   80  * Local port number conventions:
   81  *
   82  * Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root),
   83  * unless a kernel is compiled with IPNOPRIVPORTS defined.
   84  *
   85  * When a user does a bind(2) or connect(2) with a port number of zero,
   86  * a non-conflicting local port address is chosen.
   87  *
   88  * The default range is IPPORT_ANONMIN to IPPORT_ANONMAX, although
   89  * that is settable by sysctl(3); net.inet.ip.anonportmin and
   90  * net.inet.ip.anonportmax respectively.
   91  *
   92  * A user may set the IPPROTO_IP option IP_PORTRANGE to change this
   93  * default assignment range.
   94  *
   95  * The value IP_PORTRANGE_DEFAULT causes the default behavior.
   96  *
   97  * The value IP_PORTRANGE_HIGH is the same as IP_PORTRANGE_DEFAULT,
   98  * and exists only for FreeBSD compatibility purposes.
   99  *
  100  * The value IP_PORTRANGE_LOW changes the range to the "low" are
  101  * that is (by convention) restricted to privileged processes.
  102  * This convention is based on "vouchsafe" principles only.
  103  * It is only secure if you trust the remote host to restrict these ports.
  104  * The range is IPPORT_RESERVEDMIN to IPPORT_RESERVEDMAX.
  105  */
  106 
  107 #define IPV6PORT_RESERVED       1024
  108 #define IPV6PORT_ANONMIN        49152
  109 #define IPV6PORT_ANONMAX        65535
  110 #define IPV6PORT_RESERVEDMIN    600
  111 #define IPV6PORT_RESERVEDMAX    (IPV6PORT_RESERVED-1)
  112 
  113 /*
  114  * IPv6 address
  115  */
  116 struct in6_addr {
  117         union {
  118                 u_int8_t   __u6_addr8[16];
  119                 u_int16_t  __u6_addr16[8];
  120                 u_int32_t  __u6_addr32[4];
  121         } __u6_addr;                    /* 128-bit IP6 address */
  122 };
  123 
  124 #define s6_addr   __u6_addr.__u6_addr8
  125 #ifdef _KERNEL  /* XXX nonstandard */
  126 #define s6_addr8  __u6_addr.__u6_addr8
  127 #define s6_addr16 __u6_addr.__u6_addr16
  128 #define s6_addr32 __u6_addr.__u6_addr32
  129 #endif
  130 
  131 #define INET6_ADDRSTRLEN        46
  132 
  133 /*
  134  * Socket address for IPv6
  135  */
  136 #if __BSD_VISIBLE
  137 #define SIN6_LEN
  138 #endif
  139 struct sockaddr_in6 {
  140         u_int8_t        sin6_len;       /* length of this struct(sa_family_t)*/
  141         sa_family_t     sin6_family;    /* AF_INET6 (sa_family_t) */
  142         in_port_t       sin6_port;      /* Transport layer port # (in_port_t)*/
  143         u_int32_t       sin6_flowinfo;  /* IP6 flow information */
  144         struct in6_addr sin6_addr;      /* IP6 address */
  145         u_int32_t       sin6_scope_id;  /* intface scope id */
  146 };
  147 
  148 /*
  149  * Local definition for masks
  150  */
  151 #ifdef _KERNEL  /* XXX nonstandard */
  152 #define IN6MASK0        {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}}
  153 #define IN6MASK32       {{{ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, \
  154                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
  155 #define IN6MASK64       {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
  156                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
  157 #define IN6MASK96       {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
  158                             0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}}
  159 #define IN6MASK128      {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
  160                             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}}
  161 #endif
  162 
  163 #ifdef _KERNEL
  164 extern const struct sockaddr_in6 sa6_any;
  165 
  166 extern const struct in6_addr in6mask0;
  167 extern const struct in6_addr in6mask32;
  168 extern const struct in6_addr in6mask64;
  169 extern const struct in6_addr in6mask96;
  170 extern const struct in6_addr in6mask128;
  171 #endif /* _KERNEL */
  172 
  173 /*
  174  * Macros started with IPV6_ADDR is KAME local
  175  */
  176 #ifdef _KERNEL  /* XXX nonstandard */
  177 #if BYTE_ORDER == BIG_ENDIAN
  178 #define IPV6_ADDR_INT32_ONE     1
  179 #define IPV6_ADDR_INT32_TWO     2
  180 #define IPV6_ADDR_INT32_MNL     0xff010000
  181 #define IPV6_ADDR_INT32_MLL     0xff020000
  182 #define IPV6_ADDR_INT32_SMP     0x0000ffff
  183 #define IPV6_ADDR_INT16_ULL     0xfe80
  184 #define IPV6_ADDR_INT16_USL     0xfec0
  185 #define IPV6_ADDR_INT16_MLL     0xff02
  186 #elif BYTE_ORDER == LITTLE_ENDIAN
  187 #define IPV6_ADDR_INT32_ONE     0x01000000
  188 #define IPV6_ADDR_INT32_TWO     0x02000000
  189 #define IPV6_ADDR_INT32_MNL     0x000001ff
  190 #define IPV6_ADDR_INT32_MLL     0x000002ff
  191 #define IPV6_ADDR_INT32_SMP     0xffff0000
  192 #define IPV6_ADDR_INT16_ULL     0x80fe
  193 #define IPV6_ADDR_INT16_USL     0xc0fe
  194 #define IPV6_ADDR_INT16_MLL     0x02ff
  195 #endif
  196 #endif
  197 
  198 /*
  199  * Definition of some useful macros to handle IP6 addresses
  200  */
  201 #if __BSD_VISIBLE
  202 #define IN6ADDR_ANY_INIT \
  203         {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  204             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
  205 #define IN6ADDR_LOOPBACK_INIT \
  206         {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  207             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
  208 #define IN6ADDR_NODELOCAL_ALLNODES_INIT \
  209         {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  210             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
  211 #define IN6ADDR_INTFACELOCAL_ALLNODES_INIT \
  212         {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  213             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
  214 #define IN6ADDR_LINKLOCAL_ALLNODES_INIT \
  215         {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  216             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
  217 #define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \
  218         {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
  219             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}}
  220 #endif
  221 
  222 extern const struct in6_addr in6addr_any;
  223 extern const struct in6_addr in6addr_loopback;
  224 #if __BSD_VISIBLE
  225 extern const struct in6_addr in6addr_intfacelocal_allnodes;
  226 extern const struct in6_addr in6addr_linklocal_allnodes;
  227 extern const struct in6_addr in6addr_linklocal_allrouters;
  228 #endif
  229 
  230 /*
  231  * Equality
  232  * NOTE: Some of kernel programming environment (for example, openbsd/sparc)
  233  * does not supply memcmp().  For userland memcmp() is preferred as it is
  234  * in ANSI standard.
  235  */
  236 #ifdef _KERNEL
  237 #define IN6_ARE_ADDR_EQUAL(a, b)                        \
  238     (bcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
  239 #else
  240 #if __BSD_VISIBLE
  241 #define IN6_ARE_ADDR_EQUAL(a, b)                        \
  242     (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
  243 #endif
  244 #endif
  245 
  246 /*
  247  * Unspecified
  248  */
  249 #define IN6_IS_ADDR_UNSPECIFIED(a)      \
  250         ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
  251          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
  252          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
  253          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == 0))
  254 
  255 /*
  256  * Loopback
  257  */
  258 #define IN6_IS_ADDR_LOOPBACK(a)         \
  259         ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
  260          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
  261          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
  262          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == ntohl(1)))
  263 
  264 /*
  265  * IPv4 compatible
  266  */
  267 #define IN6_IS_ADDR_V4COMPAT(a)         \
  268         ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
  269          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
  270          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
  271          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != 0) &&        \
  272          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != ntohl(1)))
  273 
  274 /*
  275  * Mapped
  276  */
  277 #define IN6_IS_ADDR_V4MAPPED(a)               \
  278         ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
  279          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
  280          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff)))
  281 
  282 /*
  283  * KAME Scope Values
  284  */
  285 
  286 #ifdef _KERNEL  /* XXX nonstandard */
  287 #define IPV6_ADDR_SCOPE_NODELOCAL       0x01
  288 #define IPV6_ADDR_SCOPE_INTFACELOCAL    0x01
  289 #define IPV6_ADDR_SCOPE_LINKLOCAL       0x02
  290 #define IPV6_ADDR_SCOPE_SITELOCAL       0x05
  291 #define IPV6_ADDR_SCOPE_ORGLOCAL        0x08    /* just used in this file */
  292 #define IPV6_ADDR_SCOPE_GLOBAL          0x0e
  293 #else
  294 #define __IPV6_ADDR_SCOPE_NODELOCAL     0x01
  295 #define __IPV6_ADDR_SCOPE_INTFACELOCAL  0x01
  296 #define __IPV6_ADDR_SCOPE_LINKLOCAL     0x02
  297 #define __IPV6_ADDR_SCOPE_SITELOCAL     0x05
  298 #define __IPV6_ADDR_SCOPE_ORGLOCAL      0x08    /* just used in this file */
  299 #define __IPV6_ADDR_SCOPE_GLOBAL        0x0e
  300 #endif
  301 
  302 /*
  303  * Unicast Scope
  304  * Note that we must check topmost 10 bits only, not 16 bits (see RFC2373).
  305  */
  306 #define IN6_IS_ADDR_LINKLOCAL(a)        \
  307         (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
  308 #define IN6_IS_ADDR_SITELOCAL(a)        \
  309         (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
  310 
  311 /*
  312  * Multicast
  313  */
  314 #define IN6_IS_ADDR_MULTICAST(a)        ((a)->s6_addr[0] == 0xff)
  315 
  316 #ifdef _KERNEL  /* XXX nonstandard */
  317 #define IPV6_ADDR_MC_SCOPE(a)           ((a)->s6_addr[1] & 0x0f)
  318 #else
  319 #define __IPV6_ADDR_MC_SCOPE(a)         ((a)->s6_addr[1] & 0x0f)
  320 #endif
  321 
  322 /*
  323  * Multicast Scope
  324  */
  325 #ifdef _KERNEL  /* refers nonstandard items */
  326 #define IN6_IS_ADDR_MC_NODELOCAL(a)     \
  327         (IN6_IS_ADDR_MULTICAST(a) &&    \
  328          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL))
  329 #define IN6_IS_ADDR_MC_INTFACELOCAL(a)  \
  330         (IN6_IS_ADDR_MULTICAST(a) &&    \
  331          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_INTFACELOCAL))
  332 #define IN6_IS_ADDR_MC_LINKLOCAL(a)     \
  333         (IN6_IS_ADDR_MULTICAST(a) &&    \
  334          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL))
  335 #define IN6_IS_ADDR_MC_SITELOCAL(a)     \
  336         (IN6_IS_ADDR_MULTICAST(a) &&    \
  337          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL))
  338 #define IN6_IS_ADDR_MC_ORGLOCAL(a)      \
  339         (IN6_IS_ADDR_MULTICAST(a) &&    \
  340          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL))
  341 #define IN6_IS_ADDR_MC_GLOBAL(a)        \
  342         (IN6_IS_ADDR_MULTICAST(a) &&    \
  343          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL))
  344 #else
  345 #define IN6_IS_ADDR_MC_NODELOCAL(a)     \
  346         (IN6_IS_ADDR_MULTICAST(a) &&    \
  347          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL))
  348 #define IN6_IS_ADDR_MC_INTFACELOCAL(a)  \
  349         (IN6_IS_ADDR_MULTICAST(a) &&    \
  350          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_INTFACELOCAL))
  351 #define IN6_IS_ADDR_MC_LINKLOCAL(a)     \
  352         (IN6_IS_ADDR_MULTICAST(a) &&    \
  353          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL))
  354 #define IN6_IS_ADDR_MC_SITELOCAL(a)     \
  355         (IN6_IS_ADDR_MULTICAST(a) &&    \
  356          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL))
  357 #define IN6_IS_ADDR_MC_ORGLOCAL(a)      \
  358         (IN6_IS_ADDR_MULTICAST(a) &&    \
  359          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL))
  360 #define IN6_IS_ADDR_MC_GLOBAL(a)        \
  361         (IN6_IS_ADDR_MULTICAST(a) &&    \
  362          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL))
  363 #endif
  364 
  365 #ifdef _KERNEL  /* nonstandard */
  366 /*
  367  * KAME Scope
  368  */
  369 #define IN6_IS_SCOPE_LINKLOCAL(a)       \
  370         ((IN6_IS_ADDR_LINKLOCAL(a)) ||  \
  371          (IN6_IS_ADDR_MC_LINKLOCAL(a)))
  372 #define IN6_IS_SCOPE_EMBED(a)   \
  373         ((IN6_IS_ADDR_LINKLOCAL(a)) ||  \
  374          (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \
  375          (IN6_IS_ADDR_MC_INTFACELOCAL(a)))
  376 
  377 #define IFA6_IS_DEPRECATED(a) \
  378         ((a)->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME && \
  379          (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
  380          (a)->ia6_lifetime.ia6t_pltime)
  381 #define IFA6_IS_INVALID(a) \
  382         ((a)->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME && \
  383          (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
  384          (a)->ia6_lifetime.ia6t_vltime)
  385 #endif
  386 
  387 /*
  388  * IP6 route structure
  389  */
  390 #if __BSD_VISIBLE
  391 struct route_in6 {
  392         struct  rtentry *ro_rt;
  393         struct  sockaddr_in6 ro_dst;
  394 };
  395 #endif
  396 
  397 /*
  398  * Options for use with [gs]etsockopt at the IPV6 level.
  399  * First word of comment is data type; bool is stored in int.
  400  */
  401 #define IPV6_OPTIONS            1  /* buf/ip6_opts; set/get IP6 options */
  402 /* no hdrincl */
  403 #define IPV6_SOCKOPT_RESERVED1  3  /* reserved for future use */
  404 #define IPV6_UNICAST_HOPS       4  /* int; IP6 hops */
  405 #if 0 /* the followings are relic in IPv4 and hence are disabled */
  406 #define IPV6_RECVOPTS           5  /* bool; receive all IP6 opts w/dgram */
  407 #define IPV6_RECVRETOPTS        6  /* bool; receive IP6 opts for response */
  408 #define IPV6_RECVDSTADDR        7  /* bool; receive IP6 dst addr w/dgram */
  409 #define IPV6_RETOPTS            8  /* ip6_opts; set/get IP6 options */
  410 #endif
  411 #define IPV6_MULTICAST_IF       9  /* u_char; set/get IP6 multicast i/f */
  412 #define IPV6_MULTICAST_HOPS     10 /* u_char; set/get IP6 multicast hops */
  413 #define IPV6_MULTICAST_LOOP     11 /* u_char; set/get IP6 multicast loopback */
  414 #define IPV6_JOIN_GROUP         12 /* ip6_mreq; join a group membership */
  415 #define IPV6_LEAVE_GROUP        13 /* ip6_mreq; leave a group membership */
  416 #define IPV6_PORTRANGE          14 /* int; range to choose for unspec port */
  417 #define ICMP6_FILTER            18 /* icmp6_filter; icmp6 filter */
  418 
  419 /* RFC2292 options */
  420 #ifdef _KERNEL
  421 #define IPV6_2292PKTINFO        19 /* bool; send/rcv if, src/dst addr */
  422 #define IPV6_2292HOPLIMIT       20 /* bool; hop limit */
  423 #define IPV6_2292NEXTHOP        21 /* bool; next hop addr */
  424 #define IPV6_2292HOPOPTS        22 /* bool; hop-by-hop option */
  425 #define IPV6_2292DSTOPTS        23 /* bool; destination option */
  426 #define IPV6_2292RTHDR          24 /* bool; routing header */
  427 #define IPV6_2292PKTOPTIONS     25 /* buf/cmsghdr; set/get IPv6 options */
  428 #endif
  429 
  430 #define IPV6_CHECKSUM           26 /* int; checksum offset for raw socket */
  431 #define IPV6_V6ONLY             27 /* bool; make AF_INET6 sockets v6 only */
  432 
  433 #if 0 /*KAME IPSEC*/
  434 #define IPV6_IPSEC_POLICY       28 /* struct; get/set security policy */
  435 #endif
  436 #define IPV6_FAITH              29 /* bool; accept FAITH'ed connections */
  437 
  438 /* 30-34: reserved */
  439 
  440 /* new socket options introduced in RFC3542 */
  441 #define IPV6_RTHDRDSTOPTS       35 /* ip6_dest; send dst option before rthdr */
  442 
  443 #define IPV6_RECVPKTINFO        36 /* bool; recv if, dst addr */
  444 #define IPV6_RECVHOPLIMIT       37 /* bool; recv hop limit */
  445 #define IPV6_RECVRTHDR          38 /* bool; recv routing header */
  446 #define IPV6_RECVHOPOPTS        39 /* bool; recv hop-by-hop option */
  447 #define IPV6_RECVDSTOPTS        40 /* bool; recv dst option after rthdr */
  448 #ifdef _KERNEL
  449 #define IPV6_RECVRTHDRDSTOPTS   41 /* bool; recv dst option before rthdr */
  450 #endif
  451 
  452 #define IPV6_USE_MIN_MTU        42 /* bool; send packets at the minimum MTU */
  453 #define IPV6_RECVPATHMTU        43 /* bool; notify an according MTU */
  454 
  455 #define IPV6_PATHMTU            44 /* mtuinfo; get the current path MTU (sopt),
  456                                       4 bytes int; MTU notification (cmsg) */
  457 
  458 /* 45: reserved */
  459 
  460 /* more new socket options introduced in RFC3542 */
  461 #define IPV6_PKTINFO            46 /* in6_pktinfo; send if, src addr */
  462 #define IPV6_HOPLIMIT           47 /* int; send hop limit */
  463 #define IPV6_NEXTHOP            48 /* sockaddr; next hop addr */
  464 #define IPV6_HOPOPTS            49 /* ip6_hbh; send hop-by-hop option */
  465 #define IPV6_DSTOPTS            50 /* ip6_dest; send dst option befor rthdr */
  466 #define IPV6_RTHDR              51 /* ip6_rthdr; send routing header */
  467 
  468 /* 52: reserved */
  469 #define IPV6_AUTH_LEVEL         53   /* int; authentication used */
  470 #define IPV6_ESP_TRANS_LEVEL    54   /* int; transport encryption */
  471 #define IPV6_ESP_NETWORK_LEVEL  55   /* int; full-packet encryption */
  472 #define IPSEC6_OUTSA            56   /* set the outbound SA for a socket */
  473 #define IPV6_RECVTCLASS         57   /* bool; recv traffic class values */
  474 /* 58: reserved */
  475 #define IPV6_AUTOFLOWLABEL      59   /* bool; attach flowlabel automagically */
  476 #define IPV6_IPCOMP_LEVEL       60   /* int; compression */
  477 
  478 #define IPV6_TCLASS             61   /* int; send traffic class value */
  479 #define IPV6_DONTFRAG           62   /* bool; disable IPv6 fragmentation */
  480 
  481 /* to define items, should talk with KAME guys first, for *BSD compatibility */
  482 
  483 #define IPV6_RTHDR_LOOSE     0 /* this hop need not be a neighbor. XXX old spec */
  484 #define IPV6_RTHDR_STRICT    1 /* this hop must be a neighbor. XXX old spec */
  485 #define IPV6_RTHDR_TYPE_0    0 /* IPv6 routing header type 0 */
  486 
  487 /*
  488  * Defaults and limits for options
  489  */
  490 #define IPV6_DEFAULT_MULTICAST_HOPS 1   /* normally limit m'casts to 1 hop */
  491 #define IPV6_DEFAULT_MULTICAST_LOOP 1   /* normally hear sends if a member */
  492 
  493 /*
  494  * Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP.
  495  */
  496 struct ipv6_mreq {
  497         struct in6_addr ipv6mr_multiaddr;
  498         unsigned int    ipv6mr_interface;
  499 };
  500 
  501 /*
  502  * IPV6_PKTINFO: Packet information(RFC2292 sec 5)
  503  */
  504 struct in6_pktinfo {
  505         struct in6_addr ipi6_addr;      /* src/dst IPv6 address */
  506         unsigned int    ipi6_ifindex;   /* send/recv interface index */
  507 };
  508 
  509 /*
  510  * Control structure for IPV6_RECVPATHMTU socket option.
  511  */
  512 struct ip6_mtuinfo {
  513         struct sockaddr_in6 ip6m_addr;  /* or sockaddr_storage? */
  514         u_int32_t ip6m_mtu;
  515 };
  516 
  517 /*
  518  * Argument for IPV6_PORTRANGE:
  519  * - which range to search when port is unspecified at bind() or connect()
  520  */
  521 #define IPV6_PORTRANGE_DEFAULT  0       /* default range */
  522 #define IPV6_PORTRANGE_HIGH     1       /* "high" - request firewall bypass */
  523 #define IPV6_PORTRANGE_LOW      2       /* "low" - vouchsafe security */
  524 
  525 #if __BSD_VISIBLE
  526 /*
  527  * Definitions for inet6 sysctl operations.
  528  *
  529  * Third level is protocol number.
  530  * Fourth level is desired variable within that protocol.
  531  */
  532 #define IPV6PROTO_MAXID (IPPROTO_PIM + 1)       /* don't list to IPV6PROTO_MAX */
  533 
  534 #define CTL_IPV6PROTO_NAMES { \
  535         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  536         { 0, 0 }, \
  537         { "tcp6", CTLTYPE_NODE }, \
  538         { 0, 0 }, \
  539         { 0, 0 }, \
  540         { 0, 0 }, \
  541         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  542         { 0, 0 }, \
  543         { 0, 0 }, \
  544         { "udp6", CTLTYPE_NODE }, \
  545         { 0, 0 }, \
  546         { 0, 0 }, \
  547         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  548         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  549         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  550         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  551         { 0, 0 }, \
  552         { "ip6", CTLTYPE_NODE }, \
  553         { 0, 0 }, \
  554         { 0, 0 }, \
  555         { 0, 0 }, \
  556         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  557         { 0, 0 }, \
  558         { "ipsec6", CTLTYPE_NODE }, \
  559         { 0, 0 }, \
  560         { 0, 0 }, \
  561         { 0, 0 }, \
  562         { 0, 0 }, \
  563         { 0, 0 }, \
  564         { 0, 0 }, \
  565         { "icmp6", CTLTYPE_NODE }, \
  566         { 0, 0 }, \
  567         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  568         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  569         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  570         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  571         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  572         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  573         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  574         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  575         { 0, 0 }, \
  576         { 0, 0 }, \
  577         { 0, 0 }, \
  578         { "pim6", CTLTYPE_NODE }, \
  579 }
  580 
  581 /*
  582  * Names for IP sysctl objects
  583  */
  584 #define IPV6CTL_FORWARDING      1       /* act as router */
  585 #define IPV6CTL_SENDREDIRECTS   2       /* may send redirects when forwarding*/
  586 #define IPV6CTL_DEFHLIM         3       /* default Hop-Limit */
  587 #ifdef notyet
  588 #define IPV6CTL_DEFMTU          4       /* default MTU */
  589 #endif
  590 #define IPV6CTL_FORWSRCRT       5       /* forward source-routed dgrams */
  591 #define IPV6CTL_STATS           6       /* stats */
  592 #define IPV6CTL_MRTSTATS        7       /* multicast forwarding stats */
  593 #define IPV6CTL_MRTPROTO        8       /* multicast routing protocol */
  594 #define IPV6CTL_MAXFRAGPACKETS  9       /* max packets reassembly queue */
  595 #define IPV6CTL_SOURCECHECK     10      /* verify source route and intf */
  596 #define IPV6CTL_SOURCECHECK_LOGINT 11   /* minimume logging interval */
  597 #define IPV6CTL_ACCEPT_RTADV    12
  598 #define IPV6CTL_KEEPFAITH       13
  599 #define IPV6CTL_LOG_INTERVAL    14
  600 #define IPV6CTL_HDRNESTLIMIT    15
  601 #define IPV6CTL_DAD_COUNT       16
  602 #define IPV6CTL_AUTO_FLOWLABEL  17
  603 #define IPV6CTL_DEFMCASTHLIM    18
  604 #ifdef notdef   /* obsolete */
  605 #define IPV6CTL_GIF_HLIM        19      /* default HLIM for gif encap packet */
  606 #endif
  607 #define IPV6CTL_KAME_VERSION    20
  608 #define IPV6CTL_USE_DEPRECATED  21      /* use deprecated addr (RFC2462 5.5.4) */
  609 #define IPV6CTL_RR_PRUNE        22      /* walk timer for router renumbering */
  610 /*#define IPV6CTL_MAPPED_ADDR   23      not for openbsd */
  611 #define IPV6CTL_V6ONLY          24
  612 /* 25 to 40: resrved */
  613 #define IPV6CTL_MAXFRAGS        41      /* max fragments */
  614 #define IPV6CTL_MFORWARDING     42
  615 #define IPV6CTL_MULTIPATH       43
  616 #define IPV6CTL_MCAST_PMTU      44      /* path MTU discovery for multicast */
  617 #define IPV6CTL_MAXID           45
  618 /* New entries should be added here from current IPV6CTL_MAXID value. */
  619 /* to define items, should talk with KAME guys first, for *BSD compatibility */
  620 
  621 #define IPV6CTL_NAMES { \
  622         { 0, 0 }, \
  623         { "forwarding", CTLTYPE_INT }, \
  624         { "redirect", CTLTYPE_INT }, \
  625         { "hlim", CTLTYPE_INT }, \
  626         { "mtu", CTLTYPE_INT }, \
  627         { "forwsrcrt", CTLTYPE_INT }, \
  628         { 0, 0 }, \
  629         { 0, 0 }, \
  630         { "mrtproto", CTLTYPE_INT }, \
  631         { "maxfragpackets", CTLTYPE_INT }, \
  632         { "sourcecheck", CTLTYPE_INT }, \
  633         { "sourcecheck_logint", CTLTYPE_INT }, \
  634         { "accept_rtadv", CTLTYPE_INT }, \
  635         { "keepfaith", CTLTYPE_INT }, \
  636         { "log_interval", CTLTYPE_INT }, \
  637         { "hdrnestlimit", CTLTYPE_INT }, \
  638         { "dad_count", CTLTYPE_INT }, \
  639         { "auto_flowlabel", CTLTYPE_INT }, \
  640         { "defmcasthlim", CTLTYPE_INT }, \
  641         { 0, 0 }, \
  642         { "kame_version", CTLTYPE_STRING }, \
  643         { "use_deprecated", CTLTYPE_INT }, \
  644         { "rr_prune", CTLTYPE_INT }, \
  645         { 0, 0 }, \
  646         { "v6only", CTLTYPE_INT }, \
  647         { 0, 0 }, \
  648         { 0, 0 }, \
  649         { 0, 0 }, \
  650         { 0, 0 }, \
  651         { 0, 0 }, \
  652         { 0, 0 }, \
  653         { 0, 0 }, \
  654         { 0, 0 }, \
  655         { 0, 0 }, \
  656         { 0, 0 }, \
  657         { 0, 0 }, \
  658         { 0, 0 }, \
  659         { 0, 0 }, \
  660         { 0, 0 }, \
  661         { 0, 0 }, \
  662         { 0, 0 }, \
  663         { "maxfrags", CTLTYPE_INT }, \
  664         { "mforwarding", CTLTYPE_INT }, \
  665         { "multipath", CTLTYPE_INT }, \
  666         { "multicast_mtudisc", CTLTYPE_INT }, \
  667 }
  668 
  669 #define IPV6CTL_VARS { \
  670         NULL, \
  671         &ip6_forwarding, \
  672         &ip6_sendredirects, \
  673         &ip6_defhlim, \
  674         NULL, \
  675         NULL, \
  676         NULL, \
  677         NULL, \
  678         NULL, \
  679         &ip6_maxfragpackets, \
  680         NULL, \
  681         NULL, \
  682         &ip6_accept_rtadv, \
  683         &ip6_keepfaith, \
  684         &ip6_log_interval, \
  685         &ip6_hdrnestlimit, \
  686         &ip6_dad_count, \
  687         &ip6_auto_flowlabel, \
  688         &ip6_defmcasthlim, \
  689         NULL, \
  690         NULL, \
  691         &ip6_use_deprecated, \
  692         &ip6_rr_prune, \
  693         NULL, \
  694         NULL, \
  695         NULL, \
  696         NULL, \
  697         NULL, \
  698         NULL, \
  699         NULL, \
  700         NULL, \
  701         NULL, \
  702         NULL, \
  703         NULL, \
  704         NULL, \
  705         NULL, \
  706         NULL, \
  707         NULL, \
  708         NULL, \
  709         NULL, \
  710         NULL, \
  711         &ip6_maxfrags, \
  712         &ip6_mforwarding, \
  713         &ip6_multipath, \
  714         &ip6_mcast_pmtu, \
  715 }
  716 
  717 #endif /* __BSD_VISIBLE */
  718 
  719 #ifdef _KERNEL
  720 struct cmsghdr;
  721 
  722 int     in6_cksum(struct mbuf *, u_int8_t, u_int32_t, u_int32_t);
  723 int     in6_localaddr(struct in6_addr *);
  724 int     in6_addrscope(struct in6_addr *);
  725 struct  in6_ifaddr *in6_ifawithscope(struct ifnet *, struct in6_addr *);
  726 struct  in6_ifaddr *in6_ifawithifp(struct ifnet *, struct in6_addr *);
  727 extern void in6_if_up(struct ifnet *);
  728 
  729 #define satosin6(sa)    ((struct sockaddr_in6 *)(sa))
  730 #define sin6tosa(sin6)  ((struct sockaddr *)(sin6))
  731 #define ifatoia6(ifa)   ((struct in6_ifaddr *)(ifa))
  732 #endif /* _KERNEL */
  733 
  734 __BEGIN_DECLS
  735 struct cmsghdr;
  736 
  737 extern int inet6_option_space(int);
  738 extern int inet6_option_init(void *, struct cmsghdr **, int);
  739 extern int inet6_option_append(struct cmsghdr *, const u_int8_t *,
  740         int, int);
  741 extern u_int8_t *inet6_option_alloc(struct cmsghdr *, int, int, int);
  742 extern int inet6_option_next(const struct cmsghdr *, u_int8_t **);
  743 extern int inet6_option_find(const struct cmsghdr *, u_int8_t **, int);
  744 
  745 extern size_t inet6_rthdr_space(int, int);
  746 extern struct cmsghdr *inet6_rthdr_init(void *, int);
  747 extern int inet6_rthdr_add(struct cmsghdr *, const struct in6_addr *,
  748                 unsigned int);
  749 extern int inet6_rthdr_lasthop(struct cmsghdr *, unsigned int);
  750 #if 0 /* not implemented yet */
  751 extern int inet6_rthdr_reverse(const struct cmsghdr *, struct cmsghdr *);
  752 #endif
  753 extern int inet6_rthdr_segments(const struct cmsghdr *);
  754 extern struct in6_addr *inet6_rthdr_getaddr(struct cmsghdr *, int);
  755 extern int inet6_rthdr_getflags(const struct cmsghdr *, int);
  756 
  757 extern int inet6_opt_init(void *, socklen_t);
  758 extern int inet6_opt_append(void *, socklen_t, int, u_int8_t,
  759                 socklen_t, u_int8_t, void **);
  760 extern int inet6_opt_finish(void *, socklen_t, int);
  761 extern int inet6_opt_set_val(void *, int, void *, socklen_t);
  762 
  763 extern int inet6_opt_next(void *, socklen_t, int, u_int8_t *,
  764                 socklen_t *, void **);
  765 extern int inet6_opt_find(void *, socklen_t, int, u_int8_t,
  766                 socklen_t *, void **);
  767 extern int inet6_opt_get_val(void *, int, void *, socklen_t);
  768 
  769 extern socklen_t inet6_rth_space(int, int);
  770 extern void *inet6_rth_init(void *, socklen_t, int, int);
  771 extern int inet6_rth_add(void *, const struct in6_addr *);
  772 extern int inet6_rth_reverse(const void *, void *);
  773 extern int inet6_rth_segments(const void *);
  774 extern struct in6_addr *inet6_rth_getaddr(const void *, int);
  775 __END_DECLS
  776 
  777 #endif /* !_NETINET6_IN6_H_ */

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