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