gonzui


Format: Advanced Search

t2ex/bsd_source/lib/libc/src_bsd/include/netinet6/in6.hbare sourcepermlink (0.09 seconds)

Search this content:

    1: /*      $OpenBSD: in6.h,v 1.55 2011/11/24 17:39:55 sperreault 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: #endif
  228: 
  229: /*
  230:  * Equality
  231:  * NOTE: Some of kernel programming environment (for example, OpenBSD/sparc)
  232:  * does not supply memcmp().  For userland memcmp() is preferred as it is
  233:  * in ANSI standard.
  234:  */
  235: #ifdef _KERNEL
  236: #define IN6_ARE_ADDR_EQUAL(a, b)                        \
  237:     (bcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
  238: #else
  239: #if __BSD_VISIBLE
  240: #define IN6_ARE_ADDR_EQUAL(a, b)                        \
  241:     (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
  242: #endif
  243: #endif
  244: 
  245: /*
  246:  * Unspecified
  247:  */
  248: #define IN6_IS_ADDR_UNSPECIFIED(a)      \
  249:         ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) &&        \
  250:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) &&        \
  251:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) &&        \
  252:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == 0))
  253: 
  254: /*
  255:  * Loopback
  256:  */
  257: #define IN6_IS_ADDR_LOOPBACK(a)         \
  258:         ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) &&        \
  259:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) &&        \
  260:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) &&        \
  261:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == ntohl(1)))
  262: 
  263: /*
  264:  * IPv4 compatible
  265:  */
  266: #define IN6_IS_ADDR_V4COMPAT(a)         \
  267:         ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) &&        \
  268:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) &&        \
  269:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) &&        \
  270:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != 0) &&       \
  271:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != ntohl(1)))
  272: 
  273: /*
  274:  * Mapped
  275:  */
  276: #define IN6_IS_ADDR_V4MAPPED(a)               \
  277:         ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) &&        \
  278:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) &&        \
  279:          (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff)))
  280: 
  281: /*
  282:  * KAME Scope Values
  283:  */
  284: 
  285: #ifdef _KERNEL  /* XXX nonstandard */
  286: #define IPV6_ADDR_SCOPE_NODELOCAL       0x01
  287: #define IPV6_ADDR_SCOPE_INTFACELOCAL    0x01
  288: #define IPV6_ADDR_SCOPE_LINKLOCAL       0x02
  289: #define IPV6_ADDR_SCOPE_SITELOCAL       0x05
  290: #define IPV6_ADDR_SCOPE_ORGLOCAL        0x08   /* just used in this file */
  291: #define IPV6_ADDR_SCOPE_GLOBAL          0x0e
  292: #else
  293: #define __IPV6_ADDR_SCOPE_NODELOCAL     0x01
  294: #define __IPV6_ADDR_SCOPE_INTFACELOCAL  0x01
  295: #define __IPV6_ADDR_SCOPE_LINKLOCAL     0x02
  296: #define __IPV6_ADDR_SCOPE_SITELOCAL     0x05
  297: #define __IPV6_ADDR_SCOPE_ORGLOCAL      0x08 /* just used in this file */
  298: #define __IPV6_ADDR_SCOPE_GLOBAL        0x0e
  299: #endif
  300: 
  301: /*
  302:  * Unicast Scope
  303:  * Note that we must check topmost 10 bits only, not 16 bits (see RFC2373).
  304:  */
  305: #define IN6_IS_ADDR_LINKLOCAL(a)        \
  306:         (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
  307: #define IN6_IS_ADDR_SITELOCAL(a)        \
  308:         (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
  309: 
  310: /*
  311:  * Multicast
  312:  */
  313: #define IN6_IS_ADDR_MULTICAST(a)        ((a)->s6_addr[0] == 0xff)
  314: 
  315: #ifdef _KERNEL  /* XXX nonstandard */
  316: #define IPV6_ADDR_MC_SCOPE(a)           ((a)->s6_addr[1] & 0x0f)
  317: #else
  318: #define __IPV6_ADDR_MC_SCOPE(a)         ((a)->s6_addr[1] & 0x0f)
  319: #endif
  320: 
  321: /*
  322:  * Multicast Scope
  323:  */
  324: #ifdef _KERNEL  /* refers nonstandard items */
  325: #define IN6_IS_ADDR_MC_NODELOCAL(a)     \
  326:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  327:          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL))
  328: #define IN6_IS_ADDR_MC_INTFACELOCAL(a)  \
  329:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  330:          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_INTFACELOCAL))
  331: #define IN6_IS_ADDR_MC_LINKLOCAL(a)     \
  332:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  333:          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL))
  334: #define IN6_IS_ADDR_MC_SITELOCAL(a)     \
  335:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  336:          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL))
  337: #define IN6_IS_ADDR_MC_ORGLOCAL(a)      \
  338:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  339:          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL))
  340: #define IN6_IS_ADDR_MC_GLOBAL(a)        \
  341:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  342:          (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL))
  343: #else
  344: #define IN6_IS_ADDR_MC_NODELOCAL(a)     \
  345:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  346:          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL))
  347: #define IN6_IS_ADDR_MC_INTFACELOCAL(a)  \
  348:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  349:          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_INTFACELOCAL))
  350: #define IN6_IS_ADDR_MC_LINKLOCAL(a)     \
  351:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  352:          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL))
  353: #define IN6_IS_ADDR_MC_SITELOCAL(a)     \
  354:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  355:          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL))
  356: #define IN6_IS_ADDR_MC_ORGLOCAL(a)      \
  357:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  358:          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL))
  359: #define IN6_IS_ADDR_MC_GLOBAL(a)        \
  360:         (IN6_IS_ADDR_MULTICAST(a) &&   \
  361:          (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL))
  362: #endif
  363: 
  364: #ifdef _KERNEL  /* nonstandard */
  365: /*
  366:  * KAME Scope
  367:  */
  368: #define IN6_IS_SCOPE_LINKLOCAL(a)       \
  369:         ((IN6_IS_ADDR_LINKLOCAL(a)) || \
  370:          (IN6_IS_ADDR_MC_LINKLOCAL(a)))
  371: #define IN6_IS_SCOPE_EMBED(a)   \
  372:         ((IN6_IS_ADDR_LINKLOCAL(a)) || \
  373:          (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \
  374:          (IN6_IS_ADDR_MC_INTFACELOCAL(a)))
  375: 
  376: #define IFA6_IS_DEPRECATED(a) \
  377:         ((a)->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME && \
  378:          (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
  379:          (a)->ia6_lifetime.ia6t_pltime)
  380: #define IFA6_IS_INVALID(a) \
  381:         ((a)->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME && \
  382:          (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
  383:          (a)->ia6_lifetime.ia6t_vltime)
  384: #endif
  385: 
  386: /*
  387:  * IP6 route structure
  388:  */
  389: #if __BSD_VISIBLE
  390: struct route_in6 {
  391:         struct rtentry *ro_rt;
  392:         u_long          ro_tableid;   /* padded to long for alignment */
  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: #define IPV6_PIPEX              63   /* bool; using PIPEX */
  481: 
  482: #define IPV6_RTABLE             0x1021     /* int; routing table, see SO_RTABLE */
  483: 
  484: /* to define items, should talk with KAME guys first, for *BSD compatibility */
  485: 
  486: #define IPV6_RTHDR_LOOSE     0 /* this hop need not be a neighbor. XXX old spec */
  487: #define IPV6_RTHDR_STRICT    1 /* this hop must be a neighbor. XXX old spec */
  488: #define IPV6_RTHDR_TYPE_0    0 /* IPv6 routing header type 0 */
  489: 
  490: /*
  491:  * Defaults and limits for options
  492:  */
  493: #define IPV6_DEFAULT_MULTICAST_HOPS 1   /* normally limit m'casts to 1 hop */
  494: #define IPV6_DEFAULT_MULTICAST_LOOP 1   /* normally hear sends if a member */
  495: 
  496: /*
  497:  * Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP.
  498:  */
  499: struct ipv6_mreq {
  500:         struct in6_addr        ipv6mr_multiaddr;
  501:         unsigned int   ipv6mr_interface;
  502: };
  503: 
  504: /*
  505:  * IPV6_PKTINFO: Packet information(RFC2292 sec 5)
  506:  */
  507: struct in6_pktinfo {
  508:         struct in6_addr        ipi6_addr;     /* src/dst IPv6 address */
  509:         unsigned int   ipi6_ifindex;     /* send/recv interface index */
  510: };
  511: 
  512: /*
  513:  * Control structure for IPV6_RECVPATHMTU socket option.
  514:  */
  515: struct ip6_mtuinfo {
  516:         struct sockaddr_in6 ip6m_addr; /* or sockaddr_storage? */
  517:         u_int32_t ip6m_mtu;
  518: };
  519: 
  520: /*
  521:  * Argument for IPV6_PORTRANGE:
  522:  * - which range to search when port is unspecified at bind() or connect()
  523:  */
  524: #define IPV6_PORTRANGE_DEFAULT  0        /* default range */
  525: #define IPV6_PORTRANGE_HIGH     1   /* "high" - request firewall bypass */
  526: #define IPV6_PORTRANGE_LOW      2    /* "low" - vouchsafe security */
  527: 
  528: #if __BSD_VISIBLE
  529: /*
  530:  * Definitions for inet6 sysctl operations.
  531:  *
  532:  * Third level is protocol number.
  533:  * Fourth level is desired variable within that protocol.
  534:  */
  535: #define IPV6PROTO_MAXID (IPPROTO_DIVERT + 1)    /* don't list to IPV6PROTO_MAX */
  536: 
  537: #define CTL_IPV6PROTO_NAMES { \
  538:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  539:         { 0, 0 }, \
  540:         { "tcp6", CTLTYPE_NODE }, \
  541:         { 0, 0 }, \
  542:         { 0, 0 }, \
  543:         { 0, 0 }, \
  544:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  545:         { 0, 0 }, \
  546:         { 0, 0 }, \
  547:         { "udp6", CTLTYPE_NODE }, \
  548:         { 0, 0 }, \
  549:         { 0, 0 }, \
  550:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  551:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  552:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  553:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  554:         { 0, 0 }, \
  555:         { "ip6", CTLTYPE_NODE }, \
  556:         { 0, 0 }, \
  557:         { 0, 0 }, \
  558:         { 0, 0 }, \
  559:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  560:         { 0, 0 }, \
  561:         { "ipsec6", CTLTYPE_NODE }, \
  562:         { 0, 0 }, \
  563:         { 0, 0 }, \
  564:         { 0, 0 }, \
  565:         { 0, 0 }, \
  566:         { 0, 0 }, \
  567:         { 0, 0 }, \
  568:         { "icmp6", CTLTYPE_NODE }, \
  569:         { 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 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  576:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  577:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  578:         { 0, 0 }, \
  579:         { 0, 0 }, \
  580:         { 0, 0 }, \
  581:         { "pim6", CTLTYPE_NODE }, \
  582:         { 0, 0 }, \
  583:         { 0, 0 }, \
  584:         { 0, 0 }, \
  585:         { 0, 0 }, \
  586:         { 0, 0 }, \
  587:         { 0, 0 }, \
  588: /*110*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  589:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  590: /*120*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  591:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  592: /*130*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  593:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  594: /*140*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  595:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  596: /*150*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  597:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  598: /*160*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  599:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  600: /*170*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  601:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  602: /*180*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  603:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  604: /*190*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  605:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  606: /*200*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  607:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  608: /*210*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  609:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  610: /*220*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  611:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  612: /*230*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  613:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  614: /*240*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  615:         { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
  616: /*250*/ { 0, 0 }, \
  617:         { 0, 0 }, \
  618:         { 0, 0 }, \
  619:         { 0, 0 }, \
  620:         { 0, 0 }, \
  621:         { 0, 0 }, \
  622:         { 0, 0 }, \
  623:         { 0, 0 }, \
  624:         { "divert", CTLTYPE_NODE }, \
  625: }
  626: 
  627: /*
  628:  * Names for IP sysctl objects
  629:  */
  630: #define IPV6CTL_FORWARDING      1    /* act as router */
  631: #define IPV6CTL_SENDREDIRECTS   2 /* may send redirects when forwarding*/
  632: #define IPV6CTL_DEFHLIM         3      /* default Hop-Limit */
  633: #ifdef notyet
  634: #define IPV6CTL_DEFMTU          4       /* default MTU */
  635: #endif
  636: #define IPV6CTL_FORWSRCRT       5     /* forward source-routed dgrams */
  637: #define IPV6CTL_STATS           6        /* stats */
  638: #define IPV6CTL_MRTSTATS        7      /* multicast forwarding stats */
  639: #define IPV6CTL_MRTPROTO        8      /* multicast routing protocol */
  640: #define IPV6CTL_MAXFRAGPACKETS  9        /* max packets reassembly queue */
  641: #define IPV6CTL_SOURCECHECK     10  /* verify source route and intf */
  642: #define IPV6CTL_SOURCECHECK_LOGINT 11   /* minimume logging interval */
  643: #define IPV6CTL_ACCEPT_RTADV    12
  644: #define IPV6CTL_KEEPFAITH       13
  645: #define IPV6CTL_LOG_INTERVAL    14
  646: #define IPV6CTL_HDRNESTLIMIT    15
  647: #define IPV6CTL_DAD_COUNT       16
  648: #define IPV6CTL_AUTO_FLOWLABEL  17
  649: #define IPV6CTL_DEFMCASTHLIM    18
  650: #ifdef notdef   /* obsolete */
  651: #define IPV6CTL_GIF_HLIM        19     /* default HLIM for gif encap packet */
  652: #endif
  653: #define IPV6CTL_KAME_VERSION    20
  654: #define IPV6CTL_USE_DEPRECATED  21       /* use deprecated addr (RFC2462 5.5.4) */
  655: #define IPV6CTL_RR_PRUNE        22     /* walk timer for router renumbering */
  656: /*#define IPV6CTL_MAPPED_ADDR   23        not for OpenBSD */
  657: #define IPV6CTL_V6ONLY          24
  658: /* 25 to 40: resrved */
  659: #define IPV6CTL_MAXFRAGS        41     /* max fragments */
  660: #define IPV6CTL_MFORWARDING     42
  661: #define IPV6CTL_MULTIPATH       43
  662: #define IPV6CTL_MCAST_PMTU      44   /* path MTU discovery for multicast */
  663: #define IPV6CTL_NEIGHBORGCTHRESH 45
  664: #define IPV6CTL_MAXIFPREFIXES   46
  665: #define IPV6CTL_MAXIFDEFROUTERS 47
  666: #define IPV6CTL_MAXDYNROUTES    48
  667: #define IPV6CTL_DAD_PENDING     49
  668: #define IPV6CTL_MAXID           50
  669: 
  670: /* New entries should be added here from current IPV6CTL_MAXID value. */
  671: /* to define items, should talk with KAME guys first, for *BSD compatibility */
  672: 
  673: #define IPV6CTL_NAMES { \
  674:         { 0, 0 }, \
  675:         { "forwarding", CTLTYPE_INT }, \
  676:         { "redirect", CTLTYPE_INT }, \
  677:         { "hlim", CTLTYPE_INT }, \
  678:         { "mtu", CTLTYPE_INT }, \
  679:         { "forwsrcrt", CTLTYPE_INT }, \
  680:         { 0, 0 }, \
  681:         { 0, 0 }, \
  682:         { "mrtproto", CTLTYPE_INT }, \
  683:         { "maxfragpackets", CTLTYPE_INT }, \
  684:         { "sourcecheck", CTLTYPE_INT }, \
  685:         { "sourcecheck_logint", CTLTYPE_INT }, \
  686:         { "accept_rtadv", CTLTYPE_INT }, \
  687:         { "keepfaith", CTLTYPE_INT }, \
  688:         { "log_interval", CTLTYPE_INT }, \
  689:         { "hdrnestlimit", CTLTYPE_INT }, \
  690:         { "dad_count", CTLTYPE_INT }, \
  691:         { "auto_flowlabel", CTLTYPE_INT }, \
  692:         { "defmcasthlim", CTLTYPE_INT }, \
  693:         { 0, 0 }, \
  694:         { "kame_version", CTLTYPE_STRING }, \
  695:         { "use_deprecated", CTLTYPE_INT }, \
  696:         { "rr_prune", CTLTYPE_INT }, \
  697:         { 0, 0 }, \
  698:         { "v6only", CTLTYPE_INT }, \
  699:         { 0, 0 }, \
  700:         { 0, 0 }, \
  701:         { 0, 0 }, \
  702:         { 0, 0 }, \
  703:         { 0, 0 }, \
  704:         { 0, 0 }, \
  705:         { 0, 0 }, \
  706:         { 0, 0 }, \
  707:         { 0, 0 }, \
  708:         { 0, 0 }, \
  709:         { 0, 0 }, \
  710:         { 0, 0 }, \
  711:         { 0, 0 }, \
  712:         { 0, 0 }, \
  713:         { 0, 0 }, \
  714:         { 0, 0 }, \
  715:         { "maxfrags", CTLTYPE_INT }, \
  716:         { "mforwarding", CTLTYPE_INT }, \
  717:         { "multipath", CTLTYPE_INT }, \
  718:         { "multicast_mtudisc", CTLTYPE_INT }, \
  719:         { "neighborgcthresh", CTLTYPE_INT }, \
  720:         { "maxifprefixes", CTLTYPE_INT }, \
  721:         { "maxifdefrouters", CTLTYPE_INT }, \
  722:         { "maxdynroutes", CTLTYPE_INT }, \
  723:         { "dad_pending", CTLTYPE_INT }, \
  724: }
  725: 
  726: #define IPV6CTL_VARS { \
  727:         NULL, \
  728:         &ip6_forwarding, \
  729:         &ip6_sendredirects, \
  730:         &ip6_defhlim, \
  731:         NULL, \
  732:         NULL, \
  733:         NULL, \
  734:         NULL, \
  735:         NULL, \
  736:         &ip6_maxfragpackets, \
  737:         NULL, \
  738:         NULL, \
  739:         &ip6_accept_rtadv, \
  740:         &ip6_keepfaith, \
  741:         &ip6_log_interval, \
  742:         &ip6_hdrnestlimit, \
  743:         &ip6_dad_count, \
  744:         &ip6_auto_flowlabel, \
  745:         &ip6_defmcasthlim, \
  746:         NULL, \
  747:         NULL, \
  748:         &ip6_use_deprecated, \
  749:         &ip6_rr_prune, \
  750:         NULL, \
  751:         NULL, \
  752:         NULL, \
  753:         NULL, \
  754:         NULL, \
  755:         NULL, \
  756:         NULL, \
  757:         NULL, \
  758:         NULL, \
  759:         NULL, \
  760:         NULL, \
  761:         NULL, \
  762:         NULL, \
  763:         NULL, \
  764:         NULL, \
  765:         NULL, \
  766:         NULL, \
  767:         NULL, \
  768:         &ip6_maxfrags, \
  769:         &ip6_mforwarding, \
  770:         &ip6_multipath, \
  771:         &ip6_mcast_pmtu, \
  772:         &ip6_neighborgcthresh, \
  773:         &ip6_maxifprefixes, \
  774:         &ip6_maxifdefrouters, \
  775:         &ip6_maxdynroutes, \
  776:         NULL, \
  777: }
  778: 
  779: #endif /* __BSD_VISIBLE */
  780: 
  781: #ifdef _KERNEL
  782: struct cmsghdr;
  783: 
  784: int     in6_cksum(struct mbuf *, u_int8_t, u_int32_t, u_int32_t);
  785: int     in6_localaddr(struct in6_addr *);
  786: int     in6_addrscope(struct in6_addr *);
  787: struct  in6_ifaddr *in6_ifawithscope(struct ifnet *, struct in6_addr *, u_int);
  788: extern void in6_if_up(struct ifnet *);
  789: void    in6_get_rand_ifid(struct ifnet *, struct in6_addr *);
  790: int     in6_mask2len(struct in6_addr *, u_char *);
  791: 
  792: #define satosin6(sa)    ((struct sockaddr_in6 *)(sa))
  793: #define sin6tosa(sin6)  ((struct sockaddr *)(sin6))
  794: #define ifatoia6(ifa)   ((struct in6_ifaddr *)(ifa))
  795: #endif /* _KERNEL */
  796: 
  797: __BEGIN_DECLS
  798: struct cmsghdr;
  799: 
  800: extern int inet6_option_space(int);
  801: extern int inet6_option_init(void *, struct cmsghdr **, int);
  802: extern int inet6_option_append(struct cmsghdr *, const u_int8_t *,
  803:         int, int);
  804: extern u_int8_t *inet6_option_alloc(struct cmsghdr *, int, int, int);
  805: extern int inet6_option_next(const struct cmsghdr *, u_int8_t **);
  806: extern int inet6_option_find(const struct cmsghdr *, u_int8_t **, int);
  807: 
  808: extern size_t inet6_rthdr_space(int, int);
  809: extern struct cmsghdr *inet6_rthdr_init(void *, int);
  810: extern int inet6_rthdr_add(struct cmsghdr *, const struct in6_addr *,
  811:                 unsigned int);
  812: extern int inet6_rthdr_lasthop(struct cmsghdr *, unsigned int);
  813: #if 0 /* not implemented yet */
  814: extern int inet6_rthdr_reverse(const struct cmsghdr *, struct cmsghdr *);
  815: #endif
  816: extern int inet6_rthdr_segments(const struct cmsghdr *);
  817: extern struct in6_addr *inet6_rthdr_getaddr(struct cmsghdr *, int);
  818: extern int inet6_rthdr_getflags(const struct cmsghdr *, int);
  819: 
  820: extern int inet6_opt_init(void *, socklen_t);
  821: extern int inet6_opt_append(void *, socklen_t, int, u_int8_t,
  822:                 socklen_t, u_int8_t, void **);
  823: extern int inet6_opt_finish(void *, socklen_t, int);
  824: extern int inet6_opt_set_val(void *, int, void *, socklen_t);
  825: 
  826: extern int inet6_opt_next(void *, socklen_t, int, u_int8_t *,
  827:                 socklen_t *, void **);
  828: extern int inet6_opt_find(void *, socklen_t, int, u_int8_t,
  829:                 socklen_t *, void **);
  830: extern int inet6_opt_get_val(void *, int, void *, socklen_t);
  831: 
  832: extern socklen_t inet6_rth_space(int, int);
  833: extern void *inet6_rth_init(void *, socklen_t, int, int);
  834: extern int inet6_rth_add(void *, const struct in6_addr *);
  835: extern int inet6_rth_reverse(const void *, void *);
  836: extern int inet6_rth_segments(const void *);
  837: extern struct in6_addr *inet6_rth_getaddr(const void *, int);
  838: __END_DECLS
  839: 
  840: #endif /* !_NETINET6_IN6_H_ */