1/* 2 * Copyright (c) 2008-2012 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/* $FreeBSD: src/sys/netinet6/in6.h,v 1.7.2.4 2001/07/04 09:45:23 ume Exp $ */ 30/* $KAME: in6.h,v 1.89 2001/05/27 13:28:35 itojun Exp $ */ 31 32/* 33 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 34 * All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. Redistributions in binary form must reproduce the above copyright 42 * notice, this list of conditions and the following disclaimer in the 43 * documentation and/or other materials provided with the distribution. 44 * 3. Neither the name of the project nor the names of its contributors 45 * may be used to endorse or promote products derived from this software 46 * without specific prior written permission. 47 * 48 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 */ 60 61/* 62 * Copyright (c) 1982, 1986, 1990, 1993 63 * The Regents of the University of California. All rights reserved. 64 * 65 * Redistribution and use in source and binary forms, with or without 66 * modification, are permitted provided that the following conditions 67 * are met: 68 * 1. Redistributions of source code must retain the above copyright 69 * notice, this list of conditions and the following disclaimer. 70 * 2. Redistributions in binary form must reproduce the above copyright 71 * notice, this list of conditions and the following disclaimer in the 72 * documentation and/or other materials provided with the distribution. 73 * 3. All advertising materials mentioning features or use of this software 74 * must display the following acknowledgement: 75 * This product includes software developed by the University of 76 * California, Berkeley and its contributors. 77 * 4. Neither the name of the University nor the names of its contributors 78 * may be used to endorse or promote products derived from this software 79 * without specific prior written permission. 80 * 81 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 82 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 83 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 84 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 85 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 86 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 87 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 88 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 89 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 90 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 91 * SUCH DAMAGE. 92 * 93 * @(#)in.h 8.3 (Berkeley) 1/3/94 94 */ 95 96#ifndef __KAME_NETINET_IN_H_INCLUDED_ 97#error "do not include netinet6/in6.h directly, include netinet/in.h. see RFC2553" 98#endif 99 100#ifndef _NETINET6_IN6_H_ 101#define _NETINET6_IN6_H_ 102#include <sys/appleapiopts.h> 103#include <sys/_types.h> 104 105 106#ifndef _SA_FAMILY_T 107#define _SA_FAMILY_T 108typedef __uint8_t sa_family_t; 109#endif 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 */ 158struct 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}; 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) */ 181struct 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 IN6MASK16 {{{ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 199#define IN6MASK32 {{{ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, \ 200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 201#define IN6MASK64 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ 202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 203#define IN6MASK96 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ 204 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}} 205#define IN6MASK128 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ 206 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}} 207#endif 208 209#ifdef KERNEL_PRIVATE 210extern const struct sockaddr_in6 sa6_any; 211 212extern const struct in6_addr in6mask0; 213extern const struct in6_addr in6mask7; 214extern const struct in6_addr in6mask16; 215extern const struct in6_addr in6mask32; 216extern const struct in6_addr in6mask64; 217extern const struct in6_addr in6mask96; 218extern const struct in6_addr in6mask128; 219 220#define SIN6(s) ((struct sockaddr_in6 *)(void *)s) 221#define satosin6(sa) SIN6(sa) 222#define sin6tosa(sin6) ((struct sockaddr *)(void *)(sin6)) 223#endif /* KERNEL_PRIVATE */ 224 225#ifdef KERNEL /*XXX nonstandard*/ 226/* 227 * Macros started with IPV6_ADDR is KAME local 228 */ 229#if BYTE_ORDER == BIG_ENDIAN 230#define IPV6_ADDR_INT32_ONE 1 231#define IPV6_ADDR_INT32_TWO 2 232#define IPV6_ADDR_INT32_MNL 0xff010000 233#define IPV6_ADDR_INT32_MLL 0xff020000 234#define IPV6_ADDR_INT32_SMP 0x0000ffff 235#define IPV6_ADDR_INT16_ULL 0xfe80 236#define IPV6_ADDR_INT16_USL 0xfec0 237#define IPV6_ADDR_INT16_MLL 0xff02 238#elif BYTE_ORDER == LITTLE_ENDIAN 239#define IPV6_ADDR_INT32_ONE 0x01000000 240#define IPV6_ADDR_INT32_TWO 0x02000000 241#define IPV6_ADDR_INT32_MNL 0x000001ff 242#define IPV6_ADDR_INT32_MLL 0x000002ff 243#define IPV6_ADDR_INT32_SMP 0xffff0000 244#define IPV6_ADDR_INT16_ULL 0x80fe 245#define IPV6_ADDR_INT16_USL 0xc0fe 246#define IPV6_ADDR_INT16_MLL 0x02ff 247#endif 248#endif 249 250/* 251 * Definition of some useful macros to handle IP6 addresses 252 */ 253#define IN6ADDR_ANY_INIT \ 254 {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} 256#define IN6ADDR_LOOPBACK_INIT \ 257 {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 259#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 260#define IN6ADDR_NODELOCAL_ALLNODES_INIT \ 261 {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 263#define IN6ADDR_INTFACELOCAL_ALLNODES_INIT \ 264 {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 266#define IN6ADDR_LINKLOCAL_ALLNODES_INIT \ 267 {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} 269#define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \ 270 {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}} 272#define IN6ADDR_LINKLOCAL_ALLV2ROUTERS_INIT \ 273 {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 274 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16 }}} 275#define IN6ADDR_V4MAPPED_INIT \ 276 {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 277 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}} 278#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 279 280extern const struct in6_addr in6addr_any; 281extern const struct in6_addr in6addr_loopback; 282#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 283extern const struct in6_addr in6addr_nodelocal_allnodes; 284extern const struct in6_addr in6addr_linklocal_allnodes; 285extern const struct in6_addr in6addr_linklocal_allrouters; 286extern const struct in6_addr in6addr_linklocal_allv2routers; 287#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 288 289/* 290 * Equality 291 * NOTE: Some of kernel programming environment (for example, openbsd/sparc) 292 * does not supply memcmp(). For userland memcmp() is preferred as it is 293 * in ANSI standard. 294 */ 295#ifdef KERNEL 296#define IN6_ARE_ADDR_EQUAL(a, b) \ 297 (bcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0) 298#else 299#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 300#define IN6_ARE_ADDR_EQUAL(a, b) \ 301 (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0) 302#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 303#endif 304 305#ifdef KERNEL /* non standard */ 306/* see if two addresses are equal in a scope-conscious manner. */ 307#define SA6_ARE_ADDR_EQUAL(a, b) \ 308 (((a)->sin6_scope_id == 0 || (b)->sin6_scope_id == 0 || \ 309 ((a)->sin6_scope_id == (b)->sin6_scope_id)) && \ 310 (bcmp(&(a)->sin6_addr, &(b)->sin6_addr, sizeof(struct in6_addr)) == 0)) 311#endif 312 313/* 314 * Unspecified 315 */ 316#define IN6_IS_ADDR_UNSPECIFIED(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]) == 0)) 321 322/* 323 * Loopback 324 */ 325#define IN6_IS_ADDR_LOOPBACK(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]) == ntohl(1))) 330 331/* 332 * IPv4 compatible 333 */ 334#define IN6_IS_ADDR_V4COMPAT(a) \ 335 ((*(const __uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ 336 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ 337 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ 338 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[12]) != 0) && \ 339 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[12]) != ntohl(1))) 340 341/* 342 * Mapped 343 */ 344#define IN6_IS_ADDR_V4MAPPED(a) \ 345 ((*(const __uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ 346 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ 347 (*(const __uint32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff))) 348 349/* 350 * 6to4 351 */ 352#define IN6_IS_ADDR_6TO4(x) (ntohs((x)->s6_addr16[0]) == 0x2002) 353 354/* 355 * KAME Scope Values 356 */ 357 358#ifdef KERNEL /*XXX nonstandard*/ 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#else 366#define __IPV6_ADDR_SCOPE_NODELOCAL 0x01 367#define __IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 368#define __IPV6_ADDR_SCOPE_LINKLOCAL 0x02 369#define __IPV6_ADDR_SCOPE_SITELOCAL 0x05 370#define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* just used in this file */ 371#define __IPV6_ADDR_SCOPE_GLOBAL 0x0e 372#endif 373 374/* 375 * Unicast Scope 376 * Note that we must check topmost 10 bits only, not 16 bits (see RFC2373). 377 */ 378#define IN6_IS_ADDR_LINKLOCAL(a) \ 379 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80)) 380#define IN6_IS_ADDR_SITELOCAL(a) \ 381 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0)) 382 383/* 384 * Multicast 385 */ 386#define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff) 387 388/* 389 * Unique Local IPv6 Unicast Addresses (per RFC 4193) 390 */ 391#define IN6_IS_ADDR_UNIQUE_LOCAL(a) (((a)->s6_addr[0] == 0xfc) || ((a)->s6_addr[0] == 0xfd)) 392 393#ifdef KERNEL /*XXX nonstandard*/ 394#define IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) 395#else 396#define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) 397#endif 398 399/* 400 * Multicast Scope 401 */ 402#ifdef KERNEL /*refers nonstandard items */ 403#define IN6_IS_ADDR_MC_NODELOCAL(a) \ 404 (IN6_IS_ADDR_MULTICAST(a) && \ 405 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL)) 406#define IN6_IS_ADDR_MC_INTFACELOCAL(a) \ 407 (IN6_IS_ADDR_MULTICAST(a) && \ 408 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_INTFACELOCAL)) 409#define IN6_IS_ADDR_MC_LINKLOCAL(a) \ 410 (IN6_IS_ADDR_MULTICAST(a) && \ 411 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL)) 412#define IN6_IS_ADDR_MC_SITELOCAL(a) \ 413 (IN6_IS_ADDR_MULTICAST(a) && \ 414 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL)) 415#define IN6_IS_ADDR_MC_ORGLOCAL(a) \ 416 (IN6_IS_ADDR_MULTICAST(a) && \ 417 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL)) 418#define IN6_IS_ADDR_MC_GLOBAL(a) \ 419 (IN6_IS_ADDR_MULTICAST(a) && \ 420 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL)) 421#else 422#define IN6_IS_ADDR_MC_NODELOCAL(a) \ 423 (IN6_IS_ADDR_MULTICAST(a) && \ 424 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL)) 425#define IN6_IS_ADDR_MC_LINKLOCAL(a) \ 426 (IN6_IS_ADDR_MULTICAST(a) && \ 427 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL)) 428#define IN6_IS_ADDR_MC_SITELOCAL(a) \ 429 (IN6_IS_ADDR_MULTICAST(a) && \ 430 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL)) 431#define IN6_IS_ADDR_MC_ORGLOCAL(a) \ 432 (IN6_IS_ADDR_MULTICAST(a) && \ 433 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL)) 434#define IN6_IS_ADDR_MC_GLOBAL(a) \ 435 (IN6_IS_ADDR_MULTICAST(a) && \ 436 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL)) 437#endif 438 439#ifdef KERNEL /*nonstandard*/ 440/* 441 * KAME Scope 442 */ 443#define IN6_IS_SCOPE_LINKLOCAL(a) \ 444 ((IN6_IS_ADDR_LINKLOCAL(a)) || \ 445 (IN6_IS_ADDR_MC_LINKLOCAL(a))) 446 447#define IN6_IS_SCOPE_EMBED(a) \ 448 ((IN6_IS_ADDR_LINKLOCAL(a)) || \ 449 (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \ 450 (IN6_IS_ADDR_MC_INTFACELOCAL(a))) 451 452#define IFA6_IS_DEPRECATED(a) \ 453 ((a)->ia6_lifetime.ia6t_preferred != 0 && \ 454 (a)->ia6_lifetime.ia6t_preferred < timenow.tv_sec) 455#define IFA6_IS_INVALID(a) \ 456 ((a)->ia6_lifetime.ia6t_expire != 0 && \ 457 (a)->ia6_lifetime.ia6t_expire < timenow.tv_sec) 458#endif /* KERNEL */ 459 460/* 461 * IP6 route structure 462 */ 463#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 464#ifdef PRIVATE 465struct route_in6 { 466 /* 467 * N.B: struct route_in6 must begin with ro_rt and ro_flags 468 * because the code does some casts of a 'struct route_in6 *' 469 * to a 'struct route *'. 470 */ 471 struct rtentry *ro_rt; 472 __uint32_t ro_flags; /* route flags */ 473 struct sockaddr_in6 ro_dst; 474}; 475#endif /* PRIVATE */ 476#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 477 478/* 479 * Options for use with [gs]etsockopt at the IPV6 level. 480 * First word of comment is data type; bool is stored in int. 481 */ 482/* no hdrincl */ 483#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 484/* 485 * RFC 3542 define the following socket options in a manner incompatible 486 * with RFC 2292: 487 * IPV6_PKTINFO 488 * IPV6_HOPLIMIT 489 * IPV6_NEXTHOP 490 * IPV6_HOPOPTS 491 * IPV6_DSTOPTS 492 * IPV6_RTHDR 493 * 494 * To use the new IPv6 Sockets options introduced by RFC 3542 495 * the constant __APPLE_USE_RFC_3542 must be defined before 496 * including <netinet/in.h> 497 * 498 * To use the old IPv6 Sockets options from RFC 2292 499 * the constant __APPLE_USE_RFC_2292 must be defined before 500 * including <netinet/in.h> 501 * 502 * Note that eventually RFC 3542 is going to be the 503 * default and RFC 2292 will be obsolete. 504 */ 505#ifdef XNU_KERNEL_PRIVATE 506#define __APPLE_USE_RFC_3542 1 507#endif /* XNU_KERNEL_PRIVATE */ 508 509#if defined(__APPLE_USE_RFC_3542) && defined(__APPLE_USE_RFC_2292) 510#error "__APPLE_USE_RFC_3542 and __APPLE_USE_RFC_2292 cannot be both defined" 511#endif 512 513#if 0 /* the followings are relic in IPv4 and hence are disabled */ 514#define IPV6_OPTIONS 1 /* buf/ip6_opts; set/get IP6 options */ 515#define IPV6_RECVOPTS 5 /* bool; receive all IP6 opts w/dgram */ 516#define IPV6_RECVRETOPTS 6 /* bool; receive IP6 opts for response */ 517#define IPV6_RECVDSTADDR 7 /* bool; receive IP6 dst addr w/dgram */ 518#define IPV6_RETOPTS 8 /* ip6_opts; set/get IP6 options */ 519#endif /* 0 */ 520#define IPV6_SOCKOPT_RESERVED1 3 /* reserved for future use */ 521#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 522#define IPV6_UNICAST_HOPS 4 /* int; IP6 hops */ 523#define IPV6_MULTICAST_IF 9 /* __uint8_t; set/get IP6 multicast i/f */ 524#define IPV6_MULTICAST_HOPS 10 /* __uint8_t; set/get IP6 multicast hops */ 525#define IPV6_MULTICAST_LOOP 11 /* __uint8_t; set/get IP6 mcast loopback */ 526#define IPV6_JOIN_GROUP 12 /* ip6_mreq; join a group membership */ 527#define IPV6_LEAVE_GROUP 13 /* ip6_mreq; leave a group membership */ 528 529#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 530#define IPV6_PORTRANGE 14 /* int; range to choose for unspec port */ 531#define ICMP6_FILTER 18 /* icmp6_filter; icmp6 filter */ 532#define IPV6_2292PKTINFO 19 /* bool; send/recv if, src/dst addr */ 533#define IPV6_2292HOPLIMIT 20 /* bool; hop limit */ 534#define IPV6_2292NEXTHOP 21 /* bool; next hop addr */ 535#define IPV6_2292HOPOPTS 22 /* bool; hop-by-hop option */ 536#define IPV6_2292DSTOPTS 23 /* bool; destinaion option */ 537#define IPV6_2292RTHDR 24 /* ip6_rthdr: routing header */ 538#define IPV6_2292PKTOPTIONS 25 /* buf/cmsghdr; set/get IPv6 options */ 539 /* obsoleted by RFC3542 */ 540 541#ifdef __APPLE_USE_RFC_2292 542#define IPV6_PKTINFO IPV6_2292PKTINFO 543#define IPV6_HOPLIMIT IPV6_2292HOPLIMIT 544#define IPV6_NEXTHOP IPV6_2292NEXTHOP 545#define IPV6_HOPOPTS IPV6_2292HOPOPTS 546#define IPV6_DSTOPTS IPV6_2292DSTOPTS 547#define IPV6_RTHDR IPV6_2292RTHDR 548#define IPV6_PKTOPTIONS IPV6_2292PKTOPTIONS 549#endif /* __APPLE_USE_RFC_2292 */ 550 551#define IPV6_CHECKSUM 26 /* int; checksum offset for raw socket */ 552#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 553#define IPV6_V6ONLY 27 /* bool; only bind INET6 at wildcard bind */ 554#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 555#ifndef KERNEL 556#define IPV6_BINDV6ONLY IPV6_V6ONLY 557#endif /* KERNEL */ 558 559 560#if 1 /*IPSEC*/ 561#define IPV6_IPSEC_POLICY 28 /* struct; get/set security policy */ 562#endif /* 1 */ 563#define IPV6_FAITH 29 /* deprecated */ 564 565#if 1 /*IPV6FIREWALL*/ 566#define IPV6_FW_ADD 30 /* add a firewall rule to chain */ 567#define IPV6_FW_DEL 31 /* delete a firewall rule from chain */ 568#define IPV6_FW_FLUSH 32 /* flush firewall rule chain */ 569#define IPV6_FW_ZERO 33 /* clear single/all firewall counter(s) */ 570#define IPV6_FW_GET 34 /* get entire firewall rule chain */ 571#endif /* 1 */ 572 573/* APPLE: NOTE the value of those 2 options is kept unchanged from 574 * previous version of darwin/OS X for binary compatibility reasons 575 * and differ from FreeBSD (values 57 and 61). See below. 576 */ 577#define IPV6_RECVTCLASS 35 /* bool; recv traffic class values */ 578#define IPV6_TCLASS 36 /* int; send traffic class value */ 579 580#ifdef __APPLE_USE_RFC_3542 581/* new socket options introduced in RFC3542 */ 582#define IPV6_RTHDRDSTOPTS 57 /* ip6_dest; send dst option before rthdr 583 * APPLE: Value purposely different than FreeBSD (35) to avoid 584 * collision with definition of IPV6_RECVTCLASS in previous 585 * darwin implementations */ 586 587#define IPV6_RECVPKTINFO 61 /* bool; recv if, dst addr 588 * APPLE: Value purposely different than FreeBSD (36) to avoid 589 * collision with definition of IPV6_TCLASS in previous 590 * darwin implementations */ 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#define IPV6_PATHMTU 44 /* mtuinfo; get the current path MTU (sopt), 604 4 bytes int; MTU notification (cmsg) */ 605#if 0 /*obsoleted during 2292bis -> 3542*/ 606#define IPV6_REACHCONF 45 /* no data; ND reachability confirm 607 (cmsg only/not in of RFC3542) */ 608#endif 609/* more new socket options introduced in RFC3542 */ 610#define IPV6_3542PKTINFO 46 /* in6_pktinfo; send if, src addr */ 611#define IPV6_3542HOPLIMIT 47 /* int; send hop limit */ 612#define IPV6_3542NEXTHOP 48 /* sockaddr; next hop addr */ 613#define IPV6_3542HOPOPTS 49 /* ip6_hbh; send hop-by-hop option */ 614#define IPV6_3542DSTOPTS 50 /* ip6_dest; send dst option befor rthdr */ 615#define IPV6_3542RTHDR 51 /* ip6_rthdr; send routing header */ 616 617#define IPV6_PKTINFO IPV6_3542PKTINFO 618#define IPV6_HOPLIMIT IPV6_3542HOPLIMIT 619#define IPV6_NEXTHOP IPV6_3542NEXTHOP 620#define IPV6_HOPOPTS IPV6_3542HOPOPTS 621#define IPV6_DSTOPTS IPV6_3542DSTOPTS 622#define IPV6_RTHDR IPV6_3542RTHDR 623 624#define IPV6_AUTOFLOWLABEL 59 /* bool; attach flowlabel automagically */ 625 626#define IPV6_DONTFRAG 62 /* bool; disable IPv6 fragmentation */ 627 628#define IPV6_PREFER_TEMPADDR 63 /* int; prefer temporary addresses as 629 * the source address. 630 */ 631 632/* 633 * The following option is private; do not use it from user applications. 634 * It is deliberately defined to the same value as IP_MSFILTER. 635 */ 636#define IPV6_MSFILTER 74 /* struct __msfilterreq; 637 * set/get multicast source filter list. 638 */ 639#endif /* __APPLE_USE_RFC_3542 */ 640 641#define IPV6_BOUND_IF 125 /* int; set/get bound interface */ 642 643#ifdef PRIVATE 644#define IPV6_NO_IFT_CELLULAR 6969 /* for internal use only */ 645#define IPV6_OUT_IF 9696 /* for internal use only */ 646#endif /* PRIVATE */ 647 648/* to define items, should talk with KAME guys first, for *BSD compatibility */ 649 650#define IPV6_RTHDR_LOOSE 0 /* this hop need not be a neighbor. XXX old spec */ 651#define IPV6_RTHDR_STRICT 1 /* this hop must be a neighbor. XXX old spec */ 652#define IPV6_RTHDR_TYPE_0 0 /* IPv6 routing header type 0 */ 653 654/* 655 * Defaults and limits for options 656 */ 657#define IPV6_DEFAULT_MULTICAST_HOPS 1 /* normally limit m'casts to 1 hop */ 658#define IPV6_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ 659 660/* 661 * The im6o_membership vector for each socket is now dynamically allocated at 662 * run-time, bounded by USHRT_MAX, and is reallocated when needed, sized 663 * according to a power-of-two increment. 664 */ 665#define IPV6_MIN_MEMBERSHIPS 31 666#define IPV6_MAX_MEMBERSHIPS 4095 667 668/* 669 * Default resource limits for IPv6 multicast source filtering. 670 * These may be modified by sysctl. 671 */ 672#define IPV6_MAX_GROUP_SRC_FILTER 512 /* sources per group */ 673#define IPV6_MAX_SOCK_SRC_FILTER 128 /* sources per socket/group */ 674 675/* 676 * Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP. 677 */ 678struct ipv6_mreq { 679 struct in6_addr ipv6mr_multiaddr; 680 unsigned int ipv6mr_interface; 681}; 682 683/* 684 * IPV6_2292PKTINFO: Packet information(RFC2292 sec 5) 685 */ 686struct in6_pktinfo { 687 struct in6_addr ipi6_addr; /* src/dst IPv6 address */ 688 unsigned int ipi6_ifindex; /* send/recv interface index */ 689}; 690 691/* 692 * Control structure for IPV6_RECVPATHMTU socket option. 693 */ 694struct ip6_mtuinfo { 695 struct sockaddr_in6 ip6m_addr; /* or sockaddr_storage? */ 696 uint32_t ip6m_mtu; 697}; 698 699/* 700 * Argument for IPV6_PORTRANGE: 701 * - which range to search when port is unspecified at bind() or connect() 702 */ 703#define IPV6_PORTRANGE_DEFAULT 0 /* default range */ 704#define IPV6_PORTRANGE_HIGH 1 /* "high" - request firewall bypass */ 705#define IPV6_PORTRANGE_LOW 2 /* "low" - vouchsafe security */ 706 707/* 708 * Definitions for inet6 sysctl operations. 709 * 710 * Third level is protocol number. 711 * Fourth level is desired variable within that protocol. 712 */ 713#define IPV6PROTO_MAXID (IPPROTO_PIM + 1) /* don't list to IPV6PROTO_MAX */ 714 715/* 716 * Names for IP sysctl objects 717 */ 718#define IPV6CTL_FORWARDING 1 /* act as router */ 719#define IPV6CTL_SENDREDIRECTS 2 /* may send redirects when forwarding*/ 720#define IPV6CTL_DEFHLIM 3 /* default Hop-Limit */ 721#ifdef notyet 722#define IPV6CTL_DEFMTU 4 /* default MTU */ 723#endif 724#define IPV6CTL_FORWSRCRT 5 /* forward source-routed dgrams */ 725#define IPV6CTL_STATS 6 /* stats */ 726#define IPV6CTL_MRTSTATS 7 /* multicast forwarding stats */ 727#define IPV6CTL_MRTPROTO 8 /* multicast routing protocol */ 728#define IPV6CTL_MAXFRAGPACKETS 9 /* max packets reassembly queue */ 729#define IPV6CTL_SOURCECHECK 10 /* verify source route and intf */ 730#define IPV6CTL_SOURCECHECK_LOGINT 11 /* minimume logging interval */ 731#define IPV6CTL_ACCEPT_RTADV 12 732#define IPV6CTL_KEEPFAITH 13 /* deprecated */ 733#define IPV6CTL_LOG_INTERVAL 14 734#define IPV6CTL_HDRNESTLIMIT 15 735#define IPV6CTL_DAD_COUNT 16 736#define IPV6CTL_AUTO_FLOWLABEL 17 737#define IPV6CTL_DEFMCASTHLIM 18 738#define IPV6CTL_GIF_HLIM 19 /* default HLIM for gif encap packet */ 739#define IPV6CTL_KAME_VERSION 20 740#define IPV6CTL_USE_DEPRECATED 21 /* use deprecated addr (RFC2462 5.5.4) */ 741#define IPV6CTL_RR_PRUNE 22 /* walk timer for router renumbering */ 742#if 0 /*obsolete*/ 743#define IPV6CTL_MAPPED_ADDR 23 744#endif 745#define IPV6CTL_V6ONLY 24 746#define IPV6CTL_RTEXPIRE 25 /* cloned route expiration time */ 747#define IPV6CTL_RTMINEXPIRE 26 /* min value for expiration time */ 748#define IPV6CTL_RTMAXCACHE 27 /* trigger level for dynamic expire */ 749 750#define IPV6CTL_USETEMPADDR 32 /* use temporary addresses [RFC 4941] */ 751#define IPV6CTL_TEMPPLTIME 33 /* preferred lifetime for tmpaddrs */ 752#define IPV6CTL_TEMPVLTIME 34 /* valid lifetime for tmpaddrs */ 753#define IPV6CTL_AUTO_LINKLOCAL 35 /* automatic link-local addr assign */ 754#define IPV6CTL_RIP6STATS 36 /* raw_ip6 stats */ 755#define IPV6CTL_PREFER_TEMPADDR 37 /* prefer temporary addr as src */ 756#define IPV6CTL_ADDRCTLPOLICY 38 /* get/set address selection policy */ 757#define IPV6CTL_USE_DEFAULTZONE 39 /* use default scope zone */ 758 759#define IPV6CTL_MAXFRAGS 41 /* max fragments */ 760#define IPV6CTL_MCAST_PMTU 44 /* enable pMTU discovery for multicast? */ 761 762#define IPV6CTL_NEIGHBORGCTHRESH 46 763#define IPV6CTL_MAXIFPREFIXES 47 764#define IPV6CTL_MAXIFDEFROUTERS 48 765#define IPV6CTL_MAXDYNROUTES 49 766#define ICMPV6CTL_ND6_ONLINKNSRFC4861 50 767 768/* New entries should be added here from current IPV6CTL_MAXID value. */ 769/* to define items, should talk with KAME guys first, for *BSD compatibility */ 770#define IPV6CTL_MAXID 51 771 772#ifdef KERNEL_PRIVATE 773#define CTL_IPV6PROTO_NAMES { \ 774 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 775 { 0, 0 }, \ 776 { "tcp6", CTLTYPE_NODE }, \ 777 { 0, 0 }, \ 778 { 0, 0 }, \ 779 { 0, 0 }, \ 780 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 781 { 0, 0 }, \ 782 { 0, 0 }, \ 783 { "udp6", CTLTYPE_NODE }, \ 784 { 0, 0 }, \ 785 { 0, 0 }, \ 786 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 787 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 788 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 789 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 790 { 0, 0 }, \ 791 { "ip6", CTLTYPE_NODE }, \ 792 { 0, 0 }, \ 793 { 0, 0 }, \ 794 { 0, 0 }, \ 795 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 796 { 0, 0 }, \ 797 { "ipsec6", CTLTYPE_NODE }, \ 798 { 0, 0 }, \ 799 { 0, 0 }, \ 800 { 0, 0 }, \ 801 { 0, 0 }, \ 802 { 0, 0 }, \ 803 { 0, 0 }, \ 804 { "icmp6", CTLTYPE_NODE }, \ 805 { 0, 0 }, \ 806 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 807 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 808 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 809 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 810 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 811 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 812 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 813 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ 814 { 0, 0 }, \ 815 { 0, 0 }, \ 816 { 0, 0 }, \ 817 { "pim6", CTLTYPE_NODE }, \ 818} 819/* 820 * Redefinition of mbuf flags 821 */ 822#define M_AUTHIPHDR M_PROTO2 823#define M_DECRYPTED M_PROTO3 824#define M_AUTHIPDGM M_PROTO5 825 826struct cmsghdr; 827struct mbuf; 828struct ifnet; 829struct in6_aliasreq; 830 831#define in6_cksum(m, n, o, l) inet6_cksum(m, n, o, l) 832 833extern u_int16_t inet6_cksum(struct mbuf *m, unsigned int proto, 834 unsigned int offset, unsigned int transport_len); 835 836extern int in6_localaddr(struct in6_addr *); 837extern int in6_addrscope(struct in6_addr *); 838extern struct in6_ifaddr *in6_ifawithscope(struct ifnet *, struct in6_addr *); 839extern struct in6_ifaddr *in6_ifawithifp(struct ifnet *, struct in6_addr *); 840extern int in6_if_up(struct ifnet *, struct in6_aliasreq *); 841struct sockaddr; 842 843extern void in6_sin6_2_sin(struct sockaddr_in *sin, struct sockaddr_in6 *sin6); 844extern void in6_sin_2_v4mapsin6(struct sockaddr_in *sin, 845 struct sockaddr_in6 *sin6); 846extern void in6_sin6_2_sin_in_sock(struct sockaddr *nam); 847extern int in6_sin_2_v4mapsin6_in_sock(struct sockaddr **nam); 848extern void in6_delayed_cksum(struct mbuf *, u_int16_t); 849extern int in6addr_local(struct in6_addr *); 850 851#define DEBUG_HWCKSUM 1 /* IPv6 Hardware checksum on/off */ 852/* 853 * in6_cksum_phdr: 854 * 855 * Compute significant parts of the IPv6 checksum pseudo-header 856 * for use in a delayed TCP/UDP checksum calculation. 857 * 858 * Args: 859 * 860 * src Source IPv6 address 861 * dst Destination IPv6 address 862 * len htonl(proto-hdr-len) 863 * nxt htonl(next-proto-number) 864 * 865 * NOTE: We expect the src and dst addresses to be 16-bit 866 * aligned! 867 */ 868static __inline u_int16_t __unused 869in6_cksum_phdr(const struct in6_addr *src, const struct in6_addr *dst, 870 u_int32_t len, u_int32_t nxt) 871{ 872 u_int32_t sum = 0; 873 const u_int16_t *w; 874 875 /*LINTED*/ 876 w = (const u_int16_t *) src; 877 sum += w[0]; 878 if (!IN6_IS_SCOPE_LINKLOCAL(src)) 879 sum += w[1]; 880 sum += w[2]; sum += w[3]; sum += w[4]; sum += w[5]; 881 sum += w[6]; sum += w[7]; 882 883 /*LINTED*/ 884 w = (const u_int16_t *) dst; 885 sum += w[0]; 886 if (!IN6_IS_SCOPE_LINKLOCAL(dst)) 887 sum += w[1]; 888 sum += w[2]; sum += w[3]; sum += w[4]; sum += w[5]; 889 sum += w[6]; sum += w[7]; 890 891 sum += (u_int16_t)(len >> 16) + (u_int16_t)(len /*& 0xffff*/); 892 893 sum += (u_int16_t)(nxt >> 16) + (u_int16_t)(nxt /*& 0xffff*/); 894 895 sum = (u_int16_t)(sum >> 16) + (u_int16_t)(sum /*& 0xffff*/); 896 897 if (sum > 0xffff) 898 sum -= 0xffff; 899 900 return (sum); 901} 902#endif /* KERNEL_PRIVATE */ 903 904#ifndef KERNEL 905__BEGIN_DECLS 906struct cmsghdr; 907 908extern int inet6_option_space(int); 909extern int inet6_option_init(void *, struct cmsghdr **, int); 910extern int inet6_option_append(struct cmsghdr *, const __uint8_t *, 911 int, int); 912extern __uint8_t *inet6_option_alloc(struct cmsghdr *, int, int, int); 913extern int inet6_option_next(const struct cmsghdr *, __uint8_t **); 914extern int inet6_option_find(const struct cmsghdr *, __uint8_t **, int); 915 916extern size_t inet6_rthdr_space(int, int); 917extern struct cmsghdr *inet6_rthdr_init(void *, int); 918extern int inet6_rthdr_add(struct cmsghdr *, const struct in6_addr *, 919 unsigned int); 920extern int inet6_rthdr_lasthop(struct cmsghdr *, unsigned int); 921#if 0 /* not implemented yet */ 922extern int inet6_rthdr_reverse(const struct cmsghdr *, struct cmsghdr *); 923#endif 924extern int inet6_rthdr_segments(const struct cmsghdr *); 925extern struct in6_addr *inet6_rthdr_getaddr(struct cmsghdr *, int); 926extern int inet6_rthdr_getflags(const struct cmsghdr *, int); 927 928extern int inet6_opt_init(void *, socklen_t); 929extern int inet6_opt_append(void *, socklen_t, int, __uint8_t, 930 socklen_t, __uint8_t, void **); 931extern int inet6_opt_finish(void *, socklen_t, int); 932extern int inet6_opt_set_val(void *, int, void *, socklen_t); 933 934extern int inet6_opt_next(void *, socklen_t, int, __uint8_t *, 935 socklen_t *, void **); 936extern int inet6_opt_find(void *, socklen_t, int, __uint8_t, 937 socklen_t *, void **); 938extern int inet6_opt_get_val(void *, int, void *, socklen_t); 939extern socklen_t inet6_rth_space(int, int); 940extern void *inet6_rth_init(void *, socklen_t, int, int); 941extern int inet6_rth_add(void *, const struct in6_addr *); 942extern int inet6_rth_reverse(const void *, void *); 943extern int inet6_rth_segments(const void *); 944extern struct in6_addr *inet6_rth_getaddr(const void *, int); 945extern void addrsel_policy_init(void); 946__END_DECLS 947#endif /* !KERNEL */ 948#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 949#endif /* !_NETINET6_IN6_H_ */ 950