[BACK]Return to in6.h CVS log [TXT][DIR] Up to [local] / sys / netinet6

Annotation of sys/netinet6/in6.h, Revision 1.1.1.1

1.1       nbrk        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_ */

CVSweb