2  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   6  * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved. 
   8  * This file contains Original Code and/or Modifications of Original Code 
   9  * as defined in and that are subject to the Apple Public Source License 
  10  * Version 2.0 (the 'License'). You may not use this file except in 
  11  * compliance with the License. Please obtain a copy of the License at 
  12  * http://www.opensource.apple.com/apsl/ and read it before using this 
  15  * The Original Code and all software distributed under the License are 
  16  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  17  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  18  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  19  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  20  * Please see the License for the specific language governing rights and 
  21  * limitations under the License. 
  23  * @APPLE_LICENSE_HEADER_END@ 
  25 /*      $KAME: icmp6.h,v 1.46 2001/04/27 15:09:48 itojun Exp $  */ 
  28  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 
  29  * All rights reserved. 
  31  * Redistribution and use in source and binary forms, with or without 
  32  * modification, are permitted provided that the following conditions 
  34  * 1. Redistributions of source code must retain the above copyright 
  35  *    notice, this list of conditions and the following disclaimer. 
  36  * 2. Redistributions in binary form must reproduce the above copyright 
  37  *    notice, this list of conditions and the following disclaimer in the 
  38  *    documentation and/or other materials provided with the distribution. 
  39  * 3. Neither the name of the project nor the names of its contributors 
  40  *    may be used to endorse or promote products derived from this software 
  41  *    without specific prior written permission. 
  43  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 
  44  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  45  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  46  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 
  47  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  48  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
  49  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  50  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  51  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
  52  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  57  * Copyright (c) 1982, 1986, 1993 
  58  *      The Regents of the University of California.  All rights reserved. 
  60  * Redistribution and use in source and binary forms, with or without 
  61  * modification, are permitted provided that the following conditions 
  63  * 1. Redistributions of source code must retain the above copyright 
  64  *    notice, this list of conditions and the following disclaimer. 
  65  * 2. Redistributions in binary form must reproduce the above copyright 
  66  *    notice, this list of conditions and the following disclaimer in the 
  67  *    documentation and/or other materials provided with the distribution. 
  68  * 3. All advertising materials mentioning features or use of this software 
  69  *    must display the following acknowledgement: 
  70  *      This product includes software developed by the University of 
  71  *      California, Berkeley and its contributors. 
  72  * 4. Neither the name of the University nor the names of its contributors 
  73  *    may be used to endorse or promote products derived from this software 
  74  *    without specific prior written permission. 
  76  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
  77  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  78  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  79  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
  80  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  81  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
  82  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  83  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  84  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
  85  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  88  *      @(#)ip_icmp.h   8.1 (Berkeley) 6/10/93 
  91 #ifndef _NETINET_ICMP6_H_ 
  92 #define _NETINET_ICMP6_H_ 
  93 #include <sys/appleapiopts.h> 
  95 #define ICMPV6_PLD_MAXLEN       1232    /* IPV6_MMTU - sizeof(struct ip6_hdr) 
  96                                            - sizeof(struct icmp6_hdr) */ 
  99         u_int8_t        icmp6_type
;     /* type field */ 
 100         u_int8_t        icmp6_code
;     /* code field */ 
 101         u_int16_t       icmp6_cksum
;    /* checksum field */ 
 103                 u_int32_t       icmp6_un_data32
[1]; /* type-specific field */ 
 104                 u_int16_t       icmp6_un_data16
[2]; /* type-specific field */ 
 105                 u_int8_t        icmp6_un_data8
[4];  /* type-specific field */ 
 109 #define icmp6_data32    icmp6_dataun.icmp6_un_data32 
 110 #define icmp6_data16    icmp6_dataun.icmp6_un_data16 
 111 #define icmp6_data8     icmp6_dataun.icmp6_un_data8 
 112 #define icmp6_pptr      icmp6_data32[0]         /* parameter prob */ 
 113 #define icmp6_mtu       icmp6_data32[0]         /* packet too big */ 
 114 #define icmp6_id        icmp6_data16[0]         /* echo request/reply */ 
 115 #define icmp6_seq       icmp6_data16[1]         /* echo request/reply */ 
 116 #define icmp6_maxdelay  icmp6_data16[0]         /* mcast group membership */ 
 118 #define ICMP6_DST_UNREACH               1       /* dest unreachable, codes: */ 
 119 #define ICMP6_PACKET_TOO_BIG            2       /* packet too big */ 
 120 #define ICMP6_TIME_EXCEEDED             3       /* time exceeded, code: */ 
 121 #define ICMP6_PARAM_PROB                4       /* ip6 header bad */ 
 123 #define ICMP6_ECHO_REQUEST              128     /* echo service */ 
 124 #define ICMP6_ECHO_REPLY                129     /* echo reply */ 
 125 #define ICMP6_MEMBERSHIP_QUERY          130     /* group membership query */ 
 126 #define MLD6_LISTENER_QUERY             130     /* multicast listener query */ 
 127 #define ICMP6_MEMBERSHIP_REPORT         131     /* group membership report */ 
 128 #define MLD6_LISTENER_REPORT            131     /* multicast listener report */ 
 129 #define ICMP6_MEMBERSHIP_REDUCTION      132     /* group membership termination */ 
 130 #define MLD6_LISTENER_DONE              132     /* multicast listener done */ 
 132 #define ND_ROUTER_SOLICIT               133     /* router solicitation */ 
 133 #define ND_ROUTER_ADVERT                134     /* router advertisment */ 
 134 #define ND_NEIGHBOR_SOLICIT             135     /* neighbor solicitation */ 
 135 #define ND_NEIGHBOR_ADVERT              136     /* neighbor advertisment */ 
 136 #define ND_REDIRECT                     137     /* redirect */ 
 138 #define ICMP6_ROUTER_RENUMBERING        138     /* router renumbering */ 
 140 #define ICMP6_WRUREQUEST                139     /* who are you request */ 
 141 #define ICMP6_WRUREPLY                  140     /* who are you reply */ 
 142 #define ICMP6_FQDN_QUERY                139     /* FQDN query */ 
 143 #define ICMP6_FQDN_REPLY                140     /* FQDN reply */ 
 144 #define ICMP6_NI_QUERY                  139     /* node information request */ 
 145 #define ICMP6_NI_REPLY                  140     /* node information reply */ 
 147 /* The definitions below are experimental. TBA */ 
 148 #define MLD6_MTRACE_RESP                200     /* mtrace response(to sender) */ 
 149 #define MLD6_MTRACE                     201     /* mtrace messages */ 
 151 #define ICMP6_HADISCOV_REQUEST          202     /* XXX To be defined */ 
 152 #define ICMP6_HADISCOV_REPLY            203     /* XXX To be defined */ 
 154 #define ICMP6_MAXTYPE                   203 
 156 #define ICMP6_DST_UNREACH_NOROUTE       0       /* no route to destination */ 
 157 #define ICMP6_DST_UNREACH_ADMIN         1       /* administratively prohibited */ 
 158 #define ICMP6_DST_UNREACH_NOTNEIGHBOR   2       /* not a neighbor(obsolete) */ 
 159 #define ICMP6_DST_UNREACH_BEYONDSCOPE   2       /* beyond scope of source address */ 
 160 #define ICMP6_DST_UNREACH_ADDR          3       /* address unreachable */ 
 161 #define ICMP6_DST_UNREACH_NOPORT        4       /* port unreachable */ 
 163 #define ICMP6_TIME_EXCEED_TRANSIT       0       /* ttl==0 in transit */ 
 164 #define ICMP6_TIME_EXCEED_REASSEMBLY    1       /* ttl==0 in reass */ 
 166 #define ICMP6_PARAMPROB_HEADER          0       /* erroneous header field */ 
 167 #define ICMP6_PARAMPROB_NEXTHEADER      1       /* unrecognized next header */ 
 168 #define ICMP6_PARAMPROB_OPTION          2       /* unrecognized option */ 
 170 #define ICMP6_INFOMSG_MASK              0x80    /* all informational messages */ 
 172 #define ICMP6_NI_SUBJ_IPV6      0       /* Query Subject is an IPv6 address */ 
 173 #define ICMP6_NI_SUBJ_FQDN      1       /* Query Subject is a Domain name */ 
 174 #define ICMP6_NI_SUBJ_IPV4      2       /* Query Subject is an IPv4 address */ 
 176 #define ICMP6_NI_SUCCESS        0       /* node information successful reply */ 
 177 #define ICMP6_NI_REFUSED        1       /* node information request is refused */ 
 178 #define ICMP6_NI_UNKNOWN        2       /* unknown Qtype */ 
 180 #define ICMP6_ROUTER_RENUMBERING_COMMAND  0     /* rr command */ 
 181 #define ICMP6_ROUTER_RENUMBERING_RESULT   1     /* rr result */ 
 182 #define ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET   255     /* rr seq num reset */ 
 184 /* Used in kernel only */ 
 185 #define ND_REDIRECT_ONLINK      0       /* redirect to an on-link node */ 
 186 #define ND_REDIRECT_ROUTER      1       /* redirect to a better router */ 
 189  * Multicast Listener Discovery 
 192         struct icmp6_hdr        mld6_hdr
; 
 193         struct in6_addr         mld6_addr
; /* multicast address */ 
 196 #define mld6_type       mld6_hdr.icmp6_type 
 197 #define mld6_code       mld6_hdr.icmp6_code 
 198 #define mld6_cksum      mld6_hdr.icmp6_cksum 
 199 #define mld6_maxdelay   mld6_hdr.icmp6_data16[0] 
 200 #define mld6_reserved   mld6_hdr.icmp6_data16[1] 
 206 struct nd_router_solicit 
{      /* router solicitation */ 
 207         struct icmp6_hdr        nd_rs_hdr
; 
 208         /* could be followed by options */ 
 211 #define nd_rs_type      nd_rs_hdr.icmp6_type 
 212 #define nd_rs_code      nd_rs_hdr.icmp6_code 
 213 #define nd_rs_cksum     nd_rs_hdr.icmp6_cksum 
 214 #define nd_rs_reserved  nd_rs_hdr.icmp6_data32[0] 
 216 struct nd_router_advert 
{       /* router advertisement */ 
 217         struct icmp6_hdr        nd_ra_hdr
; 
 218         u_int32_t               nd_ra_reachable
;        /* reachable time */ 
 219         u_int32_t               nd_ra_retransmit
;       /* retransmit timer */ 
 220         /* could be followed by options */ 
 223 #define nd_ra_type              nd_ra_hdr.icmp6_type 
 224 #define nd_ra_code              nd_ra_hdr.icmp6_code 
 225 #define nd_ra_cksum             nd_ra_hdr.icmp6_cksum 
 226 #define nd_ra_curhoplimit       nd_ra_hdr.icmp6_data8[0] 
 227 #define nd_ra_flags_reserved    nd_ra_hdr.icmp6_data8[1] 
 228 #define ND_RA_FLAG_MANAGED      0x80 
 229 #define ND_RA_FLAG_OTHER        0x40 
 230 #define ND_RA_FLAG_HA           0x20 
 233  * Router preference values based on draft-draves-ipngwg-router-selection-01. 
 234  * These are non-standard definitions. 
 236 #define ND_RA_FLAG_RTPREF_MASK  0x18 /* 00011000 */ 
 238 #define ND_RA_FLAG_RTPREF_HIGH  0x08 /* 00001000 */ 
 239 #define ND_RA_FLAG_RTPREF_MEDIUM        0x00 /* 00000000 */ 
 240 #define ND_RA_FLAG_RTPREF_LOW   0x18 /* 00011000 */ 
 241 #define ND_RA_FLAG_RTPREF_RSV   0x10 /* 00010000 */ 
 243 #define nd_ra_router_lifetime   nd_ra_hdr.icmp6_data16[1] 
 245 struct nd_neighbor_solicit 
{    /* neighbor solicitation */ 
 246         struct icmp6_hdr        nd_ns_hdr
; 
 247         struct in6_addr         nd_ns_target
;   /*target address */ 
 248         /* could be followed by options */ 
 251 #define nd_ns_type              nd_ns_hdr.icmp6_type 
 252 #define nd_ns_code              nd_ns_hdr.icmp6_code 
 253 #define nd_ns_cksum             nd_ns_hdr.icmp6_cksum 
 254 #define nd_ns_reserved          nd_ns_hdr.icmp6_data32[0] 
 256 struct nd_neighbor_advert 
{     /* neighbor advertisement */ 
 257         struct icmp6_hdr        nd_na_hdr
; 
 258         struct in6_addr         nd_na_target
;   /* target address */ 
 259         /* could be followed by options */ 
 262 #define nd_na_type              nd_na_hdr.icmp6_type 
 263 #define nd_na_code              nd_na_hdr.icmp6_code 
 264 #define nd_na_cksum             nd_na_hdr.icmp6_cksum 
 265 #define nd_na_flags_reserved    nd_na_hdr.icmp6_data32[0] 
 266 #if BYTE_ORDER == BIG_ENDIAN 
 267 #define ND_NA_FLAG_ROUTER               0x80000000 
 268 #define ND_NA_FLAG_SOLICITED            0x40000000 
 269 #define ND_NA_FLAG_OVERRIDE             0x20000000 
 271 #if BYTE_ORDER == LITTLE_ENDIAN 
 272 #define ND_NA_FLAG_ROUTER               0x80 
 273 #define ND_NA_FLAG_SOLICITED            0x40 
 274 #define ND_NA_FLAG_OVERRIDE             0x20 
 278 struct nd_redirect 
{            /* redirect */ 
 279         struct icmp6_hdr        nd_rd_hdr
; 
 280         struct in6_addr         nd_rd_target
;   /* target address */ 
 281         struct in6_addr         nd_rd_dst
;      /* destination address */ 
 282         /* could be followed by options */ 
 285 #define nd_rd_type              nd_rd_hdr.icmp6_type 
 286 #define nd_rd_code              nd_rd_hdr.icmp6_code 
 287 #define nd_rd_cksum             nd_rd_hdr.icmp6_cksum 
 288 #define nd_rd_reserved          nd_rd_hdr.icmp6_data32[0] 
 290 struct nd_opt_hdr 
{             /* Neighbor discovery option header */ 
 291         u_int8_t        nd_opt_type
; 
 293         /* followed by option specific data*/ 
 296 #define ND_OPT_SOURCE_LINKADDR          1 
 297 #define ND_OPT_TARGET_LINKADDR          2 
 298 #define ND_OPT_PREFIX_INFORMATION       3 
 299 #define ND_OPT_REDIRECTED_HEADER        4 
 302 #define ND_OPT_ROUTE_INFO               200     /* draft-ietf-ipngwg-router-preference, not officially assigned yet */ 
 304 struct nd_opt_prefix_info 
{     /* prefix information */ 
 305         u_int8_t        nd_opt_pi_type
; 
 306         u_int8_t        nd_opt_pi_len
; 
 307         u_int8_t        nd_opt_pi_prefix_len
; 
 308         u_int8_t        nd_opt_pi_flags_reserved
; 
 309         u_int32_t       nd_opt_pi_valid_time
; 
 310         u_int32_t       nd_opt_pi_preferred_time
; 
 311         u_int32_t       nd_opt_pi_reserved2
; 
 312         struct in6_addr nd_opt_pi_prefix
; 
 315 #define ND_OPT_PI_FLAG_ONLINK           0x80 
 316 #define ND_OPT_PI_FLAG_AUTO             0x40 
 318 struct nd_opt_rd_hdr 
{          /* redirected header */ 
 319         u_int8_t        nd_opt_rh_type
; 
 320         u_int8_t        nd_opt_rh_len
; 
 321         u_int16_t       nd_opt_rh_reserved1
; 
 322         u_int32_t       nd_opt_rh_reserved2
; 
 323         /* followed by IP header and data */ 
 326 struct nd_opt_mtu 
{             /* MTU option */ 
 327         u_int8_t        nd_opt_mtu_type
; 
 328         u_int8_t        nd_opt_mtu_len
; 
 329         u_int16_t       nd_opt_mtu_reserved
; 
 330         u_int32_t       nd_opt_mtu_mtu
; 
 333 struct nd_opt_route_info 
{      /* route info */ 
 334         u_int8_t        nd_opt_rti_type
; 
 335         u_int8_t        nd_opt_rti_len
; 
 336         u_int8_t        nd_opt_rti_prefixlen
; 
 337         u_int8_t        nd_opt_rti_flags
; 
 338         u_int32_t       nd_opt_rti_lifetime
; 
 339         /* followed by prefix */ 
 346 struct icmp6_namelookup 
{ 
 347         struct icmp6_hdr        icmp6_nl_hdr
; 
 348         u_int8_t        icmp6_nl_nonce
[8]; 
 349         int32_t         icmp6_nl_ttl
; 
 351         u_int8_t        icmp6_nl_len
; 
 352         u_int8_t        icmp6_nl_name
[3]; 
 354         /* could be followed by options */ 
 358  * icmp6 node information 
 360 struct icmp6_nodeinfo 
{ 
 361         struct icmp6_hdr icmp6_ni_hdr
; 
 362         u_int8_t icmp6_ni_nonce
[8]; 
 363         /* could be followed by reply data */ 
 366 #define ni_type         icmp6_ni_hdr.icmp6_type 
 367 #define ni_code         icmp6_ni_hdr.icmp6_code 
 368 #define ni_cksum        icmp6_ni_hdr.icmp6_cksum 
 369 #define ni_qtype        icmp6_ni_hdr.icmp6_data16[0] 
 370 #define ni_flags        icmp6_ni_hdr.icmp6_data16[1] 
 372 #define NI_QTYPE_NOOP           0 /* NOOP  */ 
 373 #define NI_QTYPE_SUPTYPES       1 /* Supported Qtypes */ 
 374 #define NI_QTYPE_FQDN           2 /* FQDN (draft 04) */ 
 375 #define NI_QTYPE_DNSNAME        2 /* DNS Name */ 
 376 #define NI_QTYPE_NODEADDR       3 /* Node Addresses */ 
 377 #define NI_QTYPE_IPV4ADDR       4 /* IPv4 Addresses */ 
 379 #if BYTE_ORDER == BIG_ENDIAN 
 380 #define NI_SUPTYPE_FLAG_COMPRESS        0x1 
 381 #define NI_FQDN_FLAG_VALIDTTL           0x1 
 382 #elif BYTE_ORDER == LITTLE_ENDIAN 
 383 #define NI_SUPTYPE_FLAG_COMPRESS        0x0100 
 384 #define NI_FQDN_FLAG_VALIDTTL           0x0100 
 387 #ifdef NAME_LOOKUPS_04 
 388 #if BYTE_ORDER == BIG_ENDIAN 
 389 #define NI_NODEADDR_FLAG_LINKLOCAL      0x1 
 390 #define NI_NODEADDR_FLAG_SITELOCAL      0x2 
 391 #define NI_NODEADDR_FLAG_GLOBAL         0x4 
 392 #define NI_NODEADDR_FLAG_ALL            0x8 
 393 #define NI_NODEADDR_FLAG_TRUNCATE       0x10 
 394 #define NI_NODEADDR_FLAG_ANYCAST        0x20 /* just experimental. not in spec */ 
 395 #elif BYTE_ORDER == LITTLE_ENDIAN 
 396 #define NI_NODEADDR_FLAG_LINKLOCAL      0x0100 
 397 #define NI_NODEADDR_FLAG_SITELOCAL      0x0200 
 398 #define NI_NODEADDR_FLAG_GLOBAL         0x0400 
 399 #define NI_NODEADDR_FLAG_ALL            0x0800 
 400 #define NI_NODEADDR_FLAG_TRUNCATE       0x1000 
 401 #define NI_NODEADDR_FLAG_ANYCAST        0x2000 /* just experimental. not in spec */ 
 403 #else  /* draft-ietf-ipngwg-icmp-name-lookups-05 (and later?) */ 
 404 #if BYTE_ORDER == BIG_ENDIAN 
 405 #define NI_NODEADDR_FLAG_TRUNCATE       0x1 
 406 #define NI_NODEADDR_FLAG_ALL            0x2 
 407 #define NI_NODEADDR_FLAG_COMPAT         0x4 
 408 #define NI_NODEADDR_FLAG_LINKLOCAL      0x8 
 409 #define NI_NODEADDR_FLAG_SITELOCAL      0x10 
 410 #define NI_NODEADDR_FLAG_GLOBAL         0x20 
 411 #define NI_NODEADDR_FLAG_ANYCAST        0x40 /* just experimental. not in spec */ 
 412 #elif BYTE_ORDER == LITTLE_ENDIAN 
 413 #define NI_NODEADDR_FLAG_TRUNCATE       0x0100 
 414 #define NI_NODEADDR_FLAG_ALL            0x0200 
 415 #define NI_NODEADDR_FLAG_COMPAT         0x0400 
 416 #define NI_NODEADDR_FLAG_LINKLOCAL      0x0800 
 417 #define NI_NODEADDR_FLAG_SITELOCAL      0x1000 
 418 #define NI_NODEADDR_FLAG_GLOBAL         0x2000 
 419 #define NI_NODEADDR_FLAG_ANYCAST        0x4000 /* just experimental. not in spec */ 
 423 struct ni_reply_fqdn 
{ 
 424         u_int32_t ni_fqdn_ttl
;  /* TTL */ 
 425         u_int8_t ni_fqdn_namelen
; /* length in octets of the FQDN */ 
 426         u_int8_t ni_fqdn_name
[3]; /* XXX: alignment */ 
 430  * Router Renumbering. as router-renum-08.txt 
 432 struct icmp6_router_renum 
{     /* router renumbering header */ 
 433         struct icmp6_hdr        rr_hdr
; 
 436         u_int16_t       rr_maxdelay
; 
 437         u_int32_t       rr_reserved
; 
 440 #define ICMP6_RR_FLAGS_TEST             0x80 
 441 #define ICMP6_RR_FLAGS_REQRESULT        0x40 
 442 #define ICMP6_RR_FLAGS_FORCEAPPLY       0x20 
 443 #define ICMP6_RR_FLAGS_SPECSITE         0x10 
 444 #define ICMP6_RR_FLAGS_PREVDONE         0x08 
 446 #define rr_type         rr_hdr.icmp6_type 
 447 #define rr_code         rr_hdr.icmp6_code 
 448 #define rr_cksum        rr_hdr.icmp6_cksum 
 449 #define rr_seqnum       rr_hdr.icmp6_data32[0] 
 451 struct rr_pco_match 
{           /* match prefix part */ 
 454         u_int8_t        rpm_ordinal
; 
 455         u_int8_t        rpm_matchlen
; 
 458         u_int16_t       rpm_reserved
; 
 459         struct  in6_addr        rpm_prefix
; 
 462 #define RPM_PCO_ADD             1 
 463 #define RPM_PCO_CHANGE          2 
 464 #define RPM_PCO_SETGLOBAL       3 
 465 #define RPM_PCO_MAX             4 
 467 struct rr_pco_use 
{             /* use prefix part */ 
 469         u_int8_t        rpu_keeplen
; 
 471         u_int8_t        rpu_raflags
; 
 472         u_int32_t       rpu_vltime
; 
 473         u_int32_t       rpu_pltime
; 
 475         struct  in6_addr rpu_prefix
; 
 477 #define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK  0x80 
 478 #define ICMP6_RR_PCOUSE_RAFLAGS_AUTO    0x40 
 480 #if BYTE_ORDER == BIG_ENDIAN 
 481 #define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME     0x80000000 
 482 #define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME     0x40000000 
 483 #elif BYTE_ORDER == LITTLE_ENDIAN 
 484 #define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME     0x80 
 485 #define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME     0x40 
 488 struct rr_result 
{              /* router renumbering result message */ 
 490         u_int8_t        rrr_ordinal
; 
 491         u_int8_t        rrr_matchedlen
; 
 493         struct  in6_addr rrr_prefix
; 
 495 #if BYTE_ORDER == BIG_ENDIAN 
 496 #define ICMP6_RR_RESULT_FLAGS_OOB               0x0002 
 497 #define ICMP6_RR_RESULT_FLAGS_FORBIDDEN         0x0001 
 498 #elif BYTE_ORDER == LITTLE_ENDIAN 
 499 #define ICMP6_RR_RESULT_FLAGS_OOB               0x0200 
 500 #define ICMP6_RR_RESULT_FLAGS_FORBIDDEN         0x0100 
 504  * icmp6 filter structures. 
 507 struct icmp6_filter 
{ 
 508         u_int32_t icmp6_filt
[8]; 
 512 #ifdef __APPLE_API_UNSTABLE 
 513 #define ICMP6_FILTER_SETPASSALL(filterp) \ 
 516         p = (u_char *)filterp;                                  \ 
 517         for (i = 0; i < sizeof(struct icmp6_filter); i++)       \ 
 520 #define ICMP6_FILTER_SETBLOCKALL(filterp) \ 
 521         bzero(filterp, sizeof(struct icmp6_filter)) 
 522 #endif /* __APPLE_API_UNSTABLE */ 
 524 #define ICMP6_FILTER_SETPASSALL(filterp) \ 
 525         memset(filterp, 0xff, sizeof(struct icmp6_filter)) 
 526 #define ICMP6_FILTER_SETBLOCKALL(filterp) \ 
 527         memset(filterp, 0x00, sizeof(struct icmp6_filter)) 
 530 #define ICMP6_FILTER_SETPASS(type, filterp) \ 
 531         (((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type) & 31))) 
 532 #define ICMP6_FILTER_SETBLOCK(type, filterp) \ 
 533         (((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31))) 
 534 #define ICMP6_FILTER_WILLPASS(type, filterp) \ 
 535         ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0) 
 536 #define ICMP6_FILTER_WILLBLOCK(type, filterp) \ 
 537         ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0) 
 539 #ifdef __APPLE_API_UNSTABLE 
 541  * Variables related to this implementation 
 542  * of the internet control message protocol version 6. 
 544 struct icmp6errstat 
{ 
 545         u_quad_t icp6errs_dst_unreach_noroute
; 
 546         u_quad_t icp6errs_dst_unreach_admin
; 
 547         u_quad_t icp6errs_dst_unreach_beyondscope
; 
 548         u_quad_t icp6errs_dst_unreach_addr
; 
 549         u_quad_t icp6errs_dst_unreach_noport
; 
 550         u_quad_t icp6errs_packet_too_big
; 
 551         u_quad_t icp6errs_time_exceed_transit
; 
 552         u_quad_t icp6errs_time_exceed_reassembly
; 
 553         u_quad_t icp6errs_paramprob_header
; 
 554         u_quad_t icp6errs_paramprob_nextheader
; 
 555         u_quad_t icp6errs_paramprob_option
; 
 556         u_quad_t icp6errs_redirect
; /* we regard redirect as an error here */ 
 557         u_quad_t icp6errs_unknown
; 
 561 /* statistics related to icmp6 packets generated */ 
 562         u_quad_t icp6s_error
;           /* # of calls to icmp6_error */ 
 563         u_quad_t icp6s_canterror
;       /* no error 'cuz old was icmp */ 
 564         u_quad_t icp6s_toofreq
;         /* no error 'cuz rate limitation */ 
 565         u_quad_t icp6s_outhist
[256]; 
 566 /* statistics related to input message processed */ 
 567         u_quad_t icp6s_badcode
;         /* icmp6_code out of range */ 
 568         u_quad_t icp6s_tooshort
;        /* packet < sizeof(struct icmp6_hdr) */ 
 569         u_quad_t icp6s_checksum
;        /* bad checksum */ 
 570         u_quad_t icp6s_badlen
;          /* calculated bound mismatch */ 
 571         u_quad_t icp6s_reflect
;         /* number of responses */ 
 572         u_quad_t icp6s_inhist
[256];      
 573         u_quad_t icp6s_nd_toomanyopt
;   /* too many ND options */ 
 574         struct icmp6errstat icp6s_outerrhist
; 
 575 #define icp6s_odst_unreach_noroute \ 
 576         icp6s_outerrhist.icp6errs_dst_unreach_noroute 
 577 #define icp6s_odst_unreach_admin icp6s_outerrhist.icp6errs_dst_unreach_admin 
 578 #define icp6s_odst_unreach_beyondscope \ 
 579         icp6s_outerrhist.icp6errs_dst_unreach_beyondscope 
 580 #define icp6s_odst_unreach_addr icp6s_outerrhist.icp6errs_dst_unreach_addr 
 581 #define icp6s_odst_unreach_noport icp6s_outerrhist.icp6errs_dst_unreach_noport 
 582 #define icp6s_opacket_too_big icp6s_outerrhist.icp6errs_packet_too_big 
 583 #define icp6s_otime_exceed_transit \ 
 584         icp6s_outerrhist.icp6errs_time_exceed_transit 
 585 #define icp6s_otime_exceed_reassembly \ 
 586         icp6s_outerrhist.icp6errs_time_exceed_reassembly 
 587 #define icp6s_oparamprob_header icp6s_outerrhist.icp6errs_paramprob_header 
 588 #define icp6s_oparamprob_nextheader \ 
 589         icp6s_outerrhist.icp6errs_paramprob_nextheader 
 590 #define icp6s_oparamprob_option icp6s_outerrhist.icp6errs_paramprob_option 
 591 #define icp6s_oredirect icp6s_outerrhist.icp6errs_redirect 
 592 #define icp6s_ounknown icp6s_outerrhist.icp6errs_unknown 
 593         u_quad_t icp6s_pmtuchg
;         /* path MTU changes */ 
 594         u_quad_t icp6s_nd_badopt
;       /* bad ND options */ 
 595         u_quad_t icp6s_badns
;           /* bad neighbor solicitation */ 
 596         u_quad_t icp6s_badna
;           /* bad neighbor advertisement */ 
 597         u_quad_t icp6s_badrs
;           /* bad router advertisement */ 
 598         u_quad_t icp6s_badra
;           /* bad router advertisement */ 
 599         u_quad_t icp6s_badredirect
;     /* bad redirect message */ 
 603  * Names for ICMP sysctl objects 
 605 #define ICMPV6CTL_STATS         1 
 606 #define ICMPV6CTL_REDIRACCEPT   2       /* accept/process redirects */ 
 607 #define ICMPV6CTL_REDIRTIMEOUT  3       /* redirect cache time */ 
 608 #define ICMPV6CTL_ND6_PRUNE     6 
 609 #define ICMPV6CTL_ND6_DELAY     8 
 610 #define ICMPV6CTL_ND6_UMAXTRIES 9 
 611 #define ICMPV6CTL_ND6_MMAXTRIES         10 
 612 #define ICMPV6CTL_ND6_USELOOPBACK       11 
 613 /*#define ICMPV6CTL_ND6_PROXYALL        12      obsoleted, do not reuse here */ 
 614 #define ICMPV6CTL_NODEINFO      13 
 615 #define ICMPV6CTL_ERRPPSLIMIT   14      /* ICMPv6 error pps limitation */ 
 616 #define ICMPV6CTL_ND6_MAXNUDHINT        15 
 617 #define ICMPV6CTL_MTUDISC_HIWAT 16 
 618 #define ICMPV6CTL_MTUDISC_LOWAT 17 
 619 #define ICMPV6CTL_ND6_DEBUG     18 
 620 #define ICMPV6CTL_ND6_DRLIST    19 
 621 #define ICMPV6CTL_ND6_PRLIST    20 
 622 #define ICMPV6CTL_MAXID         21 
 624 #define ICMPV6CTL_NAMES { \ 
 627         { "rediraccept", CTLTYPE_INT }, \ 
 628         { "redirtimeout", CTLTYPE_INT }, \ 
 631         { "nd6_prune", CTLTYPE_INT }, \ 
 633         { "nd6_delay", CTLTYPE_INT }, \ 
 634         { "nd6_umaxtries", CTLTYPE_INT }, \ 
 635         { "nd6_mmaxtries", CTLTYPE_INT }, \ 
 636         { "nd6_useloopback", CTLTYPE_INT }, \ 
 638         { "nodeinfo", CTLTYPE_INT }, \ 
 639         { "errppslimit", CTLTYPE_INT }, \ 
 640         { "nd6_maxnudhint", CTLTYPE_INT }, \ 
 641         { "mtudisc_hiwat", CTLTYPE_INT }, \ 
 642         { "mtudisc_lowat", CTLTYPE_INT }, \ 
 643         { "nd6_debug", CTLTYPE_INT }, \ 
 647 #endif /* __APPLE_API_UNSTABLE */ 
 649 #define RTF_PROBEMTU    RTF_PROTO1 
 657 #ifdef __APPLE_API_PRIVATE 
 658 void    icmp6_init 
__P((void)); 
 659 void    icmp6_paramerror 
__P((struct mbuf 
*, int)); 
 660 void    icmp6_error 
__P((struct mbuf 
*, int, int, int)); 
 661 int     icmp6_input 
__P((struct mbuf 
**, int *, int)); 
 662 void    icmp6_fasttimo 
__P((void)); 
 663 void    icmp6_reflect 
__P((struct mbuf 
*, size_t)); 
 664 void    icmp6_prepare 
__P((struct mbuf 
*)); 
 665 void    icmp6_redirect_input 
__P((struct mbuf 
*, int)); 
 666 void    icmp6_redirect_output 
__P((struct mbuf 
*, struct rtentry 
*)); 
 669 void    icmp6_mtudisc_update 
__P((struct ip6ctlparam 
*, int)); 
 671 /* XXX: is this the right place for these macros? */ 
 672 #define icmp6_ifstat_inc(ifp, tag) \ 
 674         if ((ifp) && (ifp)->if_index <= if_index                        \ 
 675          && (ifp)->if_index < icmp6_ifstatmax                   \ 
 676          && icmp6_ifstat && icmp6_ifstat[(ifp)->if_index]) {    \ 
 677                 icmp6_ifstat[(ifp)->if_index]->tag++;           \ 
 681 #define icmp6_ifoutstat_inc(ifp, type, code) \ 
 683                 icmp6_ifstat_inc(ifp, ifs6_out_msg); \ 
 684                 if (type < ICMP6_INFOMSG_MASK) \ 
 685                         icmp6_ifstat_inc(ifp, ifs6_out_error); \ 
 687                  case ICMP6_DST_UNREACH: \ 
 688                          icmp6_ifstat_inc(ifp, ifs6_out_dstunreach); \ 
 689                          if (code == ICMP6_DST_UNREACH_ADMIN) \ 
 690                                  icmp6_ifstat_inc(ifp, ifs6_out_adminprohib); \ 
 692                  case ICMP6_PACKET_TOO_BIG: \ 
 693                          icmp6_ifstat_inc(ifp, ifs6_out_pkttoobig); \ 
 695                  case ICMP6_TIME_EXCEEDED: \ 
 696                          icmp6_ifstat_inc(ifp, ifs6_out_timeexceed); \ 
 698                  case ICMP6_PARAM_PROB: \ 
 699                          icmp6_ifstat_inc(ifp, ifs6_out_paramprob); \ 
 701                  case ICMP6_ECHO_REQUEST: \ 
 702                          icmp6_ifstat_inc(ifp, ifs6_out_echo); \ 
 704                  case ICMP6_ECHO_REPLY: \ 
 705                          icmp6_ifstat_inc(ifp, ifs6_out_echoreply); \ 
 707                  case MLD6_LISTENER_QUERY: \ 
 708                          icmp6_ifstat_inc(ifp, ifs6_out_mldquery); \ 
 710                  case MLD6_LISTENER_REPORT: \ 
 711                          icmp6_ifstat_inc(ifp, ifs6_out_mldreport); \ 
 713                  case MLD6_LISTENER_DONE: \ 
 714                          icmp6_ifstat_inc(ifp, ifs6_out_mlddone); \ 
 716                  case ND_ROUTER_SOLICIT: \ 
 717                          icmp6_ifstat_inc(ifp, ifs6_out_routersolicit); \ 
 719                  case ND_ROUTER_ADVERT: \ 
 720                          icmp6_ifstat_inc(ifp, ifs6_out_routeradvert); \ 
 722                  case ND_NEIGHBOR_SOLICIT: \ 
 723                          icmp6_ifstat_inc(ifp, ifs6_out_neighborsolicit); \ 
 725                  case ND_NEIGHBOR_ADVERT: \ 
 726                          icmp6_ifstat_inc(ifp, ifs6_out_neighboradvert); \ 
 729                          icmp6_ifstat_inc(ifp, ifs6_out_redirect); \ 
 734 extern int      icmp6_rediraccept
;      /* accept/process redirects */ 
 735 extern int      icmp6_redirtimeout
;     /* cache time for redirect routes */ 
 736 #endif /* __APPLE_API_PRIVATE */ 
 739 #endif /* !_NETINET_ICMP6_H_ */