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