1 /* 2 * Copyright (c) 2008-2020 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 29 /* 30 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 31 * All rights reserved. 32 * 33 * Redistribution and use in source and binary forms, with or without 34 * modification, are permitted provided that the following conditions 35 * are met: 36 * 1. Redistributions of source code must retain the above copyright 37 * notice, this list of conditions and the following disclaimer. 38 * 2. Redistributions in binary form must reproduce the above copyright 39 * notice, this list of conditions and the following disclaimer in the 40 * documentation and/or other materials provided with the distribution. 41 * 3. Neither the name of the project nor the names of its contributors 42 * may be used to endorse or promote products derived from this software 43 * without specific prior written permission. 44 * 45 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 48 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 55 * SUCH DAMAGE. 56 */ 57 58 /* 59 * Copyright (c) 1982, 1986, 1990, 1993 60 * The Regents of the University of California. All rights reserved. 61 * 62 * Redistribution and use in source and binary forms, with or without 63 * modification, are permitted provided that the following conditions 64 * are met: 65 * 1. Redistributions of source code must retain the above copyright 66 * notice, this list of conditions and the following disclaimer. 67 * 2. Redistributions in binary form must reproduce the above copyright 68 * notice, this list of conditions and the following disclaimer in the 69 * documentation and/or other materials provided with the distribution. 70 * 3. All advertising materials mentioning features or use of this software 71 * must display the following acknowledgement: 72 * This product includes software developed by the University of 73 * California, Berkeley and its contributors. 74 * 4. Neither the name of the University nor the names of its contributors 75 * may be used to endorse or promote products derived from this software 76 * without specific prior written permission. 77 * 78 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 79 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 80 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 81 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 82 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 83 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 84 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 85 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 86 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 87 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 88 * SUCH DAMAGE. 89 * 90 * @(#)in.h 8.3 (Berkeley) 1/3/94 91 */ 92 93 #ifndef DRIVERKIT 94 #ifndef __KAME_NETINET_IN_H_INCLUDED_ 95 #error "do not include netinet6/in6.h directly, include netinet/in.h. " \ 96 " see RFC2553" 97 #endif 98 #endif /* DRIVERKIT */ 99 100 #ifndef _NETINET6_IN6_H_ 101 #define _NETINET6_IN6_H_ 102 #ifndef DRIVERKIT 103 #include <sys/appleapiopts.h> 104 #else 105 #include <sys/_types/_in_port_t.h> 106 #endif /* DRIVERKIT */ 107 108 #include <sys/_types.h> 109 #include <sys/_types/_sa_family_t.h> 110 111 /* 112 * Identification of the network protocol stack 113 * for *BSD-current/release: http://www.kame.net/dev/cvsweb.cgi/kame/COVERAGE 114 * has the table of implementation/integration differences. 115 */ 116 #define __KAME__ 117 #define __KAME_VERSION "2009/apple-darwin" 118 119 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 120 /* 121 * Local port number conventions: 122 * 123 * Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root), 124 * unless a kernel is compiled with IPNOPRIVPORTS defined. 125 * 126 * When a user does a bind(2) or connect(2) with a port number of zero, 127 * a non-conflicting local port address is chosen. 128 * 129 * The default range is IPPORT_ANONMIN to IPPORT_ANONMAX, although 130 * that is settable by sysctl(3); net.inet.ip.anonportmin and 131 * net.inet.ip.anonportmax respectively. 132 * 133 * A user may set the IPPROTO_IP option IP_PORTRANGE to change this 134 * default assignment range. 135 * 136 * The value IP_PORTRANGE_DEFAULT causes the default behavior. 137 * 138 * The value IP_PORTRANGE_HIGH is the same as IP_PORTRANGE_DEFAULT, 139 * and exists only for FreeBSD compatibility purposes. 140 * 141 * The value IP_PORTRANGE_LOW changes the range to the "low" are 142 * that is (by convention) restricted to privileged processes. 143 * This convention is based on "vouchsafe" principles only. 144 * It is only secure if you trust the remote host to restrict these ports. 145 * The range is IPPORT_RESERVEDMIN to IPPORT_RESERVEDMAX. 146 */ 147 148 #define IPV6PORT_RESERVED 1024 149 #define IPV6PORT_ANONMIN 49152 150 #define IPV6PORT_ANONMAX 65535 151 #define IPV6PORT_RESERVEDMIN 600 152 #define IPV6PORT_RESERVEDMAX (IPV6PORT_RESERVED-1) 153 #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 154 155 /* 156 * IPv6 address 157 */ 158 typedef struct in6_addr { 159 union { 160 __uint8_t __u6_addr8[16]; 161 __uint16_t __u6_addr16[8]; 162 __uint32_t __u6_addr32[4]; 163 } __u6_addr; /* 128-bit IP6 address */ 164 } in6_addr_t; 165 166 #define s6_addr __u6_addr.__u6_addr8 167 #ifdef KERNEL /* XXX nonstandard */ 168 #define s6_addr8 __u6_addr.__u6_addr8 169 #define s6_addr16 __u6_addr.__u6_addr16 170 #define s6_addr32 __u6_addr.__u6_addr32 171 #endif 172 173 #define INET6_ADDRSTRLEN 46 174 175 /* 176 * Socket address for IPv6 177 */ 178 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 179 #define SIN6_LEN 180 #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 181 struct sockaddr_in6 { 182 __uint8_t sin6_len; /* length of this struct(sa_family_t) */ 183 sa_family_t sin6_family; /* AF_INET6 (sa_family_t) */ 184 in_port_t sin6_port; /* Transport layer port # (in_port_t) */ 185 __uint32_t sin6_flowinfo; /* IP6 flow information */ 186 struct in6_addr sin6_addr; /* IP6 address */ 187 __uint32_t sin6_scope_id; /* scope zone index */ 188 }; 189 190 #ifdef KERNEL /* XXX nonstandard */ 191 /* 192 * Local definition for masks 193 */ 194 #define IN6MASK0 {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}} 195 #define IN6MASK7 {{{ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 197 #define IN6MASK8 {{{ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 199 #define IN6MASK16 {{{ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 201 #define IN6MASK32 {{{ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, \ 202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 203 #define IN6MASK64 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ 204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 205 #define IN6MASK96 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ 206 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}} 207 #define IN6MASK128 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ 208 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}} 209 #endif 210 211 #ifndef XNU_PLATFORM_DriverKit 212 213 #ifdef KERNEL /* XXX nonstandard */ 214 /* 215 * Macros started with IPV6_ADDR is KAME local 216 */ 217 #if BYTE_ORDER == BIG_ENDIAN 218 #define IPV6_ADDR_INT32_ONE 1 219 #define IPV6_ADDR_INT32_TWO 2 220 #define IPV6_ADDR_INT32_MNL 0xff010000 221 #define IPV6_ADDR_INT32_MLL 0xff020000 222 #define IPV6_ADDR_INT32_SMP 0x0000ffff 223 #define IPV6_ADDR_INT16_ULL 0xfe80 224 #define IPV6_ADDR_INT16_USL 0xfec0 225 #define IPV6_ADDR_INT16_MLL 0xff02 226 #elif BYTE_ORDER == LITTLE_ENDIAN 227 #define IPV6_ADDR_INT32_ONE 0x01000000 228 #define IPV6_ADDR_INT32_TWO 0x02000000 229 #define IPV6_ADDR_INT32_MNL 0x000001ff 230 #define IPV6_ADDR_INT32_MLL 0x000002ff 231 #define IPV6_ADDR_INT32_SMP 0xffff0000 232 #define IPV6_ADDR_INT16_ULL 0x80fe 233 #define IPV6_ADDR_INT16_USL 0xc0fe 234 #define IPV6_ADDR_INT16_MLL 0x02ff 235 #endif 236 #endif 237 238 /* 239 * Definition of some useful macros to handle IP6 addresses 240 */ 241 #define IN6ADDR_ANY_INIT \ 242 {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 244 #define IN6ADDR_LOOPBACK_INIT \ 245 {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 247 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 248 #define IN6ADDR_NODELOCAL_ALLNODES_INIT \ 249 {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 251 #define IN6ADDR_INTFACELOCAL_ALLNODES_INIT \ 252 {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 254 #define IN6ADDR_LINKLOCAL_ALLNODES_INIT \ 255 {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 257 #define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \ 258 {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 259 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}} 260 #define IN6ADDR_LINKLOCAL_ALLV2ROUTERS_INIT \ 261 {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16 }}} 263 #define IN6ADDR_V4MAPPED_INIT \ 264 {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 265 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}} 266 #define IN6ADDR_MULTICAST_PREFIX IN6MASK8 267 #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 268 269 extern const struct in6_addr in6addr_any; 270 extern const struct in6_addr in6addr_loopback; 271 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 272 extern const struct in6_addr in6addr_nodelocal_allnodes; 273 extern const struct in6_addr in6addr_linklocal_allnodes; 274 extern const struct in6_addr in6addr_linklocal_allrouters; 275 extern const struct in6_addr in6addr_linklocal_allv2routers; 276 #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 277 278 /* 279 * Equality 280 * NOTE: Some of kernel programming environment (for example, openbsd/sparc) 281 * does not supply memcmp(). For userland memcmp() is preferred as it is 282 * in ANSI standard. 283 */ 284 #ifdef KERNEL 285 #define IN6_ARE_ADDR_EQUAL(a, b) \ 286 (bcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], \ 287 sizeof (struct in6_addr)) == 0) 288 #else 289 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 290 #define IN6_ARE_ADDR_EQUAL(a, b) \ 291 (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof (struct in6_addr)) \ 292 == 0) 293 #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 294 #endif 295 296 #ifdef KERNEL /* non standard */ 297 /* see if two addresses are equal in a scope-conscious manner. */ 298 #define SA6_ARE_ADDR_EQUAL(a, b) \ 299 (((a)->sin6_scope_id == 0 || (b)->sin6_scope_id == 0 || \ 300 ((a)->sin6_scope_id == (b)->sin6_scope_id)) && \ 301 (bcmp(&(a)->sin6_addr, &(b)->sin6_addr, sizeof (struct in6_addr)) == 0)) 302 #endif 303 304 /* 305 * Unspecified 306 */ 307 #define IN6_IS_ADDR_UNSPECIFIED(a) \ 308 ((*(const __uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ 309 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ 310 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ 311 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[12]) == 0)) 312 313 /* 314 * Loopback 315 */ 316 #define IN6_IS_ADDR_LOOPBACK(a) \ 317 ((*(const __uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ 318 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ 319 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ 320 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[12]) == ntohl(1))) 321 322 /* 323 * IPv4 compatible 324 */ 325 #define IN6_IS_ADDR_V4COMPAT(a) \ 326 ((*(const __uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ 327 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ 328 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ 329 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[12]) != 0) && \ 330 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[12]) != ntohl(1))) 331 332 /* 333 * Mapped 334 */ 335 #define IN6_IS_ADDR_V4MAPPED(a) \ 336 ((*(const __uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ 337 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ 338 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[8]) == \ 339 ntohl(0x0000ffff))) 340 341 /* 342 * 6to4 343 */ 344 #define IN6_IS_ADDR_6TO4(x) (ntohs((x)->s6_addr16[0]) == 0x2002) 345 346 /* 347 * KAME Scope Values 348 */ 349 350 #ifdef KERNEL /* XXX nonstandard */ 351 #define IPV6_ADDR_SCOPE_NODELOCAL 0x01 352 #define IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 353 #define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 354 #define IPV6_ADDR_SCOPE_SITELOCAL 0x05 355 #define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* just used in this file */ 356 #define IPV6_ADDR_SCOPE_GLOBAL 0x0e 357 #else 358 #define __IPV6_ADDR_SCOPE_NODELOCAL 0x01 359 #define __IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 360 #define __IPV6_ADDR_SCOPE_LINKLOCAL 0x02 361 #define __IPV6_ADDR_SCOPE_SITELOCAL 0x05 362 #define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* just used in this file */ 363 #define __IPV6_ADDR_SCOPE_GLOBAL 0x0e 364 #endif 365 366 /* 367 * Unicast Scope 368 * Note that we must check topmost 10 bits only, not 16 bits (see RFC2373). 369 */ 370 #define IN6_IS_ADDR_LINKLOCAL(a) \ 371 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80)) 372 #define IN6_IS_ADDR_SITELOCAL(a) \ 373 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0)) 374 375 /* 376 * Multicast 377 */ 378 #define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff) 379 380 #define IPV6_ADDR_MC_FLAGS(a) ((a)->s6_addr[1] & 0xf0) 381 382 #define IPV6_ADDR_MC_FLAGS_TRANSIENT 0x10 383 #define IPV6_ADDR_MC_FLAGS_PREFIX 0x20 384 #define IPV6_ADDR_MC_FLAGS_UNICAST_BASED (IPV6_ADDR_MC_FLAGS_TRANSIENT | IPV6_ADDR_MC_FLAGS_PREFIX) 385 386 #define IN6_IS_ADDR_UNICAST_BASED_MULTICAST(a) \ 387 (IN6_IS_ADDR_MULTICAST(a) && \ 388 (IPV6_ADDR_MC_FLAGS(a) == IPV6_ADDR_MC_FLAGS_UNICAST_BASED)) 389 390 /* 391 * Unique Local IPv6 Unicast Addresses (per RFC 4193) 392 */ 393 #define IN6_IS_ADDR_UNIQUE_LOCAL(a) \ 394 (((a)->s6_addr[0] == 0xfc) || ((a)->s6_addr[0] == 0xfd)) 395 396 #ifdef KERNEL /* XXX nonstandard */ 397 #define IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) 398 #else 399 #define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) 400 #endif 401 402 /* 403 * Multicast Scope 404 */ 405 #ifdef KERNEL /* refers nonstandard items */ 406 #define IN6_IS_ADDR_MC_UNICAST_BASED_LINKLOCAL(a) \ 407 (IN6_IS_ADDR_MULTICAST(a) && \ 408 (IPV6_ADDR_MC_FLAGS(a) == IPV6_ADDR_MC_FLAGS_UNICAST_BASED) && \ 409 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL)) 410 #define IN6_IS_ADDR_MC_NODELOCAL(a) \ 411 (IN6_IS_ADDR_MULTICAST(a) && \ 412 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL)) 413 #define IN6_IS_ADDR_MC_INTFACELOCAL(a) \ 414 (IN6_IS_ADDR_MULTICAST(a) && \ 415 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_INTFACELOCAL)) 416 #define IN6_IS_ADDR_MC_LINKLOCAL(a) \ 417 (IN6_IS_ADDR_MULTICAST(a) && \ 418 (IPV6_ADDR_MC_FLAGS(a) != IPV6_ADDR_MC_FLAGS_UNICAST_BASED) && \ 419 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL)) 420 #define IN6_IS_ADDR_MC_SITELOCAL(a) \ 421 (IN6_IS_ADDR_MULTICAST(a) && \ 422 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL)) 423 #define IN6_IS_ADDR_MC_ORGLOCAL(a) \ 424 (IN6_IS_ADDR_MULTICAST(a) && \ 425 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL)) 426 #define IN6_IS_ADDR_MC_GLOBAL(a) \ 427 (IN6_IS_ADDR_MULTICAST(a) && \ 428 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL)) 429 #else 430 #define IN6_IS_ADDR_MC_NODELOCAL(a) \ 431 (IN6_IS_ADDR_MULTICAST(a) && \ 432 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL)) 433 #define IN6_IS_ADDR_MC_LINKLOCAL(a) \ 434 (IN6_IS_ADDR_MULTICAST(a) && \ 435 (IPV6_ADDR_MC_FLAGS(a) != IPV6_ADDR_MC_FLAGS_UNICAST_BASED) && \ 436 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL)) 437 #define IN6_IS_ADDR_MC_SITELOCAL(a) \ 438 (IN6_IS_ADDR_MULTICAST(a) && \ 439 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL)) 440 #define IN6_IS_ADDR_MC_ORGLOCAL(a) \ 441 (IN6_IS_ADDR_MULTICAST(a) && \ 442 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL)) 443 #define IN6_IS_ADDR_MC_GLOBAL(a) \ 444 (IN6_IS_ADDR_MULTICAST(a) && \ 445 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL)) 446 #endif 447 448 #ifdef KERNEL /* nonstandard */ 449 /* 450 * KAME Scope 451 */ 452 #define IN6_IS_SCOPE_LINKLOCAL(a) \ 453 ((IN6_IS_ADDR_LINKLOCAL(a)) || \ 454 (IN6_IS_ADDR_MC_LINKLOCAL(a))) 455 456 #define IN6_IS_SCOPE_EMBED(a) \ 457 ((IN6_IS_ADDR_LINKLOCAL(a)) || \ 458 (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \ 459 (IN6_IS_ADDR_MC_INTFACELOCAL(a))) 460 461 #define IFA6_IS_DEPRECATED(a, t) \ 462 ((a)->ia6_lifetime.ia6ti_preferred != 0 && \ 463 (a)->ia6_lifetime.ia6ti_preferred < (t)) 464 #define IFA6_IS_INVALID(a, t) \ 465 ((a)->ia6_lifetime.ia6ti_expire != 0 && \ 466 (a)->ia6_lifetime.ia6ti_expire < (t)) 467 #endif /* KERNEL */ 468 469 /* 470 * Options for use with [gs]etsockopt at the IPV6 level. 471 * First word of comment is data type; bool is stored in int. 472 */ 473 /* no hdrincl */ 474 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 475 /* 476 * RFC 3542 define the following socket options in a manner incompatible 477 * with RFC 2292: 478 * IPV6_PKTINFO 479 * IPV6_HOPLIMIT 480 * IPV6_NEXTHOP 481 * IPV6_HOPOPTS 482 * IPV6_DSTOPTS 483 * IPV6_RTHDR 484 * 485 * To use the new IPv6 Sockets options introduced by RFC 3542 486 * the constant __APPLE_USE_RFC_3542 must be defined before 487 * including <netinet/in.h> 488 * 489 * To use the old IPv6 Sockets options from RFC 2292 490 * the constant __APPLE_USE_RFC_2292 must be defined before 491 * including <netinet/in.h> 492 * 493 * Note that eventually RFC 3542 is going to be the 494 * default and RFC 2292 will be obsolete. 495 */ 496 #ifdef BSD_KERNEL_PRIVATE 497 #define __APPLE_USE_RFC_3542 1 498 #endif /* BSD_KERNEL_PRIVATE */ 499 500 #if defined(__APPLE_USE_RFC_3542) && defined(__APPLE_USE_RFC_2292) 501 #error "__APPLE_USE_RFC_3542 and __APPLE_USE_RFC_2292 cannot be both defined" 502 #endif 503 504 #if 0 /* the followings are relic in IPv4 and hence are disabled */ 505 #define IPV6_OPTIONS 1 /* buf/ip6_opts; set/get IP6 options */ 506 #define IPV6_RECVOPTS 5 /* bool; receive all IP6 opts w/dgram */ 507 #define IPV6_RECVRETOPTS 6 /* bool; receive IP6 opts for response */ 508 #define IPV6_RECVDSTADDR 7 /* bool; receive IP6 dst addr w/dgram */ 509 #define IPV6_RETOPTS 8 /* ip6_opts; set/get IP6 options */ 510 #endif /* 0 */ 511 #define IPV6_SOCKOPT_RESERVED1 3 /* reserved for future use */ 512 #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 513 #define IPV6_UNICAST_HOPS 4 /* int; IP6 hops */ 514 #define IPV6_MULTICAST_IF 9 /* u_int; set/get IP6 multicast i/f */ 515 #define IPV6_MULTICAST_HOPS 10 /* int; set/get IP6 multicast hops */ 516 #define IPV6_MULTICAST_LOOP 11 /* u_int; set/get IP6 mcast loopback */ 517 #define IPV6_JOIN_GROUP 12 /* ip6_mreq; join a group membership */ 518 #define IPV6_LEAVE_GROUP 13 /* ip6_mreq; leave a group membership */ 519 520 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 521 #define IPV6_PORTRANGE 14 /* int; range to choose for unspec port */ 522 #define ICMP6_FILTER 18 /* icmp6_filter; icmp6 filter */ 523 #define IPV6_2292PKTINFO 19 /* bool; send/recv if, src/dst addr */ 524 #define IPV6_2292HOPLIMIT 20 /* bool; hop limit */ 525 #define IPV6_2292NEXTHOP 21 /* bool; next hop addr */ 526 #define IPV6_2292HOPOPTS 22 /* bool; hop-by-hop option */ 527 #define IPV6_2292DSTOPTS 23 /* bool; destinaion option */ 528 #define IPV6_2292RTHDR 24 /* ip6_rthdr: routing header */ 529 530 /* buf/cmsghdr; set/get IPv6 options [obsoleted by RFC3542] */ 531 #define IPV6_2292PKTOPTIONS 25 532 533 #ifdef __APPLE_USE_RFC_2292 534 #define IPV6_PKTINFO IPV6_2292PKTINFO 535 #define IPV6_HOPLIMIT IPV6_2292HOPLIMIT 536 #define IPV6_NEXTHOP IPV6_2292NEXTHOP 537 #define IPV6_HOPOPTS IPV6_2292HOPOPTS 538 #define IPV6_DSTOPTS IPV6_2292DSTOPTS 539 #define IPV6_RTHDR IPV6_2292RTHDR 540 #define IPV6_PKTOPTIONS IPV6_2292PKTOPTIONS 541 #endif /* __APPLE_USE_RFC_2292 */ 542 543 #define IPV6_CHECKSUM 26 /* int; checksum offset for raw socket */ 544 #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 545 #define IPV6_V6ONLY 27 /* bool; only bind INET6 at wildcard bind */ 546 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 547 #ifndef KERNEL 548 #define IPV6_BINDV6ONLY IPV6_V6ONLY 549 #endif /* KERNEL */ 550 551 552 #if 1 /* IPSEC */ 553 #define IPV6_IPSEC_POLICY 28 /* struct; get/set security policy */ 554 #endif /* 1 */ 555 #define IPV6_FAITH 29 /* deprecated */ 556 557 #if 1 /* IPV6FIREWALL */ 558 #define IPV6_FW_ADD 30 /* add a firewall rule to chain */ 559 #define IPV6_FW_DEL 31 /* delete a firewall rule from chain */ 560 #define IPV6_FW_FLUSH 32 /* flush firewall rule chain */ 561 #define IPV6_FW_ZERO 33 /* clear single/all firewall counter(s) */ 562 #define IPV6_FW_GET 34 /* get entire firewall rule chain */ 563 #endif /* 1 */ 564 565 /* 566 * APPLE: NOTE the value of those 2 options is kept unchanged from 567 * previous version of darwin/OS X for binary compatibility reasons 568 * and differ from FreeBSD (values 57 and 61). See below. 569 */ 570 #define IPV6_RECVTCLASS 35 /* bool; recv traffic class values */ 571 #define IPV6_TCLASS 36 /* int; send traffic class value */ 572 573 #ifdef __APPLE_USE_RFC_3542 574 /* new socket options introduced in RFC3542 */ 575 /* 576 * ip6_dest; send dst option before rthdr 577 * APPLE: Value purposely different than FreeBSD (35) to avoid 578 * collision with definition of IPV6_RECVTCLASS in previous 579 * darwin implementations 580 */ 581 #define IPV6_RTHDRDSTOPTS 57 582 583 /* 584 * bool; recv if, dst addr 585 * APPLE: Value purposely different than FreeBSD(36) to avoid 586 * collision with definition of IPV6_TCLASS in previous 587 * darwin implementations 588 */ 589 #define IPV6_RECVPKTINFO 61 590 591 #define IPV6_RECVHOPLIMIT 37 /* bool; recv hop limit */ 592 #define IPV6_RECVRTHDR 38 /* bool; recv routing header */ 593 #define IPV6_RECVHOPOPTS 39 /* bool; recv hop-by-hop option */ 594 #define IPV6_RECVDSTOPTS 40 /* bool; recv dst option after rthdr */ 595 #ifdef KERNEL 596 #define IPV6_RECVRTHDRDSTOPTS 41 /* bool; recv dst option before rthdr */ 597 #endif 598 599 #define IPV6_USE_MIN_MTU 42 /* bool; send packets at the minimum MTU */ 600 #define IPV6_RECVPATHMTU 43 /* bool; notify an according MTU */ 601 602 /* 603 * mtuinfo; get the current path MTU (sopt), 4 bytes int; 604 * MTU notification (cmsg) 605 */ 606 #define IPV6_PATHMTU 44 607 608 #if 0 /* obsoleted during 2292bis -> 3542 */ 609 /* no data; ND reachability confirm (cmsg only/not in of RFC3542) */ 610 #define IPV6_REACHCONF 45 611 #endif 612 /* more new socket options introduced in RFC3542 */ 613 #define IPV6_3542PKTINFO 46 /* in6_pktinfo; send if, src addr */ 614 #define IPV6_3542HOPLIMIT 47 /* int; send hop limit */ 615 #define IPV6_3542NEXTHOP 48 /* sockaddr; next hop addr */ 616 #define IPV6_3542HOPOPTS 49 /* ip6_hbh; send hop-by-hop option */ 617 #define IPV6_3542DSTOPTS 50 /* ip6_dest; send dst option befor rthdr */ 618 #define IPV6_3542RTHDR 51 /* ip6_rthdr; send routing header */ 619 620 #define IPV6_PKTINFO IPV6_3542PKTINFO 621 #define IPV6_HOPLIMIT IPV6_3542HOPLIMIT 622 #define IPV6_NEXTHOP IPV6_3542NEXTHOP 623 #define IPV6_HOPOPTS IPV6_3542HOPOPTS 624 #define IPV6_DSTOPTS IPV6_3542DSTOPTS 625 #define IPV6_RTHDR IPV6_3542RTHDR 626 627 #define IPV6_AUTOFLOWLABEL 59 /* bool; attach flowlabel automagically */ 628 629 #define IPV6_DONTFRAG 62 /* bool; disable IPv6 fragmentation */ 630 631 /* int; prefer temporary addresses as the source address. */ 632 #define IPV6_PREFER_TEMPADDR 63 633 634 /* 635 * The following option is private; do not use it from user applications. 636 * It is deliberately defined to the same value as IP_MSFILTER. 637 */ 638 #define IPV6_MSFILTER 74 /* struct __msfilterreq; */ 639 #endif /* __APPLE_USE_RFC_3542 */ 640 641 #define IPV6_BOUND_IF 125 /* int; set/get bound interface */ 642 643 /* to define items, should talk with KAME guys first, for *BSD compatibility */ 644 645 #define IPV6_RTHDR_LOOSE 0 /* this hop need not be a neighbor. */ 646 #define IPV6_RTHDR_STRICT 1 /* this hop must be a neighbor. */ 647 #define IPV6_RTHDR_TYPE_0 0 /* IPv6 routing header type 0 */ 648 649 /* 650 * Defaults and limits for options 651 */ 652 #define IPV6_DEFAULT_MULTICAST_HOPS 1 /* normally limit m'casts to 1 hop */ 653 #define IPV6_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ 654 655 /* 656 * The im6o_membership vector for each socket is now dynamically allocated at 657 * run-time, bounded by USHRT_MAX, and is reallocated when needed, sized 658 * according to a power-of-two increment. 659 */ 660 #define IPV6_MIN_MEMBERSHIPS 31 661 #define IPV6_MAX_MEMBERSHIPS 4095 662 663 /* 664 * Default resource limits for IPv6 multicast source filtering. 665 * These may be modified by sysctl. 666 */ 667 #define IPV6_MAX_GROUP_SRC_FILTER 512 /* sources per group */ 668 #define IPV6_MAX_SOCK_SRC_FILTER 128 /* sources per socket/group */ 669 670 /* 671 * Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP. 672 */ 673 struct ipv6_mreq { 674 struct in6_addr ipv6mr_multiaddr; 675 unsigned int ipv6mr_interface; 676 }; 677 678 /* 679 * IPV6_2292PKTINFO: Packet information(RFC2292 sec 5) 680 */ 681 struct in6_pktinfo { 682 struct in6_addr ipi6_addr; /* src/dst IPv6 address */ 683 unsigned int ipi6_ifindex; /* send/recv interface index */ 684 }; 685 686 /* 687 * Control structure for IPV6_RECVPATHMTU socket option. 688 */ 689 struct ip6_mtuinfo { 690 struct sockaddr_in6 ip6m_addr; /* or sockaddr_storage? */ 691 uint32_t ip6m_mtu; 692 }; 693 694 /* 695 * Argument for IPV6_PORTRANGE: 696 * - which range to search when port is unspecified at bind() or connect() 697 */ 698 #define IPV6_PORTRANGE_DEFAULT 0 /* default range */ 699 #define IPV6_PORTRANGE_HIGH 1 /* "high" - request firewall bypass */ 700 #define IPV6_PORTRANGE_LOW 2 /* "low" - vouchsafe security */ 701 702 /* 703 * Definitions for inet6 sysctl operations. 704 * 705 * Third level is protocol number. 706 * Fourth level is desired variable within that protocol. 707 */ 708 #define IPV6PROTO_MAXID (IPPROTO_PIM + 1) /* don't list to IPV6PROTO_MAX */ 709 710 /* 711 * Names for IP sysctl objects 712 */ 713 #define IPV6CTL_FORWARDING 1 /* act as router */ 714 #define IPV6CTL_SENDREDIRECTS 2 /* may send redirects when forwarding */ 715 #define IPV6CTL_DEFHLIM 3 /* default Hop-Limit */ 716 #ifdef notyet 717 #define IPV6CTL_DEFMTU 4 /* default MTU */ 718 #endif 719 #define IPV6CTL_FORWSRCRT 5 /* forward source-routed dgrams */ 720 #define IPV6CTL_STATS 6 /* stats */ 721 #define IPV6CTL_MRTSTATS 7 /* multicast forwarding stats */ 722 #define IPV6CTL_MRTPROTO 8 /* multicast routing protocol */ 723 #define IPV6CTL_MAXFRAGPACKETS 9 /* max packets reassembly queue */ 724 #define IPV6CTL_SOURCECHECK 10 /* verify source route and intf */ 725 #define IPV6CTL_SOURCECHECK_LOGINT 11 /* minimume logging interval */ 726 #define IPV6CTL_ACCEPT_RTADV 12 727 #define IPV6CTL_KEEPFAITH 13 /* deprecated */ 728 #define IPV6CTL_LOG_INTERVAL 14 729 #define IPV6CTL_HDRNESTLIMIT 15 730 #define IPV6CTL_DAD_COUNT 16 731 #define IPV6CTL_AUTO_FLOWLABEL 17 732 #define IPV6CTL_DEFMCASTHLIM 18 733 #define IPV6CTL_GIF_HLIM 19 /* default HLIM for gif encap packet */ 734 #define IPV6CTL_KAME_VERSION 20 735 #define IPV6CTL_USE_DEPRECATED 21 /* use deprec addr (RFC2462 5.5.4) */ 736 #define IPV6CTL_RR_PRUNE 22 /* walk timer for router renumbering */ 737 #if 0 /* obsolete */ 738 #define IPV6CTL_MAPPED_ADDR 23 739 #endif 740 #define IPV6CTL_V6ONLY 24 741 #define IPV6CTL_RTEXPIRE 25 /* cloned route expiration time */ 742 #define IPV6CTL_RTMINEXPIRE 26 /* min value for expiration time */ 743 #define IPV6CTL_RTMAXCACHE 27 /* trigger level for dynamic expire */ 744 745 #define IPV6CTL_USETEMPADDR 32 /* use temporary addresses [RFC 4941] */ 746 #define IPV6CTL_TEMPPLTIME 33 /* preferred lifetime for tmpaddrs */ 747 #define IPV6CTL_TEMPVLTIME 34 /* valid lifetime for tmpaddrs */ 748 #define IPV6CTL_AUTO_LINKLOCAL 35 /* automatic link-local addr assign */ 749 #define IPV6CTL_RIP6STATS 36 /* raw_ip6 stats */ 750 #define IPV6CTL_PREFER_TEMPADDR 37 /* prefer temporary addr as src */ 751 #define IPV6CTL_ADDRCTLPOLICY 38 /* get/set address selection policy */ 752 #define IPV6CTL_USE_DEFAULTZONE 39 /* use default scope zone */ 753 754 #define IPV6CTL_MAXFRAGS 41 /* max fragments */ 755 #define IPV6CTL_MCAST_PMTU 44 /* enable pMTU discovery for mcast? */ 756 757 #define IPV6CTL_NEIGHBORGCTHRESH 46 758 #define IPV6CTL_MAXIFPREFIXES 47 759 #define IPV6CTL_MAXIFDEFROUTERS 48 760 #define IPV6CTL_MAXDYNROUTES 49 761 #define ICMPV6CTL_ND6_ONLINKNSRFC4861 50 762 #define IPV6CTL_ULA_USETEMPADDR 51 763 764 765 /* New entries should be added here from current IPV6CTL_MAXID value. */ 766 /* to define items, should talk with KAME guys first, for *BSD compatibility */ 767 #define IPV6CTL_MAXID 51 768 769 #ifndef KERNEL 770 __BEGIN_DECLS 771 struct cmsghdr; 772 773 extern int inet6_option_space(int); 774 extern int inet6_option_init(void *, struct cmsghdr **, int); 775 extern int inet6_option_append(struct cmsghdr *, const __uint8_t *, int, int); 776 extern __uint8_t *inet6_option_alloc(struct cmsghdr *, int, int, int); 777 extern int inet6_option_next(const struct cmsghdr *, __uint8_t **); 778 extern int inet6_option_find(const struct cmsghdr *, __uint8_t **, int); 779 780 extern size_t inet6_rthdr_space(int, int); 781 extern struct cmsghdr *inet6_rthdr_init(void *, int); 782 extern int inet6_rthdr_add(struct cmsghdr *, const struct in6_addr *, 783 unsigned int); 784 extern int inet6_rthdr_lasthop(struct cmsghdr *, unsigned int); 785 #if 0 /* not implemented yet */ 786 extern int inet6_rthdr_reverse(const struct cmsghdr *, struct cmsghdr *); 787 #endif 788 extern int inet6_rthdr_segments(const struct cmsghdr *); 789 extern struct in6_addr *inet6_rthdr_getaddr(struct cmsghdr *, int); 790 extern int inet6_rthdr_getflags(const struct cmsghdr *, int); 791 792 extern int inet6_opt_init(void *, socklen_t); 793 extern int inet6_opt_append(void *, socklen_t, int, __uint8_t, socklen_t, 794 __uint8_t, void **); 795 extern int inet6_opt_finish(void *, socklen_t, int); 796 extern int inet6_opt_set_val(void *, int, void *, socklen_t); 797 798 extern int inet6_opt_next(void *, socklen_t, int, __uint8_t *, socklen_t *, 799 void **); 800 extern int inet6_opt_find(void *, socklen_t, int, __uint8_t, socklen_t *, 801 void **); 802 extern int inet6_opt_get_val(void *, int, void *, socklen_t); 803 extern socklen_t inet6_rth_space(int, int); 804 extern void *inet6_rth_init(void *, socklen_t, int, int); 805 extern int inet6_rth_add(void *, const struct in6_addr *); 806 extern int inet6_rth_reverse(const void *, void *); 807 extern int inet6_rth_segments(const void *); 808 extern struct in6_addr *inet6_rth_getaddr(const void *, int); 809 810 __END_DECLS 811 #endif /* !KERNEL */ 812 #endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 813 #endif /* XNU_PLATFORM_DriverKit */ 814 #endif /* !_NETINET6_IN6_H_ */ 815