[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     ! 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