111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*	$NetBSD: icmp6.h,v 1.40 2009/10/31 22:32:17 christos Exp $	*/
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*	$KAME: icmp6.h,v 1.84 2003/04/23 10:26:51 itojun Exp $	*/
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * All rights reserved.
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Redistribution and use in source and binary forms, with or without
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modification, are permitted provided that the following conditions
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * are met:
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 1. Redistributions of source code must retain the above copyright
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    notice, this list of conditions and the following disclaimer.
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 2. Redistributions in binary form must reproduce the above copyright
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    notice, this list of conditions and the following disclaimer in the
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    documentation and/or other materials provided with the distribution.
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 3. Neither the name of the project nor the names of its contributors
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    may be used to endorse or promote products derived from this software
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    without specific prior written permission.
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * SUCH DAMAGE.
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1982, 1986, 1993
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	The Regents of the University of California.  All rights reserved.
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Redistribution and use in source and binary forms, with or without
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modification, are permitted provided that the following conditions
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * are met:
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 1. Redistributions of source code must retain the above copyright
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    notice, this list of conditions and the following disclaimer.
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 2. Redistributions in binary form must reproduce the above copyright
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    notice, this list of conditions and the following disclaimer in the
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    documentation and/or other materials provided with the distribution.
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 3. Neither the name of the University nor the names of its contributors
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    may be used to endorse or promote products derived from this software
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    without specific prior written permission.
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * SUCH DAMAGE.
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	@(#)ip_icmp.h	8.1 (Berkeley) 6/10/93
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _NETINET_ICMP6_H_
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _NETINET_ICMP6_H_
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6_PLD_MAXLEN	1232	/* IPV6_MMTU - sizeof(struct ip6_hdr)
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					   - sizeof(struct icmp6_hdr) */
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct icmp6_hdr {
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	icmp6_type;	/* type field */
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	icmp6_code;	/* code field */
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int16_t	icmp6_cksum;	/* checksum field */
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	union {
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		u_int32_t	icmp6_un_data32[1]; /* type-specific field */
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		u_int16_t	icmp6_un_data16[2]; /* type-specific field */
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		u_int8_t	icmp6_un_data8[4];  /* type-specific field */
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	} icmp6_dataun;
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define icmp6_data32	icmp6_dataun.icmp6_un_data32
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define icmp6_data16	icmp6_dataun.icmp6_un_data16
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define icmp6_data8	icmp6_dataun.icmp6_un_data8
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define icmp6_pptr	icmp6_data32[0]		/* parameter prob */
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define icmp6_mtu	icmp6_data32[0]		/* packet too big */
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define icmp6_id	icmp6_data16[0]		/* echo request/reply */
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define icmp6_seq	icmp6_data16[1]		/* echo request/reply */
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define icmp6_maxdelay	icmp6_data16[0]		/* mcast group membership */
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_DST_UNREACH		1	/* dest unreachable, codes: */
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_PACKET_TOO_BIG		2	/* packet too big */
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_TIME_EXCEEDED		3	/* time exceeded, code: */
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_PARAM_PROB		4	/* ip6 header bad */
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_ECHO_REQUEST		128	/* echo service */
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_ECHO_REPLY		129	/* echo reply */
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MLD_LISTENER_QUERY		130 	/* multicast listener query */
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MLD_LISTENER_REPORT		131	/* multicast listener report */
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MLD_LISTENER_DONE		132	/* multicast listener done */
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* RFC2292 decls */
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_MEMBERSHIP_QUERY		130	/* group membership query */
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_MEMBERSHIP_REPORT		131	/* group membership report */
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_MEMBERSHIP_REDUCTION	132	/* group membership termination */
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _KERNEL
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* the followings are for backward compatibility to old KAME apps. */
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MLD6_LISTENER_QUERY	MLD_LISTENER_QUERY
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MLD6_LISTENER_REPORT	MLD_LISTENER_REPORT
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MLD6_LISTENER_DONE	MLD_LISTENER_DONE
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_ROUTER_SOLICIT		133	/* router solicitation */
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_ROUTER_ADVERT		134	/* router advertisement */
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_NEIGHBOR_SOLICIT		135	/* neighbor solicitation */
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_NEIGHBOR_ADVERT		136	/* neighbor advertisement */
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_REDIRECT			137	/* redirect */
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_ROUTER_RENUMBERING	138	/* router renumbering */
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_WRUREQUEST		139	/* who are you request */
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_WRUREPLY			140	/* who are you reply */
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_FQDN_QUERY		139	/* FQDN query */
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_FQDN_REPLY		140	/* FQDN reply */
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_NI_QUERY			139	/* node information request */
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_NI_REPLY			140	/* node information reply */
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* The definitions below are experimental. TBA */
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MLD_MTRACE_RESP			200	/* mtrace response(to sender) */
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MLD_MTRACE			201	/* mtrace messages */
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _KERNEL
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* the followings are for backward compatibility to old KAME apps. */
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MLD6_MTRACE_RESP	MLD_MTRACE_RESP
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MLD6_MTRACE		MLD_MTRACE
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_MAXTYPE			201
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_DST_UNREACH_NOROUTE	0	/* no route to destination */
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_DST_UNREACH_ADMIN	 	1	/* administratively prohibited */
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_DST_UNREACH_NOTNEIGHBOR	2	/* not a neighbor(obsolete) */
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_DST_UNREACH_BEYONDSCOPE	2	/* beyond scope of source address */
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_DST_UNREACH_ADDR		3	/* address unreachable */
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_DST_UNREACH_NOPORT	4	/* port unreachable */
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_TIME_EXCEED_TRANSIT 	0	/* ttl==0 in transit */
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_TIME_EXCEED_REASSEMBLY	1	/* ttl==0 in reass */
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_PARAMPROB_HEADER 	 	0	/* erroneous header field */
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_PARAMPROB_NEXTHEADER	1	/* unrecognized next header */
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_PARAMPROB_OPTION		2	/* unrecognized option */
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_INFOMSG_MASK		0x80	/* all informational messages */
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_NI_SUBJ_IPV6	0	/* Query Subject is an IPv6 address */
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_NI_SUBJ_FQDN	1	/* Query Subject is a Domain name */
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_NI_SUBJ_IPV4	2	/* Query Subject is an IPv4 address */
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_NI_SUCCESS	0	/* node information successful reply */
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_NI_REFUSED	1	/* node information request is refused */
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_NI_UNKNOWN	2	/* unknown Qtype */
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_ROUTER_RENUMBERING_COMMAND  0	/* rr command */
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_ROUTER_RENUMBERING_RESULT   1	/* rr result */
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET   255	/* rr seq num reset */
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* Used in kernel only */
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_REDIRECT_ONLINK	0	/* redirect to an on-link node */
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_REDIRECT_ROUTER	1	/* redirect to a better router */
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Multicast Listener Discovery
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct mld_hdr {
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct icmp6_hdr	mld_icmp6_hdr;
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct in6_addr		mld_addr; /* multicast address */
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* definitions to provide backward compatibility to old KAME applications */
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _KERNEL
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld6_hdr	mld_hdr
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld6_type	mld_type
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld6_code	mld_code
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld6_cksum	mld_cksum
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld6_maxdelay	mld_maxdelay
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld6_reserved	mld_reserved
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld6_addr	mld_addr
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* shortcut macro definitions */
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld_type	mld_icmp6_hdr.icmp6_type
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld_code	mld_icmp6_hdr.icmp6_code
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld_cksum	mld_icmp6_hdr.icmp6_cksum
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld_maxdelay	mld_icmp6_hdr.icmp6_data16[0]
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define mld_reserved	mld_icmp6_hdr.icmp6_data16[1]
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MLD_MINLEN			24
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Neighbor Discovery
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct nd_router_solicit {	/* router solicitation */
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct icmp6_hdr 	nd_rs_hdr;
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* could be followed by options */
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_rs_type	nd_rs_hdr.icmp6_type
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_rs_code	nd_rs_hdr.icmp6_code
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_rs_cksum	nd_rs_hdr.icmp6_cksum
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_rs_reserved	nd_rs_hdr.icmp6_data32[0]
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct nd_router_advert {	/* router advertisement */
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct icmp6_hdr	nd_ra_hdr;
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t		nd_ra_reachable;	/* reachable time */
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t		nd_ra_retransmit;	/* retransmit timer */
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* could be followed by options */
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_ra_type		nd_ra_hdr.icmp6_type
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_ra_code		nd_ra_hdr.icmp6_code
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_ra_cksum		nd_ra_hdr.icmp6_cksum
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_ra_curhoplimit	nd_ra_hdr.icmp6_data8[0]
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_ra_flags_reserved	nd_ra_hdr.icmp6_data8[1]
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_RA_FLAG_MANAGED	0x80
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_RA_FLAG_OTHER	0x40
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_RA_FLAG_HOME_AGENT	0x20
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Router preference values based on RFC4199.
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_RA_FLAG_RTPREF_MASK	0x18 /* 00011000 */
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_RA_FLAG_RTPREF_HIGH	0x08 /* 00001000 */
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_RA_FLAG_RTPREF_MEDIUM	0x00 /* 00000000 */
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_RA_FLAG_RTPREF_LOW	0x18 /* 00011000 */
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_RA_FLAG_RTPREF_RSV	0x10 /* 00010000 */
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_ra_router_lifetime	nd_ra_hdr.icmp6_data16[1]
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct nd_neighbor_solicit {	/* neighbor solicitation */
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct icmp6_hdr	nd_ns_hdr;
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct in6_addr		nd_ns_target;	/*target address */
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* could be followed by options */
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_ns_type		nd_ns_hdr.icmp6_type
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_ns_code		nd_ns_hdr.icmp6_code
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_ns_cksum		nd_ns_hdr.icmp6_cksum
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_ns_reserved		nd_ns_hdr.icmp6_data32[0]
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct nd_neighbor_advert {	/* neighbor advertisement */
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct icmp6_hdr	nd_na_hdr;
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct in6_addr		nd_na_target;	/* target address */
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* could be followed by options */
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_na_type		nd_na_hdr.icmp6_type
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_na_code		nd_na_hdr.icmp6_code
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_na_cksum		nd_na_hdr.icmp6_cksum
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_na_flags_reserved	nd_na_hdr.icmp6_data32[0]
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if BYTE_ORDER == BIG_ENDIAN
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_NA_FLAG_ROUTER		0x80000000
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_NA_FLAG_SOLICITED		0x40000000
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_NA_FLAG_OVERRIDE		0x20000000
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if BYTE_ORDER == LITTLE_ENDIAN
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_NA_FLAG_ROUTER		0x80
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_NA_FLAG_SOLICITED		0x40
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_NA_FLAG_OVERRIDE		0x20
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct nd_redirect {		/* redirect */
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct icmp6_hdr	nd_rd_hdr;
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct in6_addr		nd_rd_target;	/* target address */
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct in6_addr		nd_rd_dst;	/* destination address */
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* could be followed by options */
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_rd_type		nd_rd_hdr.icmp6_type
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_rd_code		nd_rd_hdr.icmp6_code
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_rd_cksum		nd_rd_hdr.icmp6_cksum
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define nd_rd_reserved		nd_rd_hdr.icmp6_data32[0]
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct nd_opt_hdr {		/* Neighbor discovery option header */
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_type;
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_len;
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* followed by option specific data*/
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_SOURCE_LINKADDR		1
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_TARGET_LINKADDR		2
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_PREFIX_INFORMATION	3
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_REDIRECTED_HEADER	4
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_MTU			5
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_ADVINTERVAL		7
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_HOMEAGENT_INFO		8
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_SOURCE_ADDRLIST		9
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_TARGET_ADDRLIST		10
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_RDNSS			25
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* draft-ietf-ipngwg-router-preference, not officially assigned yet */
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_ROUTE_INFO		200
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* draft-ietf-mobileip-hmipv6, not officially assigned yet */
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_MAP			201
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct nd_opt_route_info {	/* route info */
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_rti_type;
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_rti_len;
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_rti_prefixlen;
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_rti_flags;
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	nd_opt_rti_lifetime;
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* prefix follows */
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct nd_opt_prefix_info {	/* prefix information */
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_pi_type;
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_pi_len;
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_pi_prefix_len;
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_pi_flags_reserved;
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	nd_opt_pi_valid_time;
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	nd_opt_pi_preferred_time;
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	nd_opt_pi_reserved2;
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct in6_addr	nd_opt_pi_prefix;
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_PI_FLAG_ONLINK		0x80
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ND_OPT_PI_FLAG_AUTO		0x40
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct nd_opt_rd_hdr {		/* redirected header */
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_rh_type;
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_rh_len;
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int16_t	nd_opt_rh_reserved1;
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	nd_opt_rh_reserved2;
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* followed by IP header and data */
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct nd_opt_mtu {		/* MTU option */
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_mtu_type;
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_mtu_len;
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int16_t	nd_opt_mtu_reserved;
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	nd_opt_mtu_mtu;
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct nd_opt_rdnss {		/* RDNSS option RFC 5006 */
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_rdnss_type;
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	nd_opt_rdnss_len;
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int16_t	nd_opt_rdnss_reserved;
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	nd_opt_rdnss_lifetime;
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* followed by list of IP prefixes */
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * icmp6 namelookup
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct icmp6_namelookup {
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct icmp6_hdr 	icmp6_nl_hdr;
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	icmp6_nl_nonce[8];
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int32_t		icmp6_nl_ttl;
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	icmp6_nl_len;
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	icmp6_nl_name[3];
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* could be followed by options */
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * icmp6 node information
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct icmp6_nodeinfo {
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct icmp6_hdr icmp6_ni_hdr;
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t icmp6_ni_nonce[8];
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* could be followed by reply data */
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ni_type		icmp6_ni_hdr.icmp6_type
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ni_code		icmp6_ni_hdr.icmp6_code
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ni_cksum	icmp6_ni_hdr.icmp6_cksum
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ni_qtype	icmp6_ni_hdr.icmp6_data16[0]
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ni_flags	icmp6_ni_hdr.icmp6_data16[1]
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_QTYPE_NOOP		0 /* NOOP  */
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_QTYPE_SUPTYPES	1 /* Supported Qtypes */
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_QTYPE_FQDN		2 /* FQDN (draft 04) */
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_QTYPE_DNSNAME	2 /* DNS Name */
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_QTYPE_NODEADDR	3 /* Node Addresses */
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_QTYPE_IPV4ADDR	4 /* IPv4 Addresses */
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if BYTE_ORDER == BIG_ENDIAN
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_SUPTYPE_FLAG_COMPRESS	0x1
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_FQDN_FLAG_VALIDTTL		0x1
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif BYTE_ORDER == LITTLE_ENDIAN
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_SUPTYPE_FLAG_COMPRESS	0x0100
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_FQDN_FLAG_VALIDTTL		0x0100
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef NAME_LOOKUPS_04
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if BYTE_ORDER == BIG_ENDIAN
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_LINKLOCAL	0x1
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_SITELOCAL	0x2
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_GLOBAL		0x4
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_ALL		0x8
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_TRUNCATE	0x10
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_ANYCAST	0x20 /* just experimental. not in spec */
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif BYTE_ORDER == LITTLE_ENDIAN
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_LINKLOCAL	0x0100
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_SITELOCAL	0x0200
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_GLOBAL		0x0400
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_ALL		0x0800
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_TRUNCATE	0x1000
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_ANYCAST	0x2000 /* just experimental. not in spec */
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else  /* draft-ietf-ipngwg-icmp-name-lookups-05 (and later?) */
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if BYTE_ORDER == BIG_ENDIAN
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_TRUNCATE	0x1
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_ALL		0x2
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_COMPAT		0x4
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_LINKLOCAL	0x8
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_SITELOCAL	0x10
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_GLOBAL		0x20
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_ANYCAST	0x40 /* just experimental. not in spec */
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif BYTE_ORDER == LITTLE_ENDIAN
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_TRUNCATE	0x0100
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_ALL		0x0200
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_COMPAT		0x0400
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_LINKLOCAL	0x0800
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_SITELOCAL	0x1000
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_GLOBAL		0x2000
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define NI_NODEADDR_FLAG_ANYCAST	0x4000 /* just experimental. not in spec */
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct ni_reply_fqdn {
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t ni_fqdn_ttl;	/* TTL */
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t ni_fqdn_namelen; /* length in octets of the FQDN */
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t ni_fqdn_name[3]; /* XXX: alignment */
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Router Renumbering. as router-renum-08.txt
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct icmp6_router_renum {	/* router renumbering header */
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct icmp6_hdr	rr_hdr;
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rr_segnum;
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rr_flags;
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int16_t	rr_maxdelay;
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	rr_reserved;
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_FLAGS_TEST		0x80
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_FLAGS_REQRESULT	0x40
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_FLAGS_FORCEAPPLY	0x20
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_FLAGS_SPECSITE		0x10
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_FLAGS_PREVDONE		0x08
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define rr_type		rr_hdr.icmp6_type
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define rr_code		rr_hdr.icmp6_code
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define rr_cksum	rr_hdr.icmp6_cksum
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define rr_seqnum 	rr_hdr.icmp6_data32[0]
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct rr_pco_match {		/* match prefix part */
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rpm_code;
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rpm_len;
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rpm_ordinal;
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rpm_matchlen;
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rpm_minlen;
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rpm_maxlen;
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int16_t	rpm_reserved;
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct	in6_addr	rpm_prefix;
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define RPM_PCO_ADD		1
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define RPM_PCO_CHANGE		2
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define RPM_PCO_SETGLOBAL	3
47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define RPM_PCO_MAX		4
47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct rr_pco_use {		/* use prefix part */
48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rpu_uselen;
48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rpu_keeplen;
48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rpu_ramask;
48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rpu_raflags;
48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	rpu_vltime;
48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	rpu_pltime;
48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	rpu_flags;
48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct	in6_addr rpu_prefix;
48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK	0x80
49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_PCOUSE_RAFLAGS_AUTO	0x40
49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if BYTE_ORDER == BIG_ENDIAN
49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME     0x80000000
49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME     0x40000000
49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif BYTE_ORDER == LITTLE_ENDIAN
49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME     0x80
49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME     0x40
49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct rr_result {		/* router renumbering result message */
50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int16_t	rrr_flags;
50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rrr_ordinal;
50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int8_t	rrr_matchedlen;
50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t	rrr_ifid;
50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct	in6_addr rrr_prefix;
50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __packed;
50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if BYTE_ORDER == BIG_ENDIAN
50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_RESULT_FLAGS_OOB		0x0002
51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN		0x0001
51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif BYTE_ORDER == LITTLE_ENDIAN
51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_RESULT_FLAGS_OOB		0x0200
51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN		0x0100
51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * icmp6 filter structures.
51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct icmp6_filter {
52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	u_int32_t icmp6_filt[8];
52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_FILTER_SETPASSALL(filterp) \
52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(void)memset(filterp, 0xff, sizeof(struct icmp6_filter))
52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_FILTER_SETBLOCKALL(filterp) \
52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(void)memset(filterp, 0x00, sizeof(struct icmp6_filter))
52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_FILTER_SETPASS(type, filterp) \
52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type) & 31)))
53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_FILTER_SETBLOCK(type, filterp) \
53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31)))
53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_FILTER_WILLPASS(type, filterp) \
53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0)
53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_FILTER_WILLBLOCK(type, filterp) \
53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0)
53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Variables related to this implementation
53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * of the internet control message protocol version 6.
54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * IPv6 ICMP statistics.
54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Each counter is an unsigned 64-bit value.
54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_ERROR	0	/* # of calls to icmp6_error */
54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_CANTERROR	1	/* no error (old was icmp) */
54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_TOOFREQ	2	/* no error (rate limitation) */
54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_OUTHIST	3	/* # of output messages */
55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* space for 256 counters */
55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_BADCODE	259	/* icmp6_code out of range */
55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_TOOSHORT	260	/* packet < sizeof(struct icmp6_hdr) */
55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_CHECKSUM	261	/* bad checksum */
55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_BADLEN	262	/* calculated bound mismatch */
55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/*
55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 * number of responses; this member is inherited from the netinet code,
55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 * but for netinet6 code, it is already available in outhist[].
55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 */
55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_REFLECT	263
56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_INHIST	264	/* # of input messages */
56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* space for 256 counters */
56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_ND_TOOMANYOPT 520	/* too many ND options */
56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_OUTERRHIST	521
56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* space for 13 counters */
56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_PMTUCHG	534	/* path MTU changes */
56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_ND_BADOPT	535	/* bad ND options */
56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_BADNS	536	/* bad neighbor solicititation */
56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_BADNA	537	/* bad neighbor advertisement */
56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_BADRS	538	/* bad router solicitiation */
57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_BADRA	539	/* bad router advertisement */
57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_STAT_BADREDIRECT	540	/* bad redirect message */
57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_NSTATS		541
57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_DST_UNREACH_NOROUTE	0
57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_DST_UNREACH_ADMIN		1
57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_DST_UNREACH_BEYONDSCOPE	2
57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_DST_UNREACH_ADDR		3
57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_DST_UNREACH_NOPORT	4
58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_PACKET_TOO_BIG		5
58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_TIME_EXCEED_TRANSIT	6
58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_TIME_EXCEED_REASSEMBLY	7
58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_PARAMPROB_HEADER		8
58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_PARAMPROB_NEXTHEADER	9
58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_PARAMPROB_OPTION		10
58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_REDIRECT			11
58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMP6_ERRSTAT_UNKNOWN			12
58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Names for ICMP sysctl objects
59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_STATS		1
59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_REDIRACCEPT	2	/* accept/process redirects */
59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_REDIRTIMEOUT	3	/* redirect cache time */
59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if 0	/*obsoleted*/
59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_ERRRATELIMIT	5	/* ICMPv6 error rate limitation */
59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_ND6_PRUNE	6
59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_ND6_DELAY	8
60011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_ND6_UMAXTRIES	9
60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_ND6_MMAXTRIES		10
60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_ND6_USELOOPBACK	11
60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*#define ICMPV6CTL_ND6_PROXYALL	12	obsoleted, do not reuse here */
60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_NODEINFO	13
60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_ERRPPSLIMIT	14	/* ICMPv6 error pps limitation */
60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_ND6_MAXNUDHINT	15
60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_MTUDISC_HIWAT	16
60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_MTUDISC_LOWAT	17
60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_ND6_DEBUG	18
61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_ND6_DRLIST	19
61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_ND6_PRLIST	20
61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	ICMPV6CTL_ND6_MAXQLEN	24
61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_MAXID		25
61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ICMPV6CTL_NAMES { \
61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ 0, 0 }, \
61711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ 0, 0 }, \
61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "rediraccept", CTLTYPE_INT }, \
61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "redirtimeout", CTLTYPE_INT }, \
62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ 0, 0 }, \
62111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ 0, 0 }, \
62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "nd6_prune", CTLTYPE_INT }, \
62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ 0, 0 }, \
62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "nd6_delay", CTLTYPE_INT }, \
62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "nd6_umaxtries", CTLTYPE_INT }, \
62611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "nd6_mmaxtries", CTLTYPE_INT }, \
62711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "nd6_useloopback", CTLTYPE_INT }, \
62811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ 0, 0 }, \
62911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "nodeinfo", CTLTYPE_INT }, \
63011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "errppslimit", CTLTYPE_INT }, \
63111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "nd6_maxnudhint", CTLTYPE_INT }, \
63211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "mtudisc_hiwat", CTLTYPE_INT }, \
63311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "mtudisc_lowat", CTLTYPE_INT }, \
63411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "nd6_debug", CTLTYPE_INT }, \
63511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ 0, 0 }, \
63611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ 0, 0 }, \
63711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ 0, 0 }, \
63811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ 0, 0 }, \
63911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ 0, 0 }, \
64011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ "nd6_maxqueuelen", CTLTYPE_INT }, \
64111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
64211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
64311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define RTF_PROBEMTU	RTF_PROTO1
64411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
64511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _KERNEL
64611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct	rtentry;
64711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct	rttimer;
64811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct	in6_multi;
64911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
65011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_init(void);
65111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_paramerror(struct mbuf *, int);
65211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_error(struct mbuf *, int, int, int);
65311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_error2(struct mbuf *, int, int, int, struct ifnet *);
65411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	icmp6_input(struct mbuf **, int *, int);
65511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_fasttimo(void);
65611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_reflect(struct mbuf *, size_t);
65711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_prepare(struct mbuf *);
65811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_redirect_input(struct mbuf *, int);
65911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_redirect_output(struct mbuf *, struct rtentry *);
66011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	icmp6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
66111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_statinc(u_int);
66311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct	ip6ctlparam;
66511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_mtudisc_update(struct ip6ctlparam *, int);
66611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	icmp6_mtudisc_callback_register(void (*)(struct in6_addr *));
66711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* XXX: is this the right place for these macros? */
66911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define icmp6_ifstat_inc(ifp, tag) \
67011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdo {								\
67111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (ifp)						\
67211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->icmp6_ifstat->tag++; \
67311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} while (/*CONSTCOND*/ 0)
67411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
67511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define icmp6_ifoutstat_inc(ifp, type, code) \
67611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdo { \
67711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		icmp6_ifstat_inc(ifp, ifs6_out_msg); \
67811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		switch(type) { \
67911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case ICMP6_DST_UNREACH: \
68011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_dstunreach); \
68111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 if (code == ICMP6_DST_UNREACH_ADMIN) \
68211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				 icmp6_ifstat_inc(ifp, ifs6_out_adminprohib); \
68311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
68411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case ICMP6_PACKET_TOO_BIG: \
68511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_pkttoobig); \
68611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
68711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case ICMP6_TIME_EXCEEDED: \
68811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_timeexceed); \
68911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
69011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case ICMP6_PARAM_PROB: \
69111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_paramprob); \
69211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
69311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case ICMP6_ECHO_REQUEST: \
69411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_echo); \
69511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
69611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case ICMP6_ECHO_REPLY: \
69711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_echoreply); \
69811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
69911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case MLD_LISTENER_QUERY: \
70011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_mldquery); \
70111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
70211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case MLD_LISTENER_REPORT: \
70311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_mldreport); \
70411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
70511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case MLD_LISTENER_DONE: \
70611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_mlddone); \
70711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
70811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case ND_ROUTER_SOLICIT: \
70911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_routersolicit); \
71011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
71111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case ND_ROUTER_ADVERT: \
71211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_routeradvert); \
71311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
71411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case ND_NEIGHBOR_SOLICIT: \
71511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_neighborsolicit); \
71611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
71711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case ND_NEIGHBOR_ADVERT: \
71811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_neighboradvert); \
71911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
72011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 case ND_REDIRECT: \
72111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 icmp6_ifstat_inc(ifp, ifs6_out_redirect); \
72211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 break; \
72311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		} \
72411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} while (/*CONSTCOND*/ 0)
72511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
72611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern int	icmp6_rediraccept;	/* accept/process redirects */
72711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern int	icmp6_redirtimeout;	/* cache time for redirect routes */
72811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _KERNEL */
72911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
73011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* !_NETINET_ICMP6_H_ */
731