1*199767f8SToomas Soome /*- 2*199767f8SToomas Soome * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 3*199767f8SToomas Soome * All rights reserved. 4*199767f8SToomas Soome * 5*199767f8SToomas Soome * Redistribution and use in source and binary forms, with or without 6*199767f8SToomas Soome * modification, are permitted provided that the following conditions 7*199767f8SToomas Soome * are met: 8*199767f8SToomas Soome * 1. Redistributions of source code must retain the above copyright 9*199767f8SToomas Soome * notice, this list of conditions and the following disclaimer. 10*199767f8SToomas Soome * 2. Redistributions in binary form must reproduce the above copyright 11*199767f8SToomas Soome * notice, this list of conditions and the following disclaimer in the 12*199767f8SToomas Soome * documentation and/or other materials provided with the distribution. 13*199767f8SToomas Soome * 3. Neither the name of the project nor the names of its contributors 14*199767f8SToomas Soome * may be used to endorse or promote products derived from this software 15*199767f8SToomas Soome * without specific prior written permission. 16*199767f8SToomas Soome * 17*199767f8SToomas Soome * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 18*199767f8SToomas Soome * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*199767f8SToomas Soome * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*199767f8SToomas Soome * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 21*199767f8SToomas Soome * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*199767f8SToomas Soome * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*199767f8SToomas Soome * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*199767f8SToomas Soome * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*199767f8SToomas Soome * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*199767f8SToomas Soome * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*199767f8SToomas Soome * SUCH DAMAGE. 28*199767f8SToomas Soome * 29*199767f8SToomas Soome * $KAME: in6.h,v 1.89 2001/05/27 13:28:35 itojun Exp $ 30*199767f8SToomas Soome */ 31*199767f8SToomas Soome 32*199767f8SToomas Soome /*- 33*199767f8SToomas Soome * Copyright (c) 1982, 1986, 1990, 1993 34*199767f8SToomas Soome * The Regents of the University of California. All rights reserved. 35*199767f8SToomas Soome * 36*199767f8SToomas Soome * Redistribution and use in source and binary forms, with or without 37*199767f8SToomas Soome * modification, are permitted provided that the following conditions 38*199767f8SToomas Soome * are met: 39*199767f8SToomas Soome * 1. Redistributions of source code must retain the above copyright 40*199767f8SToomas Soome * notice, this list of conditions and the following disclaimer. 41*199767f8SToomas Soome * 2. Redistributions in binary form must reproduce the above copyright 42*199767f8SToomas Soome * notice, this list of conditions and the following disclaimer in the 43*199767f8SToomas Soome * documentation and/or other materials provided with the distribution. 44*199767f8SToomas Soome * 4. Neither the name of the University nor the names of its contributors 45*199767f8SToomas Soome * may be used to endorse or promote products derived from this software 46*199767f8SToomas Soome * without specific prior written permission. 47*199767f8SToomas Soome * 48*199767f8SToomas Soome * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 49*199767f8SToomas Soome * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50*199767f8SToomas Soome * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51*199767f8SToomas Soome * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52*199767f8SToomas Soome * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53*199767f8SToomas Soome * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54*199767f8SToomas Soome * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55*199767f8SToomas Soome * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56*199767f8SToomas Soome * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57*199767f8SToomas Soome * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58*199767f8SToomas Soome * SUCH DAMAGE. 59*199767f8SToomas Soome * 60*199767f8SToomas Soome * @(#)in.h 8.3 (Berkeley) 1/3/94 61*199767f8SToomas Soome * $FreeBSD$ 62*199767f8SToomas Soome */ 63*199767f8SToomas Soome 64*199767f8SToomas Soome #ifndef __KAME_NETINET_IN_H_INCLUDED_ 65*199767f8SToomas Soome #error "do not include netinet6/in6.h directly, include netinet/in.h. see RFC2553" 66*199767f8SToomas Soome #endif 67*199767f8SToomas Soome 68*199767f8SToomas Soome #ifndef _NETINET6_IN6_H_ 69*199767f8SToomas Soome #define _NETINET6_IN6_H_ 70*199767f8SToomas Soome 71*199767f8SToomas Soome /* 72*199767f8SToomas Soome * Identification of the network protocol stack 73*199767f8SToomas Soome * for *BSD-current/release: http://www.kame.net/dev/cvsweb.cgi/kame/COVERAGE 74*199767f8SToomas Soome * has the table of implementation/integration differences. 75*199767f8SToomas Soome */ 76*199767f8SToomas Soome #define __KAME__ 77*199767f8SToomas Soome #define __KAME_VERSION "FreeBSD" 78*199767f8SToomas Soome 79*199767f8SToomas Soome /* 80*199767f8SToomas Soome * IPv6 port allocation rules should mirror the IPv4 rules and are controlled 81*199767f8SToomas Soome * by the net.inet.ip.portrange sysctl tree. The following defines exist 82*199767f8SToomas Soome * for compatibility with userland applications that need them. 83*199767f8SToomas Soome */ 84*199767f8SToomas Soome #if __BSD_VISIBLE 85*199767f8SToomas Soome #define IPV6PORT_RESERVED 1024 86*199767f8SToomas Soome #define IPV6PORT_ANONMIN 49152 87*199767f8SToomas Soome #define IPV6PORT_ANONMAX 65535 88*199767f8SToomas Soome #define IPV6PORT_RESERVEDMIN 600 89*199767f8SToomas Soome #define IPV6PORT_RESERVEDMAX (IPV6PORT_RESERVED-1) 90*199767f8SToomas Soome #endif 91*199767f8SToomas Soome 92*199767f8SToomas Soome /* 93*199767f8SToomas Soome * IPv6 address 94*199767f8SToomas Soome */ 95*199767f8SToomas Soome struct in6_addr { 96*199767f8SToomas Soome union { 97*199767f8SToomas Soome uint8_t __u6_addr8[16]; 98*199767f8SToomas Soome uint16_t __u6_addr16[8]; 99*199767f8SToomas Soome uint32_t __u6_addr32[4]; 100*199767f8SToomas Soome } __u6_addr; /* 128-bit IP6 address */ 101*199767f8SToomas Soome }; 102*199767f8SToomas Soome 103*199767f8SToomas Soome #define s6_addr __u6_addr.__u6_addr8 104*199767f8SToomas Soome #ifdef _KERNEL /* XXX nonstandard */ 105*199767f8SToomas Soome #define s6_addr8 __u6_addr.__u6_addr8 106*199767f8SToomas Soome #define s6_addr16 __u6_addr.__u6_addr16 107*199767f8SToomas Soome #define s6_addr32 __u6_addr.__u6_addr32 108*199767f8SToomas Soome #endif 109*199767f8SToomas Soome 110*199767f8SToomas Soome #define INET6_ADDRSTRLEN 46 111*199767f8SToomas Soome 112*199767f8SToomas Soome /* 113*199767f8SToomas Soome * XXX missing POSIX.1-2001 macro IPPROTO_IPV6. 114*199767f8SToomas Soome */ 115*199767f8SToomas Soome 116*199767f8SToomas Soome /* 117*199767f8SToomas Soome * Socket address for IPv6 118*199767f8SToomas Soome */ 119*199767f8SToomas Soome #if __BSD_VISIBLE 120*199767f8SToomas Soome #define SIN6_LEN 121*199767f8SToomas Soome #endif 122*199767f8SToomas Soome 123*199767f8SToomas Soome struct sockaddr_in6 { 124*199767f8SToomas Soome uint8_t sin6_len; /* length of this struct */ 125*199767f8SToomas Soome sa_family_t sin6_family; /* AF_INET6 */ 126*199767f8SToomas Soome in_port_t sin6_port; /* Transport layer port # */ 127*199767f8SToomas Soome uint32_t sin6_flowinfo; /* IP6 flow information */ 128*199767f8SToomas Soome struct in6_addr sin6_addr; /* IP6 address */ 129*199767f8SToomas Soome uint32_t sin6_scope_id; /* scope zone index */ 130*199767f8SToomas Soome }; 131*199767f8SToomas Soome 132*199767f8SToomas Soome /* 133*199767f8SToomas Soome * Local definition for masks 134*199767f8SToomas Soome */ 135*199767f8SToomas Soome #ifdef _KERNEL /* XXX nonstandard */ 136*199767f8SToomas Soome #define IN6MASK0 {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}} 137*199767f8SToomas Soome #define IN6MASK32 {{{ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, \ 138*199767f8SToomas Soome 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 139*199767f8SToomas Soome #define IN6MASK64 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ 140*199767f8SToomas Soome 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 141*199767f8SToomas Soome #define IN6MASK96 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ 142*199767f8SToomas Soome 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}} 143*199767f8SToomas Soome #define IN6MASK128 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ 144*199767f8SToomas Soome 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}} 145*199767f8SToomas Soome #endif 146*199767f8SToomas Soome 147*199767f8SToomas Soome #ifdef _KERNEL 148*199767f8SToomas Soome extern const struct sockaddr_in6 sa6_any; 149*199767f8SToomas Soome 150*199767f8SToomas Soome extern const struct in6_addr in6mask0; 151*199767f8SToomas Soome extern const struct in6_addr in6mask32; 152*199767f8SToomas Soome extern const struct in6_addr in6mask64; 153*199767f8SToomas Soome extern const struct in6_addr in6mask96; 154*199767f8SToomas Soome extern const struct in6_addr in6mask128; 155*199767f8SToomas Soome #endif /* _KERNEL */ 156*199767f8SToomas Soome 157*199767f8SToomas Soome /* 158*199767f8SToomas Soome * Macros started with IPV6_ADDR is KAME local 159*199767f8SToomas Soome */ 160*199767f8SToomas Soome #ifdef _KERNEL /* XXX nonstandard */ 161*199767f8SToomas Soome #if _BYTE_ORDER == _BIG_ENDIAN 162*199767f8SToomas Soome #define IPV6_ADDR_INT32_ONE 1 163*199767f8SToomas Soome #define IPV6_ADDR_INT32_TWO 2 164*199767f8SToomas Soome #define IPV6_ADDR_INT32_MNL 0xff010000 165*199767f8SToomas Soome #define IPV6_ADDR_INT32_MLL 0xff020000 166*199767f8SToomas Soome #define IPV6_ADDR_INT32_SMP 0x0000ffff 167*199767f8SToomas Soome #define IPV6_ADDR_INT16_ULL 0xfe80 168*199767f8SToomas Soome #define IPV6_ADDR_INT16_USL 0xfec0 169*199767f8SToomas Soome #define IPV6_ADDR_INT16_MLL 0xff02 170*199767f8SToomas Soome #elif _BYTE_ORDER == _LITTLE_ENDIAN 171*199767f8SToomas Soome #define IPV6_ADDR_INT32_ONE 0x01000000 172*199767f8SToomas Soome #define IPV6_ADDR_INT32_TWO 0x02000000 173*199767f8SToomas Soome #define IPV6_ADDR_INT32_MNL 0x000001ff 174*199767f8SToomas Soome #define IPV6_ADDR_INT32_MLL 0x000002ff 175*199767f8SToomas Soome #define IPV6_ADDR_INT32_SMP 0xffff0000 176*199767f8SToomas Soome #define IPV6_ADDR_INT16_ULL 0x80fe 177*199767f8SToomas Soome #define IPV6_ADDR_INT16_USL 0xc0fe 178*199767f8SToomas Soome #define IPV6_ADDR_INT16_MLL 0x02ff 179*199767f8SToomas Soome #endif 180*199767f8SToomas Soome #endif 181*199767f8SToomas Soome 182*199767f8SToomas Soome /* 183*199767f8SToomas Soome * Definition of some useful macros to handle IP6 addresses 184*199767f8SToomas Soome */ 185*199767f8SToomas Soome #if __BSD_VISIBLE 186*199767f8SToomas Soome #define IN6ADDR_ANY_INIT \ 187*199767f8SToomas Soome {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 188*199767f8SToomas Soome 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 189*199767f8SToomas Soome #define IN6ADDR_LOOPBACK_INIT \ 190*199767f8SToomas Soome {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 191*199767f8SToomas Soome 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 192*199767f8SToomas Soome #define IN6ADDR_NODELOCAL_ALLNODES_INIT \ 193*199767f8SToomas Soome {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 194*199767f8SToomas Soome 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 195*199767f8SToomas Soome #define IN6ADDR_INTFACELOCAL_ALLNODES_INIT \ 196*199767f8SToomas Soome {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 197*199767f8SToomas Soome 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 198*199767f8SToomas Soome #define IN6ADDR_LINKLOCAL_ALLNODES_INIT \ 199*199767f8SToomas Soome {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 200*199767f8SToomas Soome 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 201*199767f8SToomas Soome #define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \ 202*199767f8SToomas Soome {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 203*199767f8SToomas Soome 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}} 204*199767f8SToomas Soome #define IN6ADDR_LINKLOCAL_ALLV2ROUTERS_INIT \ 205*199767f8SToomas Soome {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 206*199767f8SToomas Soome 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16 }}} 207*199767f8SToomas Soome #endif 208*199767f8SToomas Soome 209*199767f8SToomas Soome extern const struct in6_addr in6addr_any; 210*199767f8SToomas Soome extern const struct in6_addr in6addr_loopback; 211*199767f8SToomas Soome #if __BSD_VISIBLE 212*199767f8SToomas Soome extern const struct in6_addr in6addr_nodelocal_allnodes; 213*199767f8SToomas Soome extern const struct in6_addr in6addr_linklocal_allnodes; 214*199767f8SToomas Soome extern const struct in6_addr in6addr_linklocal_allrouters; 215*199767f8SToomas Soome extern const struct in6_addr in6addr_linklocal_allv2routers; 216*199767f8SToomas Soome #endif 217*199767f8SToomas Soome 218*199767f8SToomas Soome /* 219*199767f8SToomas Soome * Equality 220*199767f8SToomas Soome * NOTE: Some of kernel programming environment (for example, openbsd/sparc) 221*199767f8SToomas Soome * does not supply memcmp(). For userland memcmp() is preferred as it is 222*199767f8SToomas Soome * in ANSI standard. 223*199767f8SToomas Soome */ 224*199767f8SToomas Soome #ifdef _KERNEL 225*199767f8SToomas Soome #define IN6_ARE_ADDR_EQUAL(a, b) \ 226*199767f8SToomas Soome (bcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0) 227*199767f8SToomas Soome #else 228*199767f8SToomas Soome #if __BSD_VISIBLE 229*199767f8SToomas Soome #define IN6_ARE_ADDR_EQUAL(a, b) \ 230*199767f8SToomas Soome (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0) 231*199767f8SToomas Soome #endif 232*199767f8SToomas Soome #endif 233*199767f8SToomas Soome 234*199767f8SToomas Soome /* 235*199767f8SToomas Soome * Unspecified 236*199767f8SToomas Soome */ 237*199767f8SToomas Soome #define IN6_IS_ADDR_UNSPECIFIED(a) \ 238*199767f8SToomas Soome ((a)->__u6_addr.__u6_addr32[0] == 0 && \ 239*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[1] == 0 && \ 240*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[2] == 0 && \ 241*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[3] == 0) 242*199767f8SToomas Soome 243*199767f8SToomas Soome /* 244*199767f8SToomas Soome * Loopback 245*199767f8SToomas Soome */ 246*199767f8SToomas Soome #define IN6_IS_ADDR_LOOPBACK(a) \ 247*199767f8SToomas Soome ((a)->__u6_addr.__u6_addr32[0] == 0 && \ 248*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[1] == 0 && \ 249*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[2] == 0 && \ 250*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[3] == ntohl(1)) 251*199767f8SToomas Soome 252*199767f8SToomas Soome /* 253*199767f8SToomas Soome * IPv4 compatible 254*199767f8SToomas Soome */ 255*199767f8SToomas Soome #define IN6_IS_ADDR_V4COMPAT(a) \ 256*199767f8SToomas Soome ((a)->__u6_addr.__u6_addr32[0] == 0 && \ 257*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[1] == 0 && \ 258*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[2] == 0 && \ 259*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[3] != 0 && \ 260*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[3] != ntohl(1)) 261*199767f8SToomas Soome 262*199767f8SToomas Soome /* 263*199767f8SToomas Soome * Mapped 264*199767f8SToomas Soome */ 265*199767f8SToomas Soome #define IN6_IS_ADDR_V4MAPPED(a) \ 266*199767f8SToomas Soome ((a)->__u6_addr.__u6_addr32[0] == 0 && \ 267*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[1] == 0 && \ 268*199767f8SToomas Soome (a)->__u6_addr.__u6_addr32[2] == ntohl(0x0000ffff)) 269*199767f8SToomas Soome 270*199767f8SToomas Soome /* 271*199767f8SToomas Soome * KAME Scope Values 272*199767f8SToomas Soome */ 273*199767f8SToomas Soome 274*199767f8SToomas Soome #ifdef _KERNEL /* XXX nonstandard */ 275*199767f8SToomas Soome #define IPV6_ADDR_SCOPE_NODELOCAL 0x01 276*199767f8SToomas Soome #define IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 277*199767f8SToomas Soome #define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 278*199767f8SToomas Soome #define IPV6_ADDR_SCOPE_SITELOCAL 0x05 279*199767f8SToomas Soome #define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* just used in this file */ 280*199767f8SToomas Soome #define IPV6_ADDR_SCOPE_GLOBAL 0x0e 281*199767f8SToomas Soome #else 282*199767f8SToomas Soome #define __IPV6_ADDR_SCOPE_NODELOCAL 0x01 283*199767f8SToomas Soome #define __IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 284*199767f8SToomas Soome #define __IPV6_ADDR_SCOPE_LINKLOCAL 0x02 285*199767f8SToomas Soome #define __IPV6_ADDR_SCOPE_SITELOCAL 0x05 286*199767f8SToomas Soome #define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* just used in this file */ 287*199767f8SToomas Soome #define __IPV6_ADDR_SCOPE_GLOBAL 0x0e 288*199767f8SToomas Soome #endif 289*199767f8SToomas Soome 290*199767f8SToomas Soome /* 291*199767f8SToomas Soome * Unicast Scope 292*199767f8SToomas Soome * Note that we must check topmost 10 bits only, not 16 bits (see RFC2373). 293*199767f8SToomas Soome */ 294*199767f8SToomas Soome #define IN6_IS_ADDR_LINKLOCAL(a) \ 295*199767f8SToomas Soome (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80)) 296*199767f8SToomas Soome #define IN6_IS_ADDR_SITELOCAL(a) \ 297*199767f8SToomas Soome (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0)) 298*199767f8SToomas Soome 299*199767f8SToomas Soome /* 300*199767f8SToomas Soome * Multicast 301*199767f8SToomas Soome */ 302*199767f8SToomas Soome #define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff) 303*199767f8SToomas Soome 304*199767f8SToomas Soome #ifdef _KERNEL /* XXX nonstandard */ 305*199767f8SToomas Soome #define IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) 306*199767f8SToomas Soome #else 307*199767f8SToomas Soome #define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) 308*199767f8SToomas Soome #endif 309*199767f8SToomas Soome 310*199767f8SToomas Soome /* 311*199767f8SToomas Soome * Multicast Scope 312*199767f8SToomas Soome */ 313*199767f8SToomas Soome #ifdef _KERNEL /* refers nonstandard items */ 314*199767f8SToomas Soome #define IN6_IS_ADDR_MC_NODELOCAL(a) \ 315*199767f8SToomas Soome (IN6_IS_ADDR_MULTICAST(a) && \ 316*199767f8SToomas Soome (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL)) 317*199767f8SToomas Soome #define IN6_IS_ADDR_MC_INTFACELOCAL(a) \ 318*199767f8SToomas Soome (IN6_IS_ADDR_MULTICAST(a) && \ 319*199767f8SToomas Soome (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_INTFACELOCAL)) 320*199767f8SToomas Soome #define IN6_IS_ADDR_MC_LINKLOCAL(a) \ 321*199767f8SToomas Soome (IN6_IS_ADDR_MULTICAST(a) && \ 322*199767f8SToomas Soome (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL)) 323*199767f8SToomas Soome #define IN6_IS_ADDR_MC_SITELOCAL(a) \ 324*199767f8SToomas Soome (IN6_IS_ADDR_MULTICAST(a) && \ 325*199767f8SToomas Soome (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL)) 326*199767f8SToomas Soome #define IN6_IS_ADDR_MC_ORGLOCAL(a) \ 327*199767f8SToomas Soome (IN6_IS_ADDR_MULTICAST(a) && \ 328*199767f8SToomas Soome (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL)) 329*199767f8SToomas Soome #define IN6_IS_ADDR_MC_GLOBAL(a) \ 330*199767f8SToomas Soome (IN6_IS_ADDR_MULTICAST(a) && \ 331*199767f8SToomas Soome (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL)) 332*199767f8SToomas Soome #else 333*199767f8SToomas Soome #define IN6_IS_ADDR_MC_NODELOCAL(a) \ 334*199767f8SToomas Soome (IN6_IS_ADDR_MULTICAST(a) && \ 335*199767f8SToomas Soome (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL)) 336*199767f8SToomas Soome #define IN6_IS_ADDR_MC_LINKLOCAL(a) \ 337*199767f8SToomas Soome (IN6_IS_ADDR_MULTICAST(a) && \ 338*199767f8SToomas Soome (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL)) 339*199767f8SToomas Soome #define IN6_IS_ADDR_MC_SITELOCAL(a) \ 340*199767f8SToomas Soome (IN6_IS_ADDR_MULTICAST(a) && \ 341*199767f8SToomas Soome (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL)) 342*199767f8SToomas Soome #define IN6_IS_ADDR_MC_ORGLOCAL(a) \ 343*199767f8SToomas Soome (IN6_IS_ADDR_MULTICAST(a) && \ 344*199767f8SToomas Soome (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL)) 345*199767f8SToomas Soome #define IN6_IS_ADDR_MC_GLOBAL(a) \ 346*199767f8SToomas Soome (IN6_IS_ADDR_MULTICAST(a) && \ 347*199767f8SToomas Soome (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL)) 348*199767f8SToomas Soome #endif 349*199767f8SToomas Soome 350*199767f8SToomas Soome #ifdef _KERNEL /* nonstandard */ 351*199767f8SToomas Soome /* 352*199767f8SToomas Soome * KAME Scope 353*199767f8SToomas Soome */ 354*199767f8SToomas Soome #define IN6_IS_SCOPE_LINKLOCAL(a) \ 355*199767f8SToomas Soome ((IN6_IS_ADDR_LINKLOCAL(a)) || \ 356*199767f8SToomas Soome (IN6_IS_ADDR_MC_LINKLOCAL(a))) 357*199767f8SToomas Soome #define IN6_IS_SCOPE_EMBED(a) \ 358*199767f8SToomas Soome ((IN6_IS_ADDR_LINKLOCAL(a)) || \ 359*199767f8SToomas Soome (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \ 360*199767f8SToomas Soome (IN6_IS_ADDR_MC_INTFACELOCAL(a))) 361*199767f8SToomas Soome 362*199767f8SToomas Soome #define IFA6_IS_DEPRECATED(a) \ 363*199767f8SToomas Soome ((a)->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME && \ 364*199767f8SToomas Soome (u_int32_t)((time_uptime - (a)->ia6_updatetime)) > \ 365*199767f8SToomas Soome (a)->ia6_lifetime.ia6t_pltime) 366*199767f8SToomas Soome #define IFA6_IS_INVALID(a) \ 367*199767f8SToomas Soome ((a)->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME && \ 368*199767f8SToomas Soome (u_int32_t)((time_uptime - (a)->ia6_updatetime)) > \ 369*199767f8SToomas Soome (a)->ia6_lifetime.ia6t_vltime) 370*199767f8SToomas Soome #endif /* _KERNEL */ 371*199767f8SToomas Soome 372*199767f8SToomas Soome /* 373*199767f8SToomas Soome * IP6 route structure 374*199767f8SToomas Soome */ 375*199767f8SToomas Soome #if __BSD_VISIBLE 376*199767f8SToomas Soome struct route_in6 { 377*199767f8SToomas Soome struct rtentry *ro_rt; 378*199767f8SToomas Soome struct llentry *ro_lle; 379*199767f8SToomas Soome struct in6_addr *ro_ia6; 380*199767f8SToomas Soome int ro_flags; 381*199767f8SToomas Soome struct sockaddr_in6 ro_dst; 382*199767f8SToomas Soome }; 383*199767f8SToomas Soome #endif 384*199767f8SToomas Soome 385*199767f8SToomas Soome /* 386*199767f8SToomas Soome * Options for use with [gs]etsockopt at the IPV6 level. 387*199767f8SToomas Soome * First word of comment is data type; bool is stored in int. 388*199767f8SToomas Soome */ 389*199767f8SToomas Soome /* no hdrincl */ 390*199767f8SToomas Soome #if 0 /* the followings are relic in IPv4 and hence are disabled */ 391*199767f8SToomas Soome #define IPV6_OPTIONS 1 /* buf/ip6_opts; set/get IP6 options */ 392*199767f8SToomas Soome #define IPV6_RECVOPTS 5 /* bool; receive all IP6 opts w/dgram */ 393*199767f8SToomas Soome #define IPV6_RECVRETOPTS 6 /* bool; receive IP6 opts for response */ 394*199767f8SToomas Soome #define IPV6_RECVDSTADDR 7 /* bool; receive IP6 dst addr w/dgram */ 395*199767f8SToomas Soome #define IPV6_RETOPTS 8 /* ip6_opts; set/get IP6 options */ 396*199767f8SToomas Soome #endif 397*199767f8SToomas Soome #define IPV6_SOCKOPT_RESERVED1 3 /* reserved for future use */ 398*199767f8SToomas Soome #define IPV6_UNICAST_HOPS 4 /* int; IP6 hops */ 399*199767f8SToomas Soome #define IPV6_MULTICAST_IF 9 /* u_int; set/get IP6 multicast i/f */ 400*199767f8SToomas Soome #define IPV6_MULTICAST_HOPS 10 /* int; set/get IP6 multicast hops */ 401*199767f8SToomas Soome #define IPV6_MULTICAST_LOOP 11 /* u_int; set/get IP6 multicast loopback */ 402*199767f8SToomas Soome #define IPV6_JOIN_GROUP 12 /* ipv6_mreq; join a group membership */ 403*199767f8SToomas Soome #define IPV6_LEAVE_GROUP 13 /* ipv6_mreq; leave a group membership */ 404*199767f8SToomas Soome #define IPV6_PORTRANGE 14 /* int; range to choose for unspec port */ 405*199767f8SToomas Soome #define ICMP6_FILTER 18 /* icmp6_filter; icmp6 filter */ 406*199767f8SToomas Soome /* RFC2292 options */ 407*199767f8SToomas Soome #ifdef _KERNEL 408*199767f8SToomas Soome #define IPV6_2292PKTINFO 19 /* bool; send/recv if, src/dst addr */ 409*199767f8SToomas Soome #define IPV6_2292HOPLIMIT 20 /* bool; hop limit */ 410*199767f8SToomas Soome #define IPV6_2292NEXTHOP 21 /* bool; next hop addr */ 411*199767f8SToomas Soome #define IPV6_2292HOPOPTS 22 /* bool; hop-by-hop option */ 412*199767f8SToomas Soome #define IPV6_2292DSTOPTS 23 /* bool; destinaion option */ 413*199767f8SToomas Soome #define IPV6_2292RTHDR 24 /* bool; routing header */ 414*199767f8SToomas Soome #define IPV6_2292PKTOPTIONS 25 /* buf/cmsghdr; set/get IPv6 options */ 415*199767f8SToomas Soome #endif 416*199767f8SToomas Soome 417*199767f8SToomas Soome #define IPV6_CHECKSUM 26 /* int; checksum offset for raw socket */ 418*199767f8SToomas Soome #define IPV6_V6ONLY 27 /* bool; make AF_INET6 sockets v6 only */ 419*199767f8SToomas Soome #ifndef _KERNEL 420*199767f8SToomas Soome #define IPV6_BINDV6ONLY IPV6_V6ONLY 421*199767f8SToomas Soome #endif 422*199767f8SToomas Soome 423*199767f8SToomas Soome #if 1 /* IPSEC */ 424*199767f8SToomas Soome #define IPV6_IPSEC_POLICY 28 /* struct; get/set security policy */ 425*199767f8SToomas Soome #endif /* IPSEC */ 426*199767f8SToomas Soome 427*199767f8SToomas Soome /* 29; unused; was IPV6_FAITH */ 428*199767f8SToomas Soome #if 1 /* IPV6FIREWALL */ 429*199767f8SToomas Soome #define IPV6_FW_ADD 30 /* add a firewall rule to chain */ 430*199767f8SToomas Soome #define IPV6_FW_DEL 31 /* delete a firewall rule from chain */ 431*199767f8SToomas Soome #define IPV6_FW_FLUSH 32 /* flush firewall rule chain */ 432*199767f8SToomas Soome #define IPV6_FW_ZERO 33 /* clear single/all firewall counter(s) */ 433*199767f8SToomas Soome #define IPV6_FW_GET 34 /* get entire firewall rule chain */ 434*199767f8SToomas Soome #endif 435*199767f8SToomas Soome 436*199767f8SToomas Soome /* new socket options introduced in RFC3542 */ 437*199767f8SToomas Soome #define IPV6_RTHDRDSTOPTS 35 /* ip6_dest; send dst option before rthdr */ 438*199767f8SToomas Soome 439*199767f8SToomas Soome #define IPV6_RECVPKTINFO 36 /* bool; recv if, dst addr */ 440*199767f8SToomas Soome #define IPV6_RECVHOPLIMIT 37 /* bool; recv hop limit */ 441*199767f8SToomas Soome #define IPV6_RECVRTHDR 38 /* bool; recv routing header */ 442*199767f8SToomas Soome #define IPV6_RECVHOPOPTS 39 /* bool; recv hop-by-hop option */ 443*199767f8SToomas Soome #define IPV6_RECVDSTOPTS 40 /* bool; recv dst option after rthdr */ 444*199767f8SToomas Soome #ifdef _KERNEL 445*199767f8SToomas Soome #define IPV6_RECVRTHDRDSTOPTS 41 /* bool; recv dst option before rthdr */ 446*199767f8SToomas Soome #endif 447*199767f8SToomas Soome 448*199767f8SToomas Soome #define IPV6_USE_MIN_MTU 42 /* bool; send packets at the minimum MTU */ 449*199767f8SToomas Soome #define IPV6_RECVPATHMTU 43 /* bool; notify an according MTU */ 450*199767f8SToomas Soome 451*199767f8SToomas Soome #define IPV6_PATHMTU 44 /* mtuinfo; get the current path MTU (sopt), 452*199767f8SToomas Soome 4 bytes int; MTU notification (cmsg) */ 453*199767f8SToomas Soome #if 0 /*obsoleted during 2292bis -> 3542*/ 454*199767f8SToomas Soome #define IPV6_REACHCONF 45 /* no data; ND reachability confirm 455*199767f8SToomas Soome (cmsg only/not in of RFC3542) */ 456*199767f8SToomas Soome #endif 457*199767f8SToomas Soome 458*199767f8SToomas Soome /* more new socket options introduced in RFC3542 */ 459*199767f8SToomas Soome #define IPV6_PKTINFO 46 /* in6_pktinfo; send if, src addr */ 460*199767f8SToomas Soome #define IPV6_HOPLIMIT 47 /* int; send hop limit */ 461*199767f8SToomas Soome #define IPV6_NEXTHOP 48 /* sockaddr; next hop addr */ 462*199767f8SToomas Soome #define IPV6_HOPOPTS 49 /* ip6_hbh; send hop-by-hop option */ 463*199767f8SToomas Soome #define IPV6_DSTOPTS 50 /* ip6_dest; send dst option befor rthdr */ 464*199767f8SToomas Soome #define IPV6_RTHDR 51 /* ip6_rthdr; send routing header */ 465*199767f8SToomas Soome #if 0 466*199767f8SToomas Soome #define IPV6_PKTOPTIONS 52 /* buf/cmsghdr; set/get IPv6 options */ 467*199767f8SToomas Soome /* obsoleted by RFC3542 */ 468*199767f8SToomas Soome #endif 469*199767f8SToomas Soome 470*199767f8SToomas Soome #define IPV6_RECVTCLASS 57 /* bool; recv traffic class values */ 471*199767f8SToomas Soome 472*199767f8SToomas Soome #define IPV6_AUTOFLOWLABEL 59 /* bool; attach flowlabel automagically */ 473*199767f8SToomas Soome 474*199767f8SToomas Soome #define IPV6_TCLASS 61 /* int; send traffic class value */ 475*199767f8SToomas Soome #define IPV6_DONTFRAG 62 /* bool; disable IPv6 fragmentation */ 476*199767f8SToomas Soome 477*199767f8SToomas Soome #define IPV6_PREFER_TEMPADDR 63 /* int; prefer temporary addresses as 478*199767f8SToomas Soome * the source address. 479*199767f8SToomas Soome */ 480*199767f8SToomas Soome 481*199767f8SToomas Soome #define IPV6_BINDANY 64 /* bool: allow bind to any address */ 482*199767f8SToomas Soome 483*199767f8SToomas Soome #define IPV6_BINDMULTI 65 /* bool; allow multibind to same addr/port */ 484*199767f8SToomas Soome #define IPV6_RSS_LISTEN_BUCKET 66 /* int; set RSS listen bucket */ 485*199767f8SToomas Soome #define IPV6_FLOWID 67 /* int; flowid of given socket */ 486*199767f8SToomas Soome #define IPV6_FLOWTYPE 68 /* int; flowtype of given socket */ 487*199767f8SToomas Soome #define IPV6_RSSBUCKETID 69 /* int; RSS bucket ID of given socket */ 488*199767f8SToomas Soome #define IPV6_RECVFLOWID 70 /* bool; receive IP6 flowid/flowtype w/ datagram */ 489*199767f8SToomas Soome #define IPV6_RECVRSSBUCKETID 71 /* bool; receive IP6 RSS bucket id w/ datagram */ 490*199767f8SToomas Soome 491*199767f8SToomas Soome /* 492*199767f8SToomas Soome * The following option is private; do not use it from user applications. 493*199767f8SToomas Soome * It is deliberately defined to the same value as IP_MSFILTER. 494*199767f8SToomas Soome */ 495*199767f8SToomas Soome #define IPV6_MSFILTER 74 /* struct __msfilterreq; 496*199767f8SToomas Soome * set/get multicast source filter list. 497*199767f8SToomas Soome */ 498*199767f8SToomas Soome 499*199767f8SToomas Soome /* to define items, should talk with KAME guys first, for *BSD compatibility */ 500*199767f8SToomas Soome 501*199767f8SToomas Soome #define IPV6_RTHDR_LOOSE 0 /* this hop need not be a neighbor. XXX old spec */ 502*199767f8SToomas Soome #define IPV6_RTHDR_STRICT 1 /* this hop must be a neighbor. XXX old spec */ 503*199767f8SToomas Soome #define IPV6_RTHDR_TYPE_0 0 /* IPv6 routing header type 0 */ 504*199767f8SToomas Soome 505*199767f8SToomas Soome /* 506*199767f8SToomas Soome * Defaults and limits for options 507*199767f8SToomas Soome */ 508*199767f8SToomas Soome #define IPV6_DEFAULT_MULTICAST_HOPS 1 /* normally limit m'casts to 1 hop */ 509*199767f8SToomas Soome #define IPV6_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ 510*199767f8SToomas Soome 511*199767f8SToomas Soome /* 512*199767f8SToomas Soome * The im6o_membership vector for each socket is now dynamically allocated at 513*199767f8SToomas Soome * run-time, bounded by USHRT_MAX, and is reallocated when needed, sized 514*199767f8SToomas Soome * according to a power-of-two increment. 515*199767f8SToomas Soome */ 516*199767f8SToomas Soome #define IPV6_MIN_MEMBERSHIPS 31 517*199767f8SToomas Soome #define IPV6_MAX_MEMBERSHIPS 4095 518*199767f8SToomas Soome 519*199767f8SToomas Soome /* 520*199767f8SToomas Soome * Default resource limits for IPv6 multicast source filtering. 521*199767f8SToomas Soome * These may be modified by sysctl. 522*199767f8SToomas Soome */ 523*199767f8SToomas Soome #define IPV6_MAX_GROUP_SRC_FILTER 512 /* sources per group */ 524*199767f8SToomas Soome #define IPV6_MAX_SOCK_SRC_FILTER 128 /* sources per socket/group */ 525*199767f8SToomas Soome 526*199767f8SToomas Soome /* 527*199767f8SToomas Soome * Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP. 528*199767f8SToomas Soome */ 529*199767f8SToomas Soome struct ipv6_mreq { 530*199767f8SToomas Soome struct in6_addr ipv6mr_multiaddr; 531*199767f8SToomas Soome unsigned int ipv6mr_interface; 532*199767f8SToomas Soome }; 533*199767f8SToomas Soome 534*199767f8SToomas Soome /* 535*199767f8SToomas Soome * IPV6_PKTINFO: Packet information(RFC2292 sec 5) 536*199767f8SToomas Soome */ 537*199767f8SToomas Soome struct in6_pktinfo { 538*199767f8SToomas Soome struct in6_addr ipi6_addr; /* src/dst IPv6 address */ 539*199767f8SToomas Soome unsigned int ipi6_ifindex; /* send/recv interface index */ 540*199767f8SToomas Soome }; 541*199767f8SToomas Soome 542*199767f8SToomas Soome /* 543*199767f8SToomas Soome * Control structure for IPV6_RECVPATHMTU socket option. 544*199767f8SToomas Soome */ 545*199767f8SToomas Soome struct ip6_mtuinfo { 546*199767f8SToomas Soome struct sockaddr_in6 ip6m_addr; /* or sockaddr_storage? */ 547*199767f8SToomas Soome uint32_t ip6m_mtu; 548*199767f8SToomas Soome }; 549*199767f8SToomas Soome 550*199767f8SToomas Soome /* 551*199767f8SToomas Soome * Argument for IPV6_PORTRANGE: 552*199767f8SToomas Soome * - which range to search when port is unspecified at bind() or connect() 553*199767f8SToomas Soome */ 554*199767f8SToomas Soome #define IPV6_PORTRANGE_DEFAULT 0 /* default range */ 555*199767f8SToomas Soome #define IPV6_PORTRANGE_HIGH 1 /* "high" - request firewall bypass */ 556*199767f8SToomas Soome #define IPV6_PORTRANGE_LOW 2 /* "low" - vouchsafe security */ 557*199767f8SToomas Soome 558*199767f8SToomas Soome #if __BSD_VISIBLE 559*199767f8SToomas Soome /* 560*199767f8SToomas Soome * Definitions for inet6 sysctl operations. 561*199767f8SToomas Soome * 562*199767f8SToomas Soome * Third level is protocol number. 563*199767f8SToomas Soome * Fourth level is desired variable within that protocol. 564*199767f8SToomas Soome */ 565*199767f8SToomas Soome #define IPV6PROTO_MAXID (IPPROTO_PIM + 1) /* don't list to IPV6PROTO_MAX */ 566*199767f8SToomas Soome 567*199767f8SToomas Soome /* 568*199767f8SToomas Soome * Names for IP sysctl objects 569*199767f8SToomas Soome */ 570*199767f8SToomas Soome #define IPV6CTL_FORWARDING 1 /* act as router */ 571*199767f8SToomas Soome #define IPV6CTL_SENDREDIRECTS 2 /* may send redirects when forwarding*/ 572*199767f8SToomas Soome #define IPV6CTL_DEFHLIM 3 /* default Hop-Limit */ 573*199767f8SToomas Soome #ifdef notyet 574*199767f8SToomas Soome #define IPV6CTL_DEFMTU 4 /* default MTU */ 575*199767f8SToomas Soome #endif 576*199767f8SToomas Soome #define IPV6CTL_FORWSRCRT 5 /* forward source-routed dgrams */ 577*199767f8SToomas Soome #define IPV6CTL_STATS 6 /* stats */ 578*199767f8SToomas Soome #define IPV6CTL_MRTSTATS 7 /* multicast forwarding stats */ 579*199767f8SToomas Soome #define IPV6CTL_MRTPROTO 8 /* multicast routing protocol */ 580*199767f8SToomas Soome #define IPV6CTL_MAXFRAGPACKETS 9 /* max packets reassembly queue */ 581*199767f8SToomas Soome #define IPV6CTL_SOURCECHECK 10 /* verify source route and intf */ 582*199767f8SToomas Soome #define IPV6CTL_SOURCECHECK_LOGINT 11 /* minimume logging interval */ 583*199767f8SToomas Soome #define IPV6CTL_ACCEPT_RTADV 12 584*199767f8SToomas Soome /* 13; unused; was: IPV6CTL_KEEPFAITH */ 585*199767f8SToomas Soome #define IPV6CTL_LOG_INTERVAL 14 586*199767f8SToomas Soome #define IPV6CTL_HDRNESTLIMIT 15 587*199767f8SToomas Soome #define IPV6CTL_DAD_COUNT 16 588*199767f8SToomas Soome #define IPV6CTL_AUTO_FLOWLABEL 17 589*199767f8SToomas Soome #define IPV6CTL_DEFMCASTHLIM 18 590*199767f8SToomas Soome #define IPV6CTL_GIF_HLIM 19 /* default HLIM for gif encap packet */ 591*199767f8SToomas Soome #define IPV6CTL_KAME_VERSION 20 592*199767f8SToomas Soome #define IPV6CTL_USE_DEPRECATED 21 /* use deprecated addr (RFC2462 5.5.4) */ 593*199767f8SToomas Soome #define IPV6CTL_RR_PRUNE 22 /* walk timer for router renumbering */ 594*199767f8SToomas Soome #if 0 /* obsolete */ 595*199767f8SToomas Soome #define IPV6CTL_MAPPED_ADDR 23 596*199767f8SToomas Soome #endif 597*199767f8SToomas Soome #define IPV6CTL_V6ONLY 24 598*199767f8SToomas Soome /* IPV6CTL_RTEXPIRE 25 deprecated */ 599*199767f8SToomas Soome /* IPV6CTL_RTMINEXPIRE 26 deprecated */ 600*199767f8SToomas Soome /* IPV6CTL_RTMAXCACHE 27 deprecated */ 601*199767f8SToomas Soome 602*199767f8SToomas Soome #define IPV6CTL_USETEMPADDR 32 /* use temporary addresses (RFC3041) */ 603*199767f8SToomas Soome #define IPV6CTL_TEMPPLTIME 33 /* preferred lifetime for tmpaddrs */ 604*199767f8SToomas Soome #define IPV6CTL_TEMPVLTIME 34 /* valid lifetime for tmpaddrs */ 605*199767f8SToomas Soome #define IPV6CTL_AUTO_LINKLOCAL 35 /* automatic link-local addr assign */ 606*199767f8SToomas Soome #define IPV6CTL_RIP6STATS 36 /* raw_ip6 stats */ 607*199767f8SToomas Soome #define IPV6CTL_PREFER_TEMPADDR 37 /* prefer temporary addr as src */ 608*199767f8SToomas Soome #define IPV6CTL_ADDRCTLPOLICY 38 /* get/set address selection policy */ 609*199767f8SToomas Soome #define IPV6CTL_USE_DEFAULTZONE 39 /* use default scope zone */ 610*199767f8SToomas Soome 611*199767f8SToomas Soome #define IPV6CTL_MAXFRAGS 41 /* max fragments */ 612*199767f8SToomas Soome #if 0 613*199767f8SToomas Soome #define IPV6CTL_IFQ 42 /* ip6intrq node */ 614*199767f8SToomas Soome #define IPV6CTL_ISATAPRTR 43 /* isatap router */ 615*199767f8SToomas Soome #endif 616*199767f8SToomas Soome #define IPV6CTL_MCAST_PMTU 44 /* enable pMTU discovery for multicast? */ 617*199767f8SToomas Soome 618*199767f8SToomas Soome /* New entries should be added here from current IPV6CTL_MAXID value. */ 619*199767f8SToomas Soome /* to define items, should talk with KAME guys first, for *BSD compatibility */ 620*199767f8SToomas Soome #define IPV6CTL_STEALTH 45 621*199767f8SToomas Soome 622*199767f8SToomas Soome #define ICMPV6CTL_ND6_ONLINKNSRFC4861 47 623*199767f8SToomas Soome #define IPV6CTL_NO_RADR 48 /* No defroute from RA */ 624*199767f8SToomas Soome #define IPV6CTL_NORBIT_RAIF 49 /* Disable R-bit in NA on RA 625*199767f8SToomas Soome * receiving IF. */ 626*199767f8SToomas Soome #define IPV6CTL_RFC6204W3 50 /* Accept defroute even when forwarding 627*199767f8SToomas Soome enabled */ 628*199767f8SToomas Soome #define IPV6CTL_MAXID 51 629*199767f8SToomas Soome #endif /* __BSD_VISIBLE */ 630*199767f8SToomas Soome 631*199767f8SToomas Soome /* 632*199767f8SToomas Soome * Since both netinet/ and netinet6/ call into netipsec/ and netpfil/, 633*199767f8SToomas Soome * the protocol specific mbuf flags are shared between them. 634*199767f8SToomas Soome */ 635*199767f8SToomas Soome #define M_FASTFWD_OURS M_PROTO1 /* changed dst to local */ 636*199767f8SToomas Soome #define M_IP6_NEXTHOP M_PROTO2 /* explicit ip nexthop */ 637*199767f8SToomas Soome #define M_IP_NEXTHOP M_PROTO2 /* explicit ip nexthop */ 638*199767f8SToomas Soome #define M_SKIP_FIREWALL M_PROTO3 /* skip firewall processing */ 639*199767f8SToomas Soome #define M_AUTHIPHDR M_PROTO4 640*199767f8SToomas Soome #define M_DECRYPTED M_PROTO5 641*199767f8SToomas Soome #define M_LOOP M_PROTO6 642*199767f8SToomas Soome #define M_AUTHIPDGM M_PROTO7 643*199767f8SToomas Soome #define M_RTALERT_MLD M_PROTO8 644*199767f8SToomas Soome 645*199767f8SToomas Soome #ifdef _KERNEL 646*199767f8SToomas Soome struct cmsghdr; 647*199767f8SToomas Soome struct ip6_hdr; 648*199767f8SToomas Soome 649*199767f8SToomas Soome int in6_cksum_pseudo(struct ip6_hdr *, uint32_t, uint8_t, uint16_t); 650*199767f8SToomas Soome int in6_cksum(struct mbuf *, u_int8_t, u_int32_t, u_int32_t); 651*199767f8SToomas Soome int in6_cksum_partial(struct mbuf *, u_int8_t, u_int32_t, u_int32_t, 652*199767f8SToomas Soome u_int32_t); 653*199767f8SToomas Soome int in6_localaddr(struct in6_addr *); 654*199767f8SToomas Soome int in6_localip(struct in6_addr *); 655*199767f8SToomas Soome int in6_ifhasaddr(struct ifnet *, struct in6_addr *); 656*199767f8SToomas Soome int in6_addrscope(const struct in6_addr *); 657*199767f8SToomas Soome char *ip6_sprintf(char *, const struct in6_addr *); 658*199767f8SToomas Soome struct in6_ifaddr *in6_ifawithifp(struct ifnet *, struct in6_addr *); 659*199767f8SToomas Soome extern void in6_if_up(struct ifnet *); 660*199767f8SToomas Soome struct sockaddr; 661*199767f8SToomas Soome extern u_char ip6_protox[]; 662*199767f8SToomas Soome 663*199767f8SToomas Soome void in6_sin6_2_sin(struct sockaddr_in *sin, 664*199767f8SToomas Soome struct sockaddr_in6 *sin6); 665*199767f8SToomas Soome void in6_sin_2_v4mapsin6(struct sockaddr_in *sin, 666*199767f8SToomas Soome struct sockaddr_in6 *sin6); 667*199767f8SToomas Soome void in6_sin6_2_sin_in_sock(struct sockaddr *nam); 668*199767f8SToomas Soome void in6_sin_2_v4mapsin6_in_sock(struct sockaddr **nam); 669*199767f8SToomas Soome extern void addrsel_policy_init(void); 670*199767f8SToomas Soome 671*199767f8SToomas Soome #define satosin6(sa) ((struct sockaddr_in6 *)(sa)) 672*199767f8SToomas Soome #define sin6tosa(sin6) ((struct sockaddr *)(sin6)) 673*199767f8SToomas Soome #define ifatoia6(ifa) ((struct in6_ifaddr *)(ifa)) 674*199767f8SToomas Soome 675*199767f8SToomas Soome #endif /* _KERNEL */ 676*199767f8SToomas Soome 677*199767f8SToomas Soome #ifndef _SIZE_T_DECLARED 678*199767f8SToomas Soome typedef __size_t size_t; 679*199767f8SToomas Soome #define _SIZE_T_DECLARED 680*199767f8SToomas Soome #endif 681*199767f8SToomas Soome 682*199767f8SToomas Soome #ifndef _SOCKLEN_T_DECLARED 683*199767f8SToomas Soome typedef __socklen_t socklen_t; 684*199767f8SToomas Soome #define _SOCKLEN_T_DECLARED 685*199767f8SToomas Soome #endif 686*199767f8SToomas Soome 687*199767f8SToomas Soome #if __BSD_VISIBLE 688*199767f8SToomas Soome 689*199767f8SToomas Soome __BEGIN_DECLS 690*199767f8SToomas Soome struct cmsghdr; 691*199767f8SToomas Soome 692*199767f8SToomas Soome extern int inet6_option_space(int); 693*199767f8SToomas Soome extern int inet6_option_init(void *, struct cmsghdr **, int); 694*199767f8SToomas Soome extern int inet6_option_append(struct cmsghdr *, const uint8_t *, 695*199767f8SToomas Soome int, int); 696*199767f8SToomas Soome extern uint8_t *inet6_option_alloc(struct cmsghdr *, int, int, int); 697*199767f8SToomas Soome extern int inet6_option_next(const struct cmsghdr *, uint8_t **); 698*199767f8SToomas Soome extern int inet6_option_find(const struct cmsghdr *, uint8_t **, int); 699*199767f8SToomas Soome 700*199767f8SToomas Soome extern size_t inet6_rthdr_space(int, int); 701*199767f8SToomas Soome extern struct cmsghdr *inet6_rthdr_init(void *, int); 702*199767f8SToomas Soome extern int inet6_rthdr_add(struct cmsghdr *, const struct in6_addr *, 703*199767f8SToomas Soome unsigned int); 704*199767f8SToomas Soome extern int inet6_rthdr_lasthop(struct cmsghdr *, unsigned int); 705*199767f8SToomas Soome #if 0 /* not implemented yet */ 706*199767f8SToomas Soome extern int inet6_rthdr_reverse(const struct cmsghdr *, struct cmsghdr *); 707*199767f8SToomas Soome #endif 708*199767f8SToomas Soome extern int inet6_rthdr_segments(const struct cmsghdr *); 709*199767f8SToomas Soome extern struct in6_addr *inet6_rthdr_getaddr(struct cmsghdr *, int); 710*199767f8SToomas Soome extern int inet6_rthdr_getflags(const struct cmsghdr *, int); 711*199767f8SToomas Soome 712*199767f8SToomas Soome extern int inet6_opt_init(void *, socklen_t); 713*199767f8SToomas Soome extern int inet6_opt_append(void *, socklen_t, int, uint8_t, socklen_t, 714*199767f8SToomas Soome uint8_t, void **); 715*199767f8SToomas Soome extern int inet6_opt_finish(void *, socklen_t, int); 716*199767f8SToomas Soome extern int inet6_opt_set_val(void *, int, void *, socklen_t); 717*199767f8SToomas Soome 718*199767f8SToomas Soome extern int inet6_opt_next(void *, socklen_t, int, uint8_t *, socklen_t *, 719*199767f8SToomas Soome void **); 720*199767f8SToomas Soome extern int inet6_opt_find(void *, socklen_t, int, uint8_t, socklen_t *, 721*199767f8SToomas Soome void **); 722*199767f8SToomas Soome extern int inet6_opt_get_val(void *, int, void *, socklen_t); 723*199767f8SToomas Soome extern socklen_t inet6_rth_space(int, int); 724*199767f8SToomas Soome extern void *inet6_rth_init(void *, socklen_t, int, int); 725*199767f8SToomas Soome extern int inet6_rth_add(void *, const struct in6_addr *); 726*199767f8SToomas Soome extern int inet6_rth_reverse(const void *, void *); 727*199767f8SToomas Soome extern int inet6_rth_segments(const void *); 728*199767f8SToomas Soome extern struct in6_addr *inet6_rth_getaddr(const void *, int); 729*199767f8SToomas Soome __END_DECLS 730*199767f8SToomas Soome 731*199767f8SToomas Soome #endif /* __BSD_VISIBLE */ 732*199767f8SToomas Soome 733*199767f8SToomas Soome #endif /* !_NETINET6_IN6_H_ */ 734