Home | History | Annotate | Line # | Download | only in netinet
icmp6.h revision 1.47
      1  1.47  christos /*	$NetBSD: icmp6.h,v 1.47 2013/07/01 12:43:15 christos Exp $	*/
      2  1.26    itojun /*	$KAME: icmp6.h,v 1.84 2003/04/23 10:26:51 itojun Exp $	*/
      3  1.26    itojun 
      4   1.3   thorpej 
      5   1.2    itojun /*
      6   1.2    itojun  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
      7   1.2    itojun  * All rights reserved.
      8   1.9    itojun  *
      9   1.2    itojun  * Redistribution and use in source and binary forms, with or without
     10   1.2    itojun  * modification, are permitted provided that the following conditions
     11   1.2    itojun  * are met:
     12   1.2    itojun  * 1. Redistributions of source code must retain the above copyright
     13   1.2    itojun  *    notice, this list of conditions and the following disclaimer.
     14   1.2    itojun  * 2. Redistributions in binary form must reproduce the above copyright
     15   1.2    itojun  *    notice, this list of conditions and the following disclaimer in the
     16   1.2    itojun  *    documentation and/or other materials provided with the distribution.
     17   1.2    itojun  * 3. Neither the name of the project nor the names of its contributors
     18   1.2    itojun  *    may be used to endorse or promote products derived from this software
     19   1.2    itojun  *    without specific prior written permission.
     20   1.9    itojun  *
     21   1.2    itojun  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
     22   1.2    itojun  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23   1.2    itojun  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24   1.2    itojun  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
     25   1.2    itojun  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26   1.2    itojun  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27   1.2    itojun  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28   1.2    itojun  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29   1.2    itojun  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30   1.2    itojun  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31   1.2    itojun  * SUCH DAMAGE.
     32   1.2    itojun  */
     33   1.2    itojun 
     34   1.4    itojun /*
     35   1.4    itojun  * Copyright (c) 1982, 1986, 1993
     36   1.4    itojun  *	The Regents of the University of California.  All rights reserved.
     37   1.4    itojun  *
     38   1.4    itojun  * Redistribution and use in source and binary forms, with or without
     39   1.4    itojun  * modification, are permitted provided that the following conditions
     40   1.4    itojun  * are met:
     41   1.4    itojun  * 1. Redistributions of source code must retain the above copyright
     42   1.4    itojun  *    notice, this list of conditions and the following disclaimer.
     43   1.4    itojun  * 2. Redistributions in binary form must reproduce the above copyright
     44   1.4    itojun  *    notice, this list of conditions and the following disclaimer in the
     45   1.4    itojun  *    documentation and/or other materials provided with the distribution.
     46  1.28       agc  * 3. Neither the name of the University nor the names of its contributors
     47   1.4    itojun  *    may be used to endorse or promote products derived from this software
     48   1.4    itojun  *    without specific prior written permission.
     49   1.4    itojun  *
     50   1.4    itojun  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     51   1.4    itojun  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     52   1.4    itojun  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     53   1.4    itojun  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     54   1.4    itojun  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     55   1.4    itojun  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     56   1.4    itojun  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     57   1.4    itojun  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     58   1.4    itojun  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     59   1.4    itojun  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     60   1.4    itojun  * SUCH DAMAGE.
     61   1.4    itojun  *
     62   1.4    itojun  *	@(#)ip_icmp.h	8.1 (Berkeley) 6/10/93
     63   1.4    itojun  */
     64   1.4    itojun 
     65   1.2    itojun #ifndef _NETINET_ICMP6_H_
     66   1.2    itojun #define _NETINET_ICMP6_H_
     67   1.2    itojun 
     68   1.4    itojun #define ICMPV6_PLD_MAXLEN	1232	/* IPV6_MMTU - sizeof(struct ip6_hdr)
     69   1.4    itojun 					   - sizeof(struct icmp6_hdr) */
     70   1.4    itojun 
     71   1.4    itojun struct icmp6_hdr {
     72   1.4    itojun 	u_int8_t	icmp6_type;	/* type field */
     73   1.4    itojun 	u_int8_t	icmp6_code;	/* code field */
     74   1.4    itojun 	u_int16_t	icmp6_cksum;	/* checksum field */
     75   1.4    itojun 	union {
     76   1.4    itojun 		u_int32_t	icmp6_un_data32[1]; /* type-specific field */
     77   1.4    itojun 		u_int16_t	icmp6_un_data16[2]; /* type-specific field */
     78   1.4    itojun 		u_int8_t	icmp6_un_data8[4];  /* type-specific field */
     79   1.4    itojun 	} icmp6_dataun;
     80  1.36     perry } __packed;
     81   1.4    itojun 
     82   1.4    itojun #define icmp6_data32	icmp6_dataun.icmp6_un_data32
     83   1.4    itojun #define icmp6_data16	icmp6_dataun.icmp6_un_data16
     84   1.4    itojun #define icmp6_data8	icmp6_dataun.icmp6_un_data8
     85   1.4    itojun #define icmp6_pptr	icmp6_data32[0]		/* parameter prob */
     86   1.4    itojun #define icmp6_mtu	icmp6_data32[0]		/* packet too big */
     87   1.4    itojun #define icmp6_id	icmp6_data16[0]		/* echo request/reply */
     88   1.4    itojun #define icmp6_seq	icmp6_data16[1]		/* echo request/reply */
     89   1.4    itojun #define icmp6_maxdelay	icmp6_data16[0]		/* mcast group membership */
     90   1.4    itojun 
     91   1.4    itojun #define ICMP6_DST_UNREACH		1	/* dest unreachable, codes: */
     92   1.4    itojun #define ICMP6_PACKET_TOO_BIG		2	/* packet too big */
     93   1.4    itojun #define ICMP6_TIME_EXCEEDED		3	/* time exceeded, code: */
     94   1.4    itojun #define ICMP6_PARAM_PROB		4	/* ip6 header bad */
     95   1.4    itojun 
     96   1.4    itojun #define ICMP6_ECHO_REQUEST		128	/* echo service */
     97   1.4    itojun #define ICMP6_ECHO_REPLY		129	/* echo reply */
     98  1.27    itojun #define MLD_LISTENER_QUERY		130 	/* multicast listener query */
     99  1.27    itojun #define MLD_LISTENER_REPORT		131	/* multicast listener report */
    100  1.27    itojun #define MLD_LISTENER_DONE		132	/* multicast listener done */
    101  1.47  christos #define MLD_LISTENER_REDUCTION MLD_LISTENER_DONE /* RFC3542 definition */
    102  1.27    itojun 
    103  1.27    itojun /* RFC2292 decls */
    104   1.4    itojun #define ICMP6_MEMBERSHIP_QUERY		130	/* group membership query */
    105   1.4    itojun #define ICMP6_MEMBERSHIP_REPORT		131	/* group membership report */
    106   1.4    itojun #define ICMP6_MEMBERSHIP_REDUCTION	132	/* group membership termination */
    107  1.26    itojun 
    108  1.26    itojun #ifndef _KERNEL
    109  1.26    itojun /* the followings are for backward compatibility to old KAME apps. */
    110  1.26    itojun #define MLD6_LISTENER_QUERY	MLD_LISTENER_QUERY
    111  1.26    itojun #define MLD6_LISTENER_REPORT	MLD_LISTENER_REPORT
    112  1.26    itojun #define MLD6_LISTENER_DONE	MLD_LISTENER_DONE
    113  1.26    itojun #endif
    114   1.4    itojun 
    115   1.4    itojun #define ND_ROUTER_SOLICIT		133	/* router solicitation */
    116  1.35       wiz #define ND_ROUTER_ADVERT		134	/* router advertisement */
    117   1.4    itojun #define ND_NEIGHBOR_SOLICIT		135	/* neighbor solicitation */
    118  1.35       wiz #define ND_NEIGHBOR_ADVERT		136	/* neighbor advertisement */
    119   1.4    itojun #define ND_REDIRECT			137	/* redirect */
    120   1.4    itojun 
    121   1.4    itojun #define ICMP6_ROUTER_RENUMBERING	138	/* router renumbering */
    122   1.4    itojun 
    123   1.4    itojun #define ICMP6_WRUREQUEST		139	/* who are you request */
    124   1.4    itojun #define ICMP6_WRUREPLY			140	/* who are you reply */
    125   1.4    itojun #define ICMP6_FQDN_QUERY		139	/* FQDN query */
    126   1.4    itojun #define ICMP6_FQDN_REPLY		140	/* FQDN reply */
    127   1.4    itojun #define ICMP6_NI_QUERY			139	/* node information request */
    128   1.4    itojun #define ICMP6_NI_REPLY			140	/* node information reply */
    129  1.45       spz #define MLDV2_LISTENER_REPORT		143	/* RFC3810 listener report */
    130   1.4    itojun 
    131   1.4    itojun /* The definitions below are experimental. TBA */
    132  1.26    itojun #define MLD_MTRACE_RESP			200	/* mtrace response(to sender) */
    133  1.26    itojun #define MLD_MTRACE			201	/* mtrace messages */
    134  1.26    itojun 
    135  1.26    itojun #ifndef _KERNEL
    136  1.26    itojun /* the followings are for backward compatibility to old KAME apps. */
    137  1.26    itojun #define MLD6_MTRACE_RESP	MLD_MTRACE_RESP
    138  1.26    itojun #define MLD6_MTRACE		MLD_MTRACE
    139  1.26    itojun #endif
    140   1.4    itojun 
    141  1.21    itojun #define ICMP6_MAXTYPE			201
    142   1.4    itojun 
    143   1.4    itojun #define ICMP6_DST_UNREACH_NOROUTE	0	/* no route to destination */
    144   1.4    itojun #define ICMP6_DST_UNREACH_ADMIN	 	1	/* administratively prohibited */
    145   1.4    itojun #define ICMP6_DST_UNREACH_NOTNEIGHBOR	2	/* not a neighbor(obsolete) */
    146   1.4    itojun #define ICMP6_DST_UNREACH_BEYONDSCOPE	2	/* beyond scope of source address */
    147   1.4    itojun #define ICMP6_DST_UNREACH_ADDR		3	/* address unreachable */
    148   1.4    itojun #define ICMP6_DST_UNREACH_NOPORT	4	/* port unreachable */
    149  1.45       spz #define ICMP6_DST_UNREACH_POLICY	5	/* source address failed ingress/egress policy */
    150  1.45       spz #define ICMP6_DST_UNREACH_REJROUTE	6	/* reject route to destination */
    151  1.45       spz #define ICMP6_DST_UNREACH_SOURCERT	7	/* error in source routing header */
    152   1.4    itojun 
    153   1.4    itojun #define ICMP6_TIME_EXCEED_TRANSIT 	0	/* ttl==0 in transit */
    154   1.4    itojun #define ICMP6_TIME_EXCEED_REASSEMBLY	1	/* ttl==0 in reass */
    155   1.4    itojun 
    156   1.4    itojun #define ICMP6_PARAMPROB_HEADER 	 	0	/* erroneous header field */
    157   1.4    itojun #define ICMP6_PARAMPROB_NEXTHEADER	1	/* unrecognized next header */
    158   1.4    itojun #define ICMP6_PARAMPROB_OPTION		2	/* unrecognized option */
    159   1.4    itojun 
    160   1.4    itojun #define ICMP6_INFOMSG_MASK		0x80	/* all informational messages */
    161   1.4    itojun 
    162   1.9    itojun #define ICMP6_NI_SUBJ_IPV6	0	/* Query Subject is an IPv6 address */
    163   1.9    itojun #define ICMP6_NI_SUBJ_FQDN	1	/* Query Subject is a Domain name */
    164   1.9    itojun #define ICMP6_NI_SUBJ_IPV4	2	/* Query Subject is an IPv4 address */
    165   1.9    itojun 
    166  1.12    itojun #define ICMP6_NI_SUCCESS	0	/* node information successful reply */
    167   1.4    itojun #define ICMP6_NI_REFUSED	1	/* node information request is refused */
    168   1.4    itojun #define ICMP6_NI_UNKNOWN	2	/* unknown Qtype */
    169   1.4    itojun 
    170   1.4    itojun #define ICMP6_ROUTER_RENUMBERING_COMMAND  0	/* rr command */
    171   1.4    itojun #define ICMP6_ROUTER_RENUMBERING_RESULT   1	/* rr result */
    172   1.4    itojun #define ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET   255	/* rr seq num reset */
    173   1.4    itojun 
    174   1.4    itojun /* Used in kernel only */
    175   1.4    itojun #define ND_REDIRECT_ONLINK	0	/* redirect to an on-link node */
    176   1.4    itojun #define ND_REDIRECT_ROUTER	1	/* redirect to a better router */
    177   1.4    itojun 
    178   1.4    itojun /*
    179   1.4    itojun  * Multicast Listener Discovery
    180   1.4    itojun  */
    181  1.26    itojun struct mld_hdr {
    182  1.26    itojun 	struct icmp6_hdr	mld_icmp6_hdr;
    183  1.26    itojun 	struct in6_addr		mld_addr; /* multicast address */
    184  1.36     perry } __packed;
    185   1.4    itojun 
    186  1.26    itojun /* definitions to provide backward compatibility to old KAME applications */
    187  1.26    itojun #ifndef _KERNEL
    188  1.26    itojun #define mld6_hdr	mld_hdr
    189  1.26    itojun #define mld6_type	mld_type
    190  1.26    itojun #define mld6_code	mld_code
    191  1.26    itojun #define mld6_cksum	mld_cksum
    192  1.26    itojun #define mld6_maxdelay	mld_maxdelay
    193  1.26    itojun #define mld6_reserved	mld_reserved
    194  1.26    itojun #define mld6_addr	mld_addr
    195  1.26    itojun #endif
    196  1.26    itojun 
    197  1.26    itojun /* shortcut macro definitions */
    198  1.26    itojun #define mld_type	mld_icmp6_hdr.icmp6_type
    199  1.26    itojun #define mld_code	mld_icmp6_hdr.icmp6_code
    200  1.26    itojun #define mld_cksum	mld_icmp6_hdr.icmp6_cksum
    201  1.26    itojun #define mld_maxdelay	mld_icmp6_hdr.icmp6_data16[0]
    202  1.26    itojun #define mld_reserved	mld_icmp6_hdr.icmp6_data16[1]
    203   1.4    itojun 
    204  1.34    rpaulo #define MLD_MINLEN			24
    205  1.34    rpaulo 
    206   1.4    itojun /*
    207   1.4    itojun  * Neighbor Discovery
    208   1.4    itojun  */
    209   1.4    itojun 
    210   1.4    itojun struct nd_router_solicit {	/* router solicitation */
    211   1.4    itojun 	struct icmp6_hdr 	nd_rs_hdr;
    212   1.4    itojun 	/* could be followed by options */
    213  1.36     perry } __packed;
    214   1.4    itojun 
    215   1.4    itojun #define nd_rs_type	nd_rs_hdr.icmp6_type
    216   1.4    itojun #define nd_rs_code	nd_rs_hdr.icmp6_code
    217   1.4    itojun #define nd_rs_cksum	nd_rs_hdr.icmp6_cksum
    218   1.4    itojun #define nd_rs_reserved	nd_rs_hdr.icmp6_data32[0]
    219   1.4    itojun 
    220   1.4    itojun struct nd_router_advert {	/* router advertisement */
    221   1.4    itojun 	struct icmp6_hdr	nd_ra_hdr;
    222   1.4    itojun 	u_int32_t		nd_ra_reachable;	/* reachable time */
    223   1.4    itojun 	u_int32_t		nd_ra_retransmit;	/* retransmit timer */
    224   1.4    itojun 	/* could be followed by options */
    225  1.36     perry } __packed;
    226   1.4    itojun 
    227   1.4    itojun #define nd_ra_type		nd_ra_hdr.icmp6_type
    228   1.4    itojun #define nd_ra_code		nd_ra_hdr.icmp6_code
    229   1.4    itojun #define nd_ra_cksum		nd_ra_hdr.icmp6_cksum
    230   1.4    itojun #define nd_ra_curhoplimit	nd_ra_hdr.icmp6_data8[0]
    231   1.4    itojun #define nd_ra_flags_reserved	nd_ra_hdr.icmp6_data8[1]
    232   1.4    itojun #define ND_RA_FLAG_MANAGED	0x80
    233   1.4    itojun #define ND_RA_FLAG_OTHER	0x40
    234  1.34    rpaulo #define ND_RA_FLAG_HOME_AGENT	0x20
    235  1.34    rpaulo 
    236  1.34    rpaulo /*
    237  1.41       spz  * Router preference values based on RFC4191.
    238  1.34    rpaulo  */
    239  1.34    rpaulo #define ND_RA_FLAG_RTPREF_MASK	0x18 /* 00011000 */
    240  1.34    rpaulo 
    241  1.34    rpaulo #define ND_RA_FLAG_RTPREF_HIGH	0x08 /* 00001000 */
    242  1.34    rpaulo #define ND_RA_FLAG_RTPREF_MEDIUM	0x00 /* 00000000 */
    243  1.34    rpaulo #define ND_RA_FLAG_RTPREF_LOW	0x18 /* 00011000 */
    244  1.34    rpaulo #define ND_RA_FLAG_RTPREF_RSV	0x10 /* 00010000 */
    245  1.34    rpaulo 
    246   1.4    itojun #define nd_ra_router_lifetime	nd_ra_hdr.icmp6_data16[1]
    247   1.4    itojun 
    248   1.4    itojun struct nd_neighbor_solicit {	/* neighbor solicitation */
    249   1.4    itojun 	struct icmp6_hdr	nd_ns_hdr;
    250   1.4    itojun 	struct in6_addr		nd_ns_target;	/*target address */
    251   1.4    itojun 	/* could be followed by options */
    252  1.36     perry } __packed;
    253   1.4    itojun 
    254   1.4    itojun #define nd_ns_type		nd_ns_hdr.icmp6_type
    255   1.4    itojun #define nd_ns_code		nd_ns_hdr.icmp6_code
    256   1.4    itojun #define nd_ns_cksum		nd_ns_hdr.icmp6_cksum
    257   1.4    itojun #define nd_ns_reserved		nd_ns_hdr.icmp6_data32[0]
    258   1.4    itojun 
    259   1.4    itojun struct nd_neighbor_advert {	/* neighbor advertisement */
    260   1.4    itojun 	struct icmp6_hdr	nd_na_hdr;
    261   1.4    itojun 	struct in6_addr		nd_na_target;	/* target address */
    262   1.4    itojun 	/* could be followed by options */
    263  1.36     perry } __packed;
    264   1.4    itojun 
    265   1.4    itojun #define nd_na_type		nd_na_hdr.icmp6_type
    266   1.4    itojun #define nd_na_code		nd_na_hdr.icmp6_code
    267   1.4    itojun #define nd_na_cksum		nd_na_hdr.icmp6_cksum
    268   1.4    itojun #define nd_na_flags_reserved	nd_na_hdr.icmp6_data32[0]
    269   1.4    itojun #if BYTE_ORDER == BIG_ENDIAN
    270   1.4    itojun #define ND_NA_FLAG_ROUTER		0x80000000
    271   1.4    itojun #define ND_NA_FLAG_SOLICITED		0x40000000
    272   1.4    itojun #define ND_NA_FLAG_OVERRIDE		0x20000000
    273   1.4    itojun #else
    274   1.4    itojun #if BYTE_ORDER == LITTLE_ENDIAN
    275   1.4    itojun #define ND_NA_FLAG_ROUTER		0x80
    276   1.4    itojun #define ND_NA_FLAG_SOLICITED		0x40
    277   1.4    itojun #define ND_NA_FLAG_OVERRIDE		0x20
    278   1.4    itojun #endif
    279   1.4    itojun #endif
    280   1.4    itojun 
    281   1.4    itojun struct nd_redirect {		/* redirect */
    282   1.4    itojun 	struct icmp6_hdr	nd_rd_hdr;
    283   1.4    itojun 	struct in6_addr		nd_rd_target;	/* target address */
    284   1.4    itojun 	struct in6_addr		nd_rd_dst;	/* destination address */
    285   1.4    itojun 	/* could be followed by options */
    286  1.36     perry } __packed;
    287   1.4    itojun 
    288   1.4    itojun #define nd_rd_type		nd_rd_hdr.icmp6_type
    289   1.4    itojun #define nd_rd_code		nd_rd_hdr.icmp6_code
    290   1.4    itojun #define nd_rd_cksum		nd_rd_hdr.icmp6_cksum
    291   1.4    itojun #define nd_rd_reserved		nd_rd_hdr.icmp6_data32[0]
    292   1.4    itojun 
    293   1.4    itojun struct nd_opt_hdr {		/* Neighbor discovery option header */
    294   1.4    itojun 	u_int8_t	nd_opt_type;
    295   1.4    itojun 	u_int8_t	nd_opt_len;
    296   1.4    itojun 	/* followed by option specific data*/
    297  1.36     perry } __packed;
    298   1.4    itojun 
    299   1.4    itojun #define ND_OPT_SOURCE_LINKADDR		1
    300   1.4    itojun #define ND_OPT_TARGET_LINKADDR		2
    301   1.4    itojun #define ND_OPT_PREFIX_INFORMATION	3
    302   1.4    itojun #define ND_OPT_REDIRECTED_HEADER	4
    303   1.4    itojun #define ND_OPT_MTU			5
    304  1.40  christos #define ND_OPT_ADVINTERVAL		7
    305  1.40  christos #define ND_OPT_HOMEAGENT_INFO		8
    306  1.40  christos #define ND_OPT_SOURCE_ADDRLIST		9
    307  1.40  christos #define ND_OPT_TARGET_ADDRLIST		10
    308  1.44       roy #define ND_OPT_MAP			23	/* RFC 5380 */
    309  1.44       roy #define ND_OPT_ROUTE_INFO		24	/* RFC 4191 */
    310  1.44       roy #define ND_OPT_RDNSS			25	/* RFC 6016 */
    311  1.44       roy #define ND_OPT_DNSSL			31	/* RFC 6016 */
    312  1.40  christos 
    313  1.40  christos struct nd_opt_route_info {	/* route info */
    314  1.40  christos 	u_int8_t	nd_opt_rti_type;
    315  1.40  christos 	u_int8_t	nd_opt_rti_len;
    316  1.40  christos 	u_int8_t	nd_opt_rti_prefixlen;
    317  1.40  christos 	u_int8_t	nd_opt_rti_flags;
    318  1.40  christos 	u_int32_t	nd_opt_rti_lifetime;
    319  1.40  christos 	/* prefix follows */
    320  1.40  christos };
    321   1.4    itojun 
    322   1.4    itojun struct nd_opt_prefix_info {	/* prefix information */
    323   1.4    itojun 	u_int8_t	nd_opt_pi_type;
    324   1.4    itojun 	u_int8_t	nd_opt_pi_len;
    325   1.4    itojun 	u_int8_t	nd_opt_pi_prefix_len;
    326   1.4    itojun 	u_int8_t	nd_opt_pi_flags_reserved;
    327   1.4    itojun 	u_int32_t	nd_opt_pi_valid_time;
    328   1.4    itojun 	u_int32_t	nd_opt_pi_preferred_time;
    329   1.4    itojun 	u_int32_t	nd_opt_pi_reserved2;
    330   1.4    itojun 	struct in6_addr	nd_opt_pi_prefix;
    331  1.36     perry } __packed;
    332   1.4    itojun 
    333   1.4    itojun #define ND_OPT_PI_FLAG_ONLINK		0x80
    334   1.4    itojun #define ND_OPT_PI_FLAG_AUTO		0x40
    335   1.4    itojun 
    336  1.26    itojun struct nd_opt_rd_hdr {		/* redirected header */
    337   1.4    itojun 	u_int8_t	nd_opt_rh_type;
    338   1.4    itojun 	u_int8_t	nd_opt_rh_len;
    339   1.4    itojun 	u_int16_t	nd_opt_rh_reserved1;
    340   1.4    itojun 	u_int32_t	nd_opt_rh_reserved2;
    341   1.4    itojun 	/* followed by IP header and data */
    342  1.36     perry } __packed;
    343   1.4    itojun 
    344   1.4    itojun struct nd_opt_mtu {		/* MTU option */
    345   1.4    itojun 	u_int8_t	nd_opt_mtu_type;
    346   1.4    itojun 	u_int8_t	nd_opt_mtu_len;
    347   1.4    itojun 	u_int16_t	nd_opt_mtu_reserved;
    348   1.4    itojun 	u_int32_t	nd_opt_mtu_mtu;
    349  1.36     perry } __packed;
    350   1.4    itojun 
    351  1.44       roy struct nd_opt_rdnss {		/* RDNSS option RFC 6106 */
    352  1.39     cyber 	u_int8_t	nd_opt_rdnss_type;
    353  1.39     cyber 	u_int8_t	nd_opt_rdnss_len;
    354  1.39     cyber 	u_int16_t	nd_opt_rdnss_reserved;
    355  1.39     cyber 	u_int32_t	nd_opt_rdnss_lifetime;
    356  1.39     cyber 	/* followed by list of IP prefixes */
    357  1.39     cyber } __packed;
    358  1.39     cyber 
    359  1.44       roy struct nd_opt_dnssl {		/* DNSSL option RFC 6106 */
    360  1.44       roy 	u_int8_t	nd_opt_dnssl_type;
    361  1.44       roy 	u_int8_t	nd_opt_dnssl_len;
    362  1.44       roy 	u_int16_t	nd_opt_dnssl_reserved;
    363  1.44       roy 	u_int32_t	nd_opt_dnssl_lifetime;
    364  1.44       roy 	/* followed by list of IP prefixes */
    365  1.44       roy } __packed;
    366  1.44       roy 
    367   1.4    itojun /*
    368   1.4    itojun  * icmp6 namelookup
    369   1.4    itojun  */
    370   1.4    itojun 
    371   1.4    itojun struct icmp6_namelookup {
    372   1.4    itojun 	struct icmp6_hdr 	icmp6_nl_hdr;
    373   1.4    itojun 	u_int8_t	icmp6_nl_nonce[8];
    374   1.9    itojun 	int32_t		icmp6_nl_ttl;
    375   1.4    itojun #if 0
    376   1.4    itojun 	u_int8_t	icmp6_nl_len;
    377   1.4    itojun 	u_int8_t	icmp6_nl_name[3];
    378   1.4    itojun #endif
    379   1.4    itojun 	/* could be followed by options */
    380  1.36     perry } __packed;
    381   1.4    itojun 
    382   1.4    itojun /*
    383   1.4    itojun  * icmp6 node information
    384   1.4    itojun  */
    385   1.4    itojun struct icmp6_nodeinfo {
    386   1.4    itojun 	struct icmp6_hdr icmp6_ni_hdr;
    387   1.4    itojun 	u_int8_t icmp6_ni_nonce[8];
    388   1.4    itojun 	/* could be followed by reply data */
    389  1.36     perry } __packed;
    390   1.4    itojun 
    391   1.4    itojun #define ni_type		icmp6_ni_hdr.icmp6_type
    392   1.4    itojun #define ni_code		icmp6_ni_hdr.icmp6_code
    393   1.4    itojun #define ni_cksum	icmp6_ni_hdr.icmp6_cksum
    394   1.4    itojun #define ni_qtype	icmp6_ni_hdr.icmp6_data16[0]
    395   1.4    itojun #define ni_flags	icmp6_ni_hdr.icmp6_data16[1]
    396   1.4    itojun 
    397   1.4    itojun #define NI_QTYPE_NOOP		0 /* NOOP  */
    398   1.4    itojun #define NI_QTYPE_SUPTYPES	1 /* Supported Qtypes */
    399  1.13    itojun #define NI_QTYPE_FQDN		2 /* FQDN (draft 04) */
    400  1.13    itojun #define NI_QTYPE_DNSNAME	2 /* DNS Name */
    401  1.12    itojun #define NI_QTYPE_NODEADDR	3 /* Node Addresses */
    402  1.12    itojun #define NI_QTYPE_IPV4ADDR	4 /* IPv4 Addresses */
    403   1.4    itojun 
    404   1.4    itojun #if BYTE_ORDER == BIG_ENDIAN
    405   1.4    itojun #define NI_SUPTYPE_FLAG_COMPRESS	0x1
    406   1.4    itojun #define NI_FQDN_FLAG_VALIDTTL		0x1
    407   1.7    itojun #elif BYTE_ORDER == LITTLE_ENDIAN
    408   1.7    itojun #define NI_SUPTYPE_FLAG_COMPRESS	0x0100
    409   1.7    itojun #define NI_FQDN_FLAG_VALIDTTL		0x0100
    410   1.7    itojun #endif
    411   1.7    itojun 
    412   1.7    itojun #ifdef NAME_LOOKUPS_04
    413   1.7    itojun #if BYTE_ORDER == BIG_ENDIAN
    414   1.4    itojun #define NI_NODEADDR_FLAG_LINKLOCAL	0x1
    415   1.4    itojun #define NI_NODEADDR_FLAG_SITELOCAL	0x2
    416   1.4    itojun #define NI_NODEADDR_FLAG_GLOBAL		0x4
    417   1.4    itojun #define NI_NODEADDR_FLAG_ALL		0x8
    418   1.4    itojun #define NI_NODEADDR_FLAG_TRUNCATE	0x10
    419   1.4    itojun #define NI_NODEADDR_FLAG_ANYCAST	0x20 /* just experimental. not in spec */
    420   1.4    itojun #elif BYTE_ORDER == LITTLE_ENDIAN
    421   1.4    itojun #define NI_NODEADDR_FLAG_LINKLOCAL	0x0100
    422   1.4    itojun #define NI_NODEADDR_FLAG_SITELOCAL	0x0200
    423   1.4    itojun #define NI_NODEADDR_FLAG_GLOBAL		0x0400
    424   1.4    itojun #define NI_NODEADDR_FLAG_ALL		0x0800
    425   1.4    itojun #define NI_NODEADDR_FLAG_TRUNCATE	0x1000
    426   1.4    itojun #define NI_NODEADDR_FLAG_ANYCAST	0x2000 /* just experimental. not in spec */
    427   1.7    itojun #endif
    428   1.7    itojun #else  /* draft-ietf-ipngwg-icmp-name-lookups-05 (and later?) */
    429   1.7    itojun #if BYTE_ORDER == BIG_ENDIAN
    430   1.7    itojun #define NI_NODEADDR_FLAG_TRUNCATE	0x1
    431   1.7    itojun #define NI_NODEADDR_FLAG_ALL		0x2
    432   1.7    itojun #define NI_NODEADDR_FLAG_COMPAT		0x4
    433   1.7    itojun #define NI_NODEADDR_FLAG_LINKLOCAL	0x8
    434   1.7    itojun #define NI_NODEADDR_FLAG_SITELOCAL	0x10
    435   1.7    itojun #define NI_NODEADDR_FLAG_GLOBAL		0x20
    436   1.7    itojun #define NI_NODEADDR_FLAG_ANYCAST	0x40 /* just experimental. not in spec */
    437   1.7    itojun #elif BYTE_ORDER == LITTLE_ENDIAN
    438   1.7    itojun #define NI_NODEADDR_FLAG_TRUNCATE	0x0100
    439   1.7    itojun #define NI_NODEADDR_FLAG_ALL		0x0200
    440   1.7    itojun #define NI_NODEADDR_FLAG_COMPAT		0x0400
    441   1.7    itojun #define NI_NODEADDR_FLAG_LINKLOCAL	0x0800
    442   1.7    itojun #define NI_NODEADDR_FLAG_SITELOCAL	0x1000
    443   1.7    itojun #define NI_NODEADDR_FLAG_GLOBAL		0x2000
    444   1.7    itojun #define NI_NODEADDR_FLAG_ANYCAST	0x4000 /* just experimental. not in spec */
    445   1.7    itojun #endif
    446   1.4    itojun #endif
    447   1.4    itojun 
    448   1.4    itojun struct ni_reply_fqdn {
    449   1.4    itojun 	u_int32_t ni_fqdn_ttl;	/* TTL */
    450   1.4    itojun 	u_int8_t ni_fqdn_namelen; /* length in octets of the FQDN */
    451   1.4    itojun 	u_int8_t ni_fqdn_name[3]; /* XXX: alignment */
    452  1.36     perry } __packed;
    453   1.4    itojun 
    454   1.4    itojun /*
    455   1.4    itojun  * Router Renumbering. as router-renum-08.txt
    456   1.4    itojun  */
    457   1.4    itojun struct icmp6_router_renum {	/* router renumbering header */
    458   1.4    itojun 	struct icmp6_hdr	rr_hdr;
    459  1.10    itojun 	u_int8_t	rr_segnum;
    460  1.10    itojun 	u_int8_t	rr_flags;
    461  1.10    itojun 	u_int16_t	rr_maxdelay;
    462  1.10    itojun 	u_int32_t	rr_reserved;
    463  1.36     perry } __packed;
    464  1.17    itojun 
    465  1.17    itojun #define ICMP6_RR_FLAGS_TEST		0x80
    466  1.17    itojun #define ICMP6_RR_FLAGS_REQRESULT	0x40
    467  1.17    itojun #define ICMP6_RR_FLAGS_FORCEAPPLY	0x20
    468  1.17    itojun #define ICMP6_RR_FLAGS_SPECSITE		0x10
    469  1.17    itojun #define ICMP6_RR_FLAGS_PREVDONE		0x08
    470  1.10    itojun 
    471  1.10    itojun #define rr_type		rr_hdr.icmp6_type
    472  1.10    itojun #define rr_code		rr_hdr.icmp6_code
    473  1.10    itojun #define rr_cksum	rr_hdr.icmp6_cksum
    474  1.10    itojun #define rr_seqnum 	rr_hdr.icmp6_data32[0]
    475   1.4    itojun 
    476   1.4    itojun struct rr_pco_match {		/* match prefix part */
    477   1.4    itojun 	u_int8_t	rpm_code;
    478   1.4    itojun 	u_int8_t	rpm_len;
    479   1.4    itojun 	u_int8_t	rpm_ordinal;
    480   1.4    itojun 	u_int8_t	rpm_matchlen;
    481   1.4    itojun 	u_int8_t	rpm_minlen;
    482   1.4    itojun 	u_int8_t	rpm_maxlen;
    483   1.4    itojun 	u_int16_t	rpm_reserved;
    484  1.10    itojun 	struct	in6_addr	rpm_prefix;
    485  1.36     perry } __packed;
    486   1.4    itojun 
    487   1.4    itojun #define RPM_PCO_ADD		1
    488   1.4    itojun #define RPM_PCO_CHANGE		2
    489   1.4    itojun #define RPM_PCO_SETGLOBAL	3
    490   1.4    itojun #define RPM_PCO_MAX		4
    491   1.4    itojun 
    492   1.4    itojun struct rr_pco_use {		/* use prefix part */
    493   1.4    itojun 	u_int8_t	rpu_uselen;
    494   1.4    itojun 	u_int8_t	rpu_keeplen;
    495  1.10    itojun 	u_int8_t	rpu_ramask;
    496  1.10    itojun 	u_int8_t	rpu_raflags;
    497   1.4    itojun 	u_int32_t	rpu_vltime;
    498   1.4    itojun 	u_int32_t	rpu_pltime;
    499  1.10    itojun 	u_int32_t	rpu_flags;
    500  1.10    itojun 	struct	in6_addr rpu_prefix;
    501  1.36     perry } __packed;
    502  1.10    itojun #define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK	0x80
    503  1.10    itojun #define ICMP6_RR_PCOUSE_RAFLAGS_AUTO	0x40
    504  1.10    itojun 
    505  1.10    itojun #if BYTE_ORDER == BIG_ENDIAN
    506  1.10    itojun #define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME     0x80000000
    507  1.10    itojun #define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME     0x40000000
    508   1.4    itojun #elif BYTE_ORDER == LITTLE_ENDIAN
    509  1.10    itojun #define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME     0x80
    510  1.10    itojun #define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME     0x40
    511  1.10    itojun #endif
    512   1.4    itojun 
    513   1.4    itojun struct rr_result {		/* router renumbering result message */
    514  1.10    itojun 	u_int16_t	rrr_flags;
    515   1.4    itojun 	u_int8_t	rrr_ordinal;
    516   1.4    itojun 	u_int8_t	rrr_matchedlen;
    517   1.4    itojun 	u_int32_t	rrr_ifid;
    518  1.10    itojun 	struct	in6_addr rrr_prefix;
    519  1.36     perry } __packed;
    520  1.10    itojun #if BYTE_ORDER == BIG_ENDIAN
    521  1.10    itojun #define ICMP6_RR_RESULT_FLAGS_OOB		0x0002
    522  1.10    itojun #define ICMP6_RR_RESULT_FLAGS_FORBIDDEN		0x0001
    523   1.4    itojun #elif BYTE_ORDER == LITTLE_ENDIAN
    524  1.18    itojun #define ICMP6_RR_RESULT_FLAGS_OOB		0x0200
    525  1.18    itojun #define ICMP6_RR_RESULT_FLAGS_FORBIDDEN		0x0100
    526  1.10    itojun #endif
    527   1.4    itojun 
    528   1.4    itojun /*
    529   1.4    itojun  * icmp6 filter structures.
    530   1.4    itojun  */
    531   1.4    itojun 
    532   1.4    itojun struct icmp6_filter {
    533   1.8    itojun 	u_int32_t icmp6_filt[8];
    534   1.4    itojun };
    535   1.4    itojun 
    536   1.4    itojun #define	ICMP6_FILTER_SETPASSALL(filterp) \
    537  1.31  christos 	(void)memset(filterp, 0xff, sizeof(struct icmp6_filter))
    538   1.4    itojun #define	ICMP6_FILTER_SETBLOCKALL(filterp) \
    539  1.31  christos 	(void)memset(filterp, 0x00, sizeof(struct icmp6_filter))
    540   1.4    itojun #define	ICMP6_FILTER_SETPASS(type, filterp) \
    541   1.8    itojun 	(((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type) & 31)))
    542   1.4    itojun #define	ICMP6_FILTER_SETBLOCK(type, filterp) \
    543   1.8    itojun 	(((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31)))
    544   1.4    itojun #define	ICMP6_FILTER_WILLPASS(type, filterp) \
    545   1.8    itojun 	((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0)
    546   1.4    itojun #define	ICMP6_FILTER_WILLBLOCK(type, filterp) \
    547   1.8    itojun 	((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0)
    548   1.4    itojun 
    549   1.4    itojun /*
    550   1.4    itojun  * Variables related to this implementation
    551   1.4    itojun  * of the internet control message protocol version 6.
    552   1.4    itojun  */
    553  1.10    itojun 
    554  1.37   thorpej /*
    555  1.37   thorpej  * IPv6 ICMP statistics.
    556  1.37   thorpej  * Each counter is an unsigned 64-bit value.
    557  1.37   thorpej  */
    558  1.37   thorpej #define	ICMP6_STAT_ERROR	0	/* # of calls to icmp6_error */
    559  1.37   thorpej #define	ICMP6_STAT_CANTERROR	1	/* no error (old was icmp) */
    560  1.37   thorpej #define	ICMP6_STAT_TOOFREQ	2	/* no error (rate limitation) */
    561  1.37   thorpej #define	ICMP6_STAT_OUTHIST	3	/* # of output messages */
    562  1.37   thorpej 		/* space for 256 counters */
    563  1.37   thorpej #define	ICMP6_STAT_BADCODE	259	/* icmp6_code out of range */
    564  1.37   thorpej #define	ICMP6_STAT_TOOSHORT	260	/* packet < sizeof(struct icmp6_hdr) */
    565  1.37   thorpej #define	ICMP6_STAT_CHECKSUM	261	/* bad checksum */
    566  1.37   thorpej #define	ICMP6_STAT_BADLEN	262	/* calculated bound mismatch */
    567  1.21    itojun 	/*
    568  1.37   thorpej 	 * number of responses; this member is inherited from the netinet code,
    569  1.37   thorpej 	 * but for netinet6 code, it is already available in outhist[].
    570  1.21    itojun 	 */
    571  1.37   thorpej #define	ICMP6_STAT_REFLECT	263
    572  1.37   thorpej #define	ICMP6_STAT_INHIST	264	/* # of input messages */
    573  1.37   thorpej 		/* space for 256 counters */
    574  1.37   thorpej #define	ICMP6_STAT_ND_TOOMANYOPT 520	/* too many ND options */
    575  1.37   thorpej #define	ICMP6_STAT_OUTERRHIST	521
    576  1.37   thorpej 		/* space for 13 counters */
    577  1.37   thorpej #define	ICMP6_STAT_PMTUCHG	534	/* path MTU changes */
    578  1.37   thorpej #define	ICMP6_STAT_ND_BADOPT	535	/* bad ND options */
    579  1.37   thorpej #define	ICMP6_STAT_BADNS	536	/* bad neighbor solicititation */
    580  1.37   thorpej #define	ICMP6_STAT_BADNA	537	/* bad neighbor advertisement */
    581  1.37   thorpej #define	ICMP6_STAT_BADRS	538	/* bad router solicitiation */
    582  1.37   thorpej #define	ICMP6_STAT_BADRA	539	/* bad router advertisement */
    583  1.37   thorpej #define	ICMP6_STAT_BADREDIRECT	540	/* bad redirect message */
    584  1.42       spz #define ICMP6_STAT_DROPPED_RAROUTE 541	/* discarded routes from router advertisement */
    585  1.37   thorpej 
    586  1.42       spz #define	ICMP6_NSTATS		542
    587  1.37   thorpej 
    588  1.37   thorpej #define	ICMP6_ERRSTAT_DST_UNREACH_NOROUTE	0
    589  1.37   thorpej #define	ICMP6_ERRSTAT_DST_UNREACH_ADMIN		1
    590  1.37   thorpej #define	ICMP6_ERRSTAT_DST_UNREACH_BEYONDSCOPE	2
    591  1.37   thorpej #define	ICMP6_ERRSTAT_DST_UNREACH_ADDR		3
    592  1.37   thorpej #define	ICMP6_ERRSTAT_DST_UNREACH_NOPORT	4
    593  1.37   thorpej #define	ICMP6_ERRSTAT_PACKET_TOO_BIG		5
    594  1.37   thorpej #define	ICMP6_ERRSTAT_TIME_EXCEED_TRANSIT	6
    595  1.37   thorpej #define	ICMP6_ERRSTAT_TIME_EXCEED_REASSEMBLY	7
    596  1.37   thorpej #define	ICMP6_ERRSTAT_PARAMPROB_HEADER		8
    597  1.37   thorpej #define	ICMP6_ERRSTAT_PARAMPROB_NEXTHEADER	9
    598  1.37   thorpej #define	ICMP6_ERRSTAT_PARAMPROB_OPTION		10
    599  1.37   thorpej #define	ICMP6_ERRSTAT_REDIRECT			11
    600  1.37   thorpej #define	ICMP6_ERRSTAT_UNKNOWN			12
    601   1.4    itojun 
    602   1.4    itojun /*
    603   1.4    itojun  * Names for ICMP sysctl objects
    604   1.4    itojun  */
    605   1.4    itojun #define ICMPV6CTL_STATS		1
    606   1.4    itojun #define ICMPV6CTL_REDIRACCEPT	2	/* accept/process redirects */
    607   1.4    itojun #define ICMPV6CTL_REDIRTIMEOUT	3	/* redirect cache time */
    608  1.11    itojun #if 0	/*obsoleted*/
    609   1.4    itojun #define ICMPV6CTL_ERRRATELIMIT	5	/* ICMPv6 error rate limitation */
    610  1.11    itojun #endif
    611   1.4    itojun #define ICMPV6CTL_ND6_PRUNE	6
    612   1.4    itojun #define ICMPV6CTL_ND6_DELAY	8
    613   1.4    itojun #define ICMPV6CTL_ND6_UMAXTRIES	9
    614   1.4    itojun #define ICMPV6CTL_ND6_MMAXTRIES		10
    615   1.4    itojun #define ICMPV6CTL_ND6_USELOOPBACK	11
    616   1.5    itojun /*#define ICMPV6CTL_ND6_PROXYALL	12	obsoleted, do not reuse here */
    617   1.4    itojun #define ICMPV6CTL_NODEINFO	13
    618  1.10    itojun #define ICMPV6CTL_ERRPPSLIMIT	14	/* ICMPv6 error pps limitation */
    619  1.10    itojun #define ICMPV6CTL_ND6_MAXNUDHINT	15
    620  1.16    itojun #define ICMPV6CTL_MTUDISC_HIWAT	16
    621  1.16    itojun #define ICMPV6CTL_MTUDISC_LOWAT	17
    622  1.19    itojun #define ICMPV6CTL_ND6_DEBUG	18
    623  1.23    itojun #define ICMPV6CTL_ND6_DRLIST	19
    624  1.23    itojun #define ICMPV6CTL_ND6_PRLIST	20
    625  1.34    rpaulo #define	ICMPV6CTL_ND6_MAXQLEN	24
    626  1.34    rpaulo #define ICMPV6CTL_MAXID		25
    627   1.4    itojun 
    628   1.4    itojun #define ICMPV6CTL_NAMES { \
    629   1.4    itojun 	{ 0, 0 }, \
    630   1.4    itojun 	{ 0, 0 }, \
    631   1.4    itojun 	{ "rediraccept", CTLTYPE_INT }, \
    632   1.4    itojun 	{ "redirtimeout", CTLTYPE_INT }, \
    633   1.4    itojun 	{ 0, 0 }, \
    634  1.11    itojun 	{ 0, 0 }, \
    635   1.4    itojun 	{ "nd6_prune", CTLTYPE_INT }, \
    636   1.4    itojun 	{ 0, 0 }, \
    637   1.4    itojun 	{ "nd6_delay", CTLTYPE_INT }, \
    638   1.4    itojun 	{ "nd6_umaxtries", CTLTYPE_INT }, \
    639   1.4    itojun 	{ "nd6_mmaxtries", CTLTYPE_INT }, \
    640   1.4    itojun 	{ "nd6_useloopback", CTLTYPE_INT }, \
    641   1.5    itojun 	{ 0, 0 }, \
    642   1.4    itojun 	{ "nodeinfo", CTLTYPE_INT }, \
    643  1.10    itojun 	{ "errppslimit", CTLTYPE_INT }, \
    644  1.10    itojun 	{ "nd6_maxnudhint", CTLTYPE_INT }, \
    645  1.16    itojun 	{ "mtudisc_hiwat", CTLTYPE_INT }, \
    646  1.16    itojun 	{ "mtudisc_lowat", CTLTYPE_INT }, \
    647  1.19    itojun 	{ "nd6_debug", CTLTYPE_INT }, \
    648  1.23    itojun 	{ 0, 0 }, \
    649  1.23    itojun 	{ 0, 0 }, \
    650  1.34    rpaulo 	{ 0, 0 }, \
    651  1.34    rpaulo 	{ 0, 0 }, \
    652  1.34    rpaulo 	{ 0, 0 }, \
    653  1.34    rpaulo 	{ "nd6_maxqueuelen", CTLTYPE_INT }, \
    654   1.4    itojun }
    655   1.4    itojun 
    656   1.4    itojun #ifdef _KERNEL
    657   1.4    itojun struct	rtentry;
    658   1.4    itojun struct	rttimer;
    659   1.4    itojun struct	in6_multi;
    660  1.29      matt 
    661  1.30    itojun void	icmp6_init(void);
    662  1.30    itojun void	icmp6_paramerror(struct mbuf *, int);
    663  1.30    itojun void	icmp6_error(struct mbuf *, int, int, int);
    664  1.33    rpaulo void	icmp6_error2(struct mbuf *, int, int, int, struct ifnet *);
    665  1.30    itojun int	icmp6_input(struct mbuf **, int *, int);
    666  1.30    itojun void	icmp6_fasttimo(void);
    667  1.30    itojun void	icmp6_reflect(struct mbuf *, size_t);
    668  1.30    itojun void	icmp6_prepare(struct mbuf *);
    669  1.30    itojun void	icmp6_redirect_input(struct mbuf *, int);
    670  1.30    itojun void	icmp6_redirect_output(struct mbuf *, struct rtentry *);
    671  1.30    itojun int	icmp6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
    672  1.15    itojun 
    673  1.38   thorpej void	icmp6_statinc(u_int);
    674  1.38   thorpej 
    675  1.15    itojun struct	ip6ctlparam;
    676  1.30    itojun void	icmp6_mtudisc_update(struct ip6ctlparam *, int);
    677  1.30    itojun void	icmp6_mtudisc_callback_register(void (*)(struct in6_addr *));
    678   1.4    itojun 
    679   1.4    itojun /* XXX: is this the right place for these macros? */
    680   1.4    itojun #define icmp6_ifstat_inc(ifp, tag) \
    681   1.4    itojun do {								\
    682  1.22    itojun 	if (ifp)						\
    683  1.22    itojun 		((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->icmp6_ifstat->tag++; \
    684  1.25     perry } while (/*CONSTCOND*/ 0)
    685   1.4    itojun 
    686   1.4    itojun #define icmp6_ifoutstat_inc(ifp, type, code) \
    687   1.4    itojun do { \
    688   1.4    itojun 		icmp6_ifstat_inc(ifp, ifs6_out_msg); \
    689   1.4    itojun 		switch(type) { \
    690   1.4    itojun 		 case ICMP6_DST_UNREACH: \
    691   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_dstunreach); \
    692   1.4    itojun 			 if (code == ICMP6_DST_UNREACH_ADMIN) \
    693   1.4    itojun 				 icmp6_ifstat_inc(ifp, ifs6_out_adminprohib); \
    694   1.4    itojun 			 break; \
    695   1.4    itojun 		 case ICMP6_PACKET_TOO_BIG: \
    696   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_pkttoobig); \
    697   1.4    itojun 			 break; \
    698   1.4    itojun 		 case ICMP6_TIME_EXCEEDED: \
    699   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_timeexceed); \
    700   1.4    itojun 			 break; \
    701   1.4    itojun 		 case ICMP6_PARAM_PROB: \
    702   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_paramprob); \
    703   1.4    itojun 			 break; \
    704   1.4    itojun 		 case ICMP6_ECHO_REQUEST: \
    705   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_echo); \
    706   1.4    itojun 			 break; \
    707   1.4    itojun 		 case ICMP6_ECHO_REPLY: \
    708   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_echoreply); \
    709   1.4    itojun 			 break; \
    710  1.26    itojun 		 case MLD_LISTENER_QUERY: \
    711   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_mldquery); \
    712   1.4    itojun 			 break; \
    713  1.26    itojun 		 case MLD_LISTENER_REPORT: \
    714   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_mldreport); \
    715   1.4    itojun 			 break; \
    716  1.26    itojun 		 case MLD_LISTENER_DONE: \
    717   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_mlddone); \
    718   1.4    itojun 			 break; \
    719   1.4    itojun 		 case ND_ROUTER_SOLICIT: \
    720   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_routersolicit); \
    721   1.4    itojun 			 break; \
    722   1.4    itojun 		 case ND_ROUTER_ADVERT: \
    723   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_routeradvert); \
    724   1.4    itojun 			 break; \
    725   1.4    itojun 		 case ND_NEIGHBOR_SOLICIT: \
    726   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_neighborsolicit); \
    727   1.4    itojun 			 break; \
    728   1.4    itojun 		 case ND_NEIGHBOR_ADVERT: \
    729   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_neighboradvert); \
    730   1.4    itojun 			 break; \
    731   1.4    itojun 		 case ND_REDIRECT: \
    732   1.4    itojun 			 icmp6_ifstat_inc(ifp, ifs6_out_redirect); \
    733   1.4    itojun 			 break; \
    734   1.4    itojun 		} \
    735  1.25     perry } while (/*CONSTCOND*/ 0)
    736   1.4    itojun 
    737   1.4    itojun extern int	icmp6_rediraccept;	/* accept/process redirects */
    738   1.4    itojun extern int	icmp6_redirtimeout;	/* cache time for redirect routes */
    739   1.4    itojun #endif /* _KERNEL */
    740   1.2    itojun 
    741  1.45       spz #ifdef ICMP6_STRINGS
    742  1.45       spz /* Info: http://www.iana.org/assignments/icmpv6-parameters */
    743  1.45       spz 
    744  1.45       spz static const char * const icmp6_type_err[] = {
    745  1.46       spz 	"reserved0", "unreach", "packet_too_big", "timxceed", "paramprob",
    746  1.45       spz 	NULL
    747  1.45       spz };
    748  1.45       spz 
    749  1.45       spz static const char * const icmp6_type_info[] = {
    750  1.45       spz 	"echo", "echoreply",
    751  1.45       spz 	"mcastlistenq", "mcastlistenrep", "mcastlistendone",
    752  1.45       spz 	"rtsol", "rtadv", "neighsol", "neighadv", "redirect",
    753  1.45       spz 	"routerrenum", "nodeinfoq", "nodeinfor", "invneighsol", "invneighrep",
    754  1.45       spz 	"mcastlistenrep2", "haad_req", "haad_rep",
    755  1.45       spz 	"mobile_psol", "mobile_padv", "cga_sol", "cga_adv",
    756  1.45       spz 	"experimental150", "mcast_rtadv", "mcast_rtsol", "mcast_rtterm",
    757  1.45       spz 	"fmipv6_msg", "rpl_control", NULL
    758  1.45       spz };
    759  1.45       spz 
    760  1.45       spz static const char * const icmp6_code_none[] = { "none", NULL };
    761  1.45       spz 
    762  1.45       spz static const char * const icmp6_code_unreach[] = {
    763  1.46       spz 	"noroute", "admin", "beyondscope", "addr", "port",
    764  1.45       spz 	"srcaddr_policy", "reject_route", "source_route_err", NULL
    765  1.45       spz };
    766  1.45       spz 
    767  1.45       spz static const char * const icmp6_code_timxceed[] = {
    768  1.46       spz 	"intrans", "reass", NULL
    769  1.45       spz };
    770  1.45       spz 
    771  1.45       spz static const char * const icmp6_code_paramprob[] = {
    772  1.46       spz 	"hdr_field", "nxthdr_type", "option", NULL
    773  1.45       spz };
    774  1.45       spz 
    775  1.45       spz /* not all informational icmps that have codes have a names array */
    776  1.45       spz #endif
    777  1.45       spz 
    778  1.32      elad #endif /* !_NETINET_ICMP6_H_ */
    779