xref: /freebsd/sys/netinet6/icmp6.h (revision 82cd038d51e2fa970be77f4d59c56d3452fedec0)
182cd038dSYoshinobu Inoue /*
282cd038dSYoshinobu Inoue  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
382cd038dSYoshinobu Inoue  * All rights reserved.
482cd038dSYoshinobu Inoue  *
582cd038dSYoshinobu Inoue  * Redistribution and use in source and binary forms, with or without
682cd038dSYoshinobu Inoue  * modification, are permitted provided that the following conditions
782cd038dSYoshinobu Inoue  * are met:
882cd038dSYoshinobu Inoue  * 1. Redistributions of source code must retain the above copyright
982cd038dSYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer.
1082cd038dSYoshinobu Inoue  * 2. Redistributions in binary form must reproduce the above copyright
1182cd038dSYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer in the
1282cd038dSYoshinobu Inoue  *    documentation and/or other materials provided with the distribution.
1382cd038dSYoshinobu Inoue  * 3. Neither the name of the project nor the names of its contributors
1482cd038dSYoshinobu Inoue  *    may be used to endorse or promote products derived from this software
1582cd038dSYoshinobu Inoue  *    without specific prior written permission.
1682cd038dSYoshinobu Inoue  *
1782cd038dSYoshinobu Inoue  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
1882cd038dSYoshinobu Inoue  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1982cd038dSYoshinobu Inoue  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2082cd038dSYoshinobu Inoue  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
2182cd038dSYoshinobu Inoue  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2282cd038dSYoshinobu Inoue  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2382cd038dSYoshinobu Inoue  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2482cd038dSYoshinobu Inoue  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2582cd038dSYoshinobu Inoue  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2682cd038dSYoshinobu Inoue  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2782cd038dSYoshinobu Inoue  * SUCH DAMAGE.
2882cd038dSYoshinobu Inoue  *
2982cd038dSYoshinobu Inoue  * $FreeBSD$
3082cd038dSYoshinobu Inoue  */
3182cd038dSYoshinobu Inoue 
3282cd038dSYoshinobu Inoue /*
3382cd038dSYoshinobu Inoue  * Copyright (c) 1982, 1986, 1993
3482cd038dSYoshinobu Inoue  *	The Regents of the University of California.  All rights reserved.
3582cd038dSYoshinobu Inoue  *
3682cd038dSYoshinobu Inoue  * Redistribution and use in source and binary forms, with or without
3782cd038dSYoshinobu Inoue  * modification, are permitted provided that the following conditions
3882cd038dSYoshinobu Inoue  * are met:
3982cd038dSYoshinobu Inoue  * 1. Redistributions of source code must retain the above copyright
4082cd038dSYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer.
4182cd038dSYoshinobu Inoue  * 2. Redistributions in binary form must reproduce the above copyright
4282cd038dSYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer in the
4382cd038dSYoshinobu Inoue  *    documentation and/or other materials provided with the distribution.
4482cd038dSYoshinobu Inoue  * 3. All advertising materials mentioning features or use of this software
4582cd038dSYoshinobu Inoue  *    must display the following acknowledgement:
4682cd038dSYoshinobu Inoue  *	This product includes software developed by the University of
4782cd038dSYoshinobu Inoue  *	California, Berkeley and its contributors.
4882cd038dSYoshinobu Inoue  * 4. Neither the name of the University nor the names of its contributors
4982cd038dSYoshinobu Inoue  *    may be used to endorse or promote products derived from this software
5082cd038dSYoshinobu Inoue  *    without specific prior written permission.
5182cd038dSYoshinobu Inoue  *
5282cd038dSYoshinobu Inoue  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
5382cd038dSYoshinobu Inoue  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
5482cd038dSYoshinobu Inoue  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
5582cd038dSYoshinobu Inoue  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
5682cd038dSYoshinobu Inoue  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
5782cd038dSYoshinobu Inoue  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
5882cd038dSYoshinobu Inoue  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
5982cd038dSYoshinobu Inoue  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
6082cd038dSYoshinobu Inoue  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
6182cd038dSYoshinobu Inoue  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
6282cd038dSYoshinobu Inoue  * SUCH DAMAGE.
6382cd038dSYoshinobu Inoue  *
6482cd038dSYoshinobu Inoue  *	@(#)ip_icmp.h	8.1 (Berkeley) 6/10/93
6582cd038dSYoshinobu Inoue  */
6682cd038dSYoshinobu Inoue 
6782cd038dSYoshinobu Inoue #ifndef _NETINET6_ICMPV6_H_
6882cd038dSYoshinobu Inoue #define _NETINET6_ICMPV6_H_
6982cd038dSYoshinobu Inoue 
7082cd038dSYoshinobu Inoue #define ICMPV6_PLD_MAXLEN	1232	/* IPV6_MMTU - sizeof(struct ip6_hdr)
7182cd038dSYoshinobu Inoue 					   - sizeof(struct icmp6_hdr) */
7282cd038dSYoshinobu Inoue 
7382cd038dSYoshinobu Inoue struct icmp6_hdr {
7482cd038dSYoshinobu Inoue 	u_int8_t	icmp6_type;	/* type field */
7582cd038dSYoshinobu Inoue 	u_int8_t	icmp6_code;	/* code field */
7682cd038dSYoshinobu Inoue 	u_int16_t	icmp6_cksum;	/* checksum field */
7782cd038dSYoshinobu Inoue 	union {
7882cd038dSYoshinobu Inoue 		u_int32_t	icmp6_un_data32[1]; /* type-specific field */
7982cd038dSYoshinobu Inoue 		u_int16_t	icmp6_un_data16[2]; /* type-specific field */
8082cd038dSYoshinobu Inoue 		u_int8_t	icmp6_un_data8[4];  /* type-specific field */
8182cd038dSYoshinobu Inoue 	} icmp6_dataun;
8282cd038dSYoshinobu Inoue };
8382cd038dSYoshinobu Inoue 
8482cd038dSYoshinobu Inoue #define	icmp6_data32	icmp6_dataun.icmp6_un_data32
8582cd038dSYoshinobu Inoue #define	icmp6_data16	icmp6_dataun.icmp6_un_data16
8682cd038dSYoshinobu Inoue #define	icmp6_data8	icmp6_dataun.icmp6_un_data8
8782cd038dSYoshinobu Inoue #define	icmp6_pptr	icmp6_data32[0]		/* parameter prob */
8882cd038dSYoshinobu Inoue #define	icmp6_mtu	icmp6_data32[0]		/* packet too big */
8982cd038dSYoshinobu Inoue #define	icmp6_id	icmp6_data16[0]		/* echo request/reply */
9082cd038dSYoshinobu Inoue #define	icmp6_seq	icmp6_data16[1]		/* echo request/reply */
9182cd038dSYoshinobu Inoue #define	icmp6_maxdelay	icmp6_data16[0]		/* mcast group membership */
9282cd038dSYoshinobu Inoue 
9382cd038dSYoshinobu Inoue #define	ICMP6_DST_UNREACH		1	/* dest unreachable, codes: */
9482cd038dSYoshinobu Inoue #define	ICMP6_PACKET_TOO_BIG		2	/* packet too big */
9582cd038dSYoshinobu Inoue #define	ICMP6_TIME_EXCEEDED		3	/* time exceeded, code: */
9682cd038dSYoshinobu Inoue #define	ICMP6_PARAM_PROB		4	/* ip6 header bad */
9782cd038dSYoshinobu Inoue 
9882cd038dSYoshinobu Inoue #define	ICMP6_ECHO_REQUEST		128	/* echo service */
9982cd038dSYoshinobu Inoue #define	ICMP6_ECHO_REPLY		129	/* echo reply */
10082cd038dSYoshinobu Inoue #define	ICMP6_MEMBERSHIP_QUERY		130	/* group membership query */
10182cd038dSYoshinobu Inoue #define	MLD6_LISTENER_QUERY		130 	/* multicast listener query */
10282cd038dSYoshinobu Inoue #define	ICMP6_MEMBERSHIP_REPORT		131	/* group membership report */
10382cd038dSYoshinobu Inoue #define	MLD6_LISTENER_REPORT		131	/* multicast listener report */
10482cd038dSYoshinobu Inoue #define	ICMP6_MEMBERSHIP_REDUCTION	132	/* group membership termination */
10582cd038dSYoshinobu Inoue #define	MLD6_LISTENER_DONE		132	/* multicast listener done */
10682cd038dSYoshinobu Inoue 
10782cd038dSYoshinobu Inoue #define	ND_ROUTER_SOLICIT		133	/* router solicitation */
10882cd038dSYoshinobu Inoue #define	ND_ROUTER_ADVERT		134	/* router advertisment */
10982cd038dSYoshinobu Inoue #define	ND_NEIGHBOR_SOLICIT		135	/* neighbor solicitation */
11082cd038dSYoshinobu Inoue #define	ND_NEIGHBOR_ADVERT		136	/* neighbor advertisment */
11182cd038dSYoshinobu Inoue #define	ND_REDIRECT			137	/* redirect */
11282cd038dSYoshinobu Inoue 
11382cd038dSYoshinobu Inoue #define	ICMP6_ROUTER_RENUMBERING	138	/* router renumbering */
11482cd038dSYoshinobu Inoue 
11582cd038dSYoshinobu Inoue #define	ICMP6_WRUREQUEST		139	/* who are you request */
11682cd038dSYoshinobu Inoue #define	ICMP6_WRUREPLY			140	/* who are you reply */
11782cd038dSYoshinobu Inoue #define	ICMP6_FQDN_QUERY		139	/* FQDN query */
11882cd038dSYoshinobu Inoue #define	ICMP6_FQDN_REPLY		140	/* FQDN reply */
11982cd038dSYoshinobu Inoue #define	ICMP6_NI_QUERY			139	/* node information request */
12082cd038dSYoshinobu Inoue #define	ICMP6_NI_REPLY			140	/* node information reply */
12182cd038dSYoshinobu Inoue 
12282cd038dSYoshinobu Inoue /* The definitions below are experimental. TBA */
12382cd038dSYoshinobu Inoue #define	MLD6_MTRACE_RESP		141	/* mtrace response(to sender) */
12482cd038dSYoshinobu Inoue #define	MLD6_MTRACE			142	/* mtrace messages */
12582cd038dSYoshinobu Inoue 
12682cd038dSYoshinobu Inoue #define	ICMP6_MAXTYPE			142
12782cd038dSYoshinobu Inoue 
12882cd038dSYoshinobu Inoue #define	ICMP6_DST_UNREACH_NOROUTE	0	/* no route to destination */
12982cd038dSYoshinobu Inoue #define	ICMP6_DST_UNREACH_ADMIN	 	1	/* administratively prohibited */
13082cd038dSYoshinobu Inoue #define	ICMP6_DST_UNREACH_NOTNEIGHBOR	2	/* not a neighbor(obsolete) */
13182cd038dSYoshinobu Inoue #define	ICMP6_DST_UNREACH_BEYONDSCOPE	2	/* beyond scope of source address */
13282cd038dSYoshinobu Inoue #define	ICMP6_DST_UNREACH_ADDR		3	/* address unreachable */
13382cd038dSYoshinobu Inoue #define	ICMP6_DST_UNREACH_NOPORT	4	/* port unreachable */
13482cd038dSYoshinobu Inoue 
13582cd038dSYoshinobu Inoue #define	ICMP6_TIME_EXCEED_TRANSIT 	0	/* ttl==0 in transit */
13682cd038dSYoshinobu Inoue #define	ICMP6_TIME_EXCEED_REASSEMBLY	1	/* ttl==0 in reass */
13782cd038dSYoshinobu Inoue 
13882cd038dSYoshinobu Inoue #define	ICMP6_PARAMPROB_HEADER 	 	0	/* erroneous header field */
13982cd038dSYoshinobu Inoue #define	ICMP6_PARAMPROB_NEXTHEADER	1	/* unrecognized next header */
14082cd038dSYoshinobu Inoue #define	ICMP6_PARAMPROB_OPTION		2	/* unrecognized option */
14182cd038dSYoshinobu Inoue 
14282cd038dSYoshinobu Inoue #define	ICMP6_INFOMSG_MASK		0x80	/* all informational messages */
14382cd038dSYoshinobu Inoue 
14482cd038dSYoshinobu Inoue #define	ICMP6_NI_SUCESS		0	/* node information successful reply */
14582cd038dSYoshinobu Inoue #define	ICMP6_NI_REFUSED	1	/* node information request is refused */
14682cd038dSYoshinobu Inoue #define	ICMP6_NI_UNKNOWN	2	/* unknown Qtype */
14782cd038dSYoshinobu Inoue 
14882cd038dSYoshinobu Inoue #define	ICMP6_ROUTER_RENUMBERING_COMMAND  0	/* rr command */
14982cd038dSYoshinobu Inoue #define	ICMP6_ROUTER_RENUMBERING_RESULT   1	/* rr result */
15082cd038dSYoshinobu Inoue #define	ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET   255	/* rr seq num reset */
15182cd038dSYoshinobu Inoue 
15282cd038dSYoshinobu Inoue /* Used in kernel only */
15382cd038dSYoshinobu Inoue #define	ND_REDIRECT_ONLINK	0	/* redirect to an on-link node */
15482cd038dSYoshinobu Inoue #define	ND_REDIRECT_ROUTER	1	/* redirect to a better router */
15582cd038dSYoshinobu Inoue 
15682cd038dSYoshinobu Inoue /*
15782cd038dSYoshinobu Inoue  * Multicast Listener Discovery
15882cd038dSYoshinobu Inoue  */
15982cd038dSYoshinobu Inoue struct mld6_hdr {
16082cd038dSYoshinobu Inoue 	struct	icmp6_hdr	mld6_hdr;
16182cd038dSYoshinobu Inoue 	struct	in6_addr	mld6_addr; /* multicast address */
16282cd038dSYoshinobu Inoue };
16382cd038dSYoshinobu Inoue 
16482cd038dSYoshinobu Inoue #define	mld6_type	mld6_hdr.icmp6_type
16582cd038dSYoshinobu Inoue #define	mld6_code	mld6_hdr.icmp6_code
16682cd038dSYoshinobu Inoue #define	mld6_cksum	mld6_hdr.icmp6_cksum
16782cd038dSYoshinobu Inoue #define	mld6_maxdelay	mld6_hdr.icmp6_data16[0]
16882cd038dSYoshinobu Inoue #define	mld6_reserved	mld6_hdr.icmp6_data16[1]
16982cd038dSYoshinobu Inoue 
17082cd038dSYoshinobu Inoue /*
17182cd038dSYoshinobu Inoue  * Neighbor Discovery
17282cd038dSYoshinobu Inoue  */
17382cd038dSYoshinobu Inoue 
17482cd038dSYoshinobu Inoue struct nd_router_solicit {	/* router solicitation */
17582cd038dSYoshinobu Inoue 	struct	icmp6_hdr 	nd_rs_hdr;
17682cd038dSYoshinobu Inoue 	/* could be followed by options */
17782cd038dSYoshinobu Inoue };
17882cd038dSYoshinobu Inoue 
17982cd038dSYoshinobu Inoue #define	nd_rs_type	nd_rs_hdr.icmp6_type
18082cd038dSYoshinobu Inoue #define	nd_rs_code	nd_rs_hdr.icmp6_code
18182cd038dSYoshinobu Inoue #define	nd_rs_cksum	nd_rs_hdr.icmp6_cksum
18282cd038dSYoshinobu Inoue #define	nd_rs_reserved	nd_rs_hdr.icmp6_data32[0]
18382cd038dSYoshinobu Inoue 
18482cd038dSYoshinobu Inoue struct nd_router_advert {	/* router advertisement */
18582cd038dSYoshinobu Inoue 	struct	icmp6_hdr	nd_ra_hdr;
18682cd038dSYoshinobu Inoue 	u_int32_t	nd_ra_reachable;	/* reachable time */
18782cd038dSYoshinobu Inoue 	u_int32_t	nd_ra_retransmit;	/* retransmit timer */
18882cd038dSYoshinobu Inoue 	/* could be followed by options */
18982cd038dSYoshinobu Inoue };
19082cd038dSYoshinobu Inoue 
19182cd038dSYoshinobu Inoue #define	nd_ra_type		nd_ra_hdr.icmp6_type
19282cd038dSYoshinobu Inoue #define	nd_ra_code		nd_ra_hdr.icmp6_code
19382cd038dSYoshinobu Inoue #define	nd_ra_cksum		nd_ra_hdr.icmp6_cksum
19482cd038dSYoshinobu Inoue #define	nd_ra_curhoplimit	nd_ra_hdr.icmp6_data8[0]
19582cd038dSYoshinobu Inoue #define	nd_ra_flags_reserved	nd_ra_hdr.icmp6_data8[1]
19682cd038dSYoshinobu Inoue #define	ND_RA_FLAG_MANAGED	0x80
19782cd038dSYoshinobu Inoue #define	ND_RA_FLAG_OTHER	0x40
19882cd038dSYoshinobu Inoue #define	nd_ra_router_lifetime	nd_ra_hdr.icmp6_data16[1]
19982cd038dSYoshinobu Inoue 
20082cd038dSYoshinobu Inoue struct nd_neighbor_solicit {	/* neighbor solicitation */
20182cd038dSYoshinobu Inoue 	struct	icmp6_hdr	nd_ns_hdr;
20282cd038dSYoshinobu Inoue 	struct	in6_addr	nd_ns_target;	/*target address */
20382cd038dSYoshinobu Inoue 	/* could be followed by options */
20482cd038dSYoshinobu Inoue };
20582cd038dSYoshinobu Inoue 
20682cd038dSYoshinobu Inoue #define	nd_ns_type		nd_ns_hdr.icmp6_type
20782cd038dSYoshinobu Inoue #define	nd_ns_code		nd_ns_hdr.icmp6_code
20882cd038dSYoshinobu Inoue #define	nd_ns_cksum		nd_ns_hdr.icmp6_cksum
20982cd038dSYoshinobu Inoue #define	nd_ns_reserved		nd_ns_hdr.icmp6_data32[0]
21082cd038dSYoshinobu Inoue 
21182cd038dSYoshinobu Inoue struct nd_neighbor_advert {	/* neighbor advertisement */
21282cd038dSYoshinobu Inoue 	struct	icmp6_hdr	nd_na_hdr;
21382cd038dSYoshinobu Inoue 	struct	in6_addr	nd_na_target;	/* target address */
21482cd038dSYoshinobu Inoue 	/* could be followed by options */
21582cd038dSYoshinobu Inoue };
21682cd038dSYoshinobu Inoue 
21782cd038dSYoshinobu Inoue #define	nd_na_type		nd_na_hdr.icmp6_type
21882cd038dSYoshinobu Inoue #define	nd_na_code		nd_na_hdr.icmp6_code
21982cd038dSYoshinobu Inoue #define	nd_na_cksum		nd_na_hdr.icmp6_cksum
22082cd038dSYoshinobu Inoue #define	nd_na_flags_reserved	nd_na_hdr.icmp6_data32[0]
22182cd038dSYoshinobu Inoue #if BYTE_ORDER == BIG_ENDIAN
22282cd038dSYoshinobu Inoue #define	ND_NA_FLAG_ROUTER		0x80000000
22382cd038dSYoshinobu Inoue #define	ND_NA_FLAG_SOLICITED		0x40000000
22482cd038dSYoshinobu Inoue #define	ND_NA_FLAG_OVERRIDE		0x20000000
22582cd038dSYoshinobu Inoue #elif BYTE_ORDER == LITTLE_ENDIAN
22682cd038dSYoshinobu Inoue #define	ND_NA_FLAG_ROUTER		0x80
22782cd038dSYoshinobu Inoue #define	ND_NA_FLAG_SOLICITED		0x40
22882cd038dSYoshinobu Inoue #define	ND_NA_FLAG_OVERRIDE		0x20
22982cd038dSYoshinobu Inoue #endif
23082cd038dSYoshinobu Inoue 
23182cd038dSYoshinobu Inoue struct nd_redirect {		/* redirect */
23282cd038dSYoshinobu Inoue 	struct	icmp6_hdr	nd_rd_hdr;
23382cd038dSYoshinobu Inoue 	struct	in6_addr	nd_rd_target;	/* target address */
23482cd038dSYoshinobu Inoue 	struct	in6_addr	nd_rd_dst;	/* destination address */
23582cd038dSYoshinobu Inoue 	/* could be followed by options */
23682cd038dSYoshinobu Inoue };
23782cd038dSYoshinobu Inoue 
23882cd038dSYoshinobu Inoue #define	nd_rd_type		nd_rd_hdr.icmp6_type
23982cd038dSYoshinobu Inoue #define	nd_rd_code		nd_rd_hdr.icmp6_code
24082cd038dSYoshinobu Inoue #define	nd_rd_cksum		nd_rd_hdr.icmp6_cksum
24182cd038dSYoshinobu Inoue #define	nd_rd_reserved		nd_rd_hdr.icmp6_data32[0]
24282cd038dSYoshinobu Inoue 
24382cd038dSYoshinobu Inoue struct nd_opt_hdr {		/* Neighbor discovery option header */
24482cd038dSYoshinobu Inoue 	u_int8_t	nd_opt_type;
24582cd038dSYoshinobu Inoue 	u_int8_t	nd_opt_len;
24682cd038dSYoshinobu Inoue 	/* followed by option specific data*/
24782cd038dSYoshinobu Inoue };
24882cd038dSYoshinobu Inoue 
24982cd038dSYoshinobu Inoue #define	ND_OPT_SOURCE_LINKADDR		1
25082cd038dSYoshinobu Inoue #define	ND_OPT_TARGET_LINKADDR		2
25182cd038dSYoshinobu Inoue #define	ND_OPT_PREFIX_INFORMATION	3
25282cd038dSYoshinobu Inoue #define	ND_OPT_REDIRECTED_HEADER	4
25382cd038dSYoshinobu Inoue #define	ND_OPT_MTU			5
25482cd038dSYoshinobu Inoue 
25582cd038dSYoshinobu Inoue struct nd_opt_prefix_info {	/* prefix information */
25682cd038dSYoshinobu Inoue 	u_int8_t	nd_opt_pi_type;
25782cd038dSYoshinobu Inoue 	u_int8_t	nd_opt_pi_len;
25882cd038dSYoshinobu Inoue 	u_int8_t	nd_opt_pi_prefix_len;
25982cd038dSYoshinobu Inoue 	u_int8_t	nd_opt_pi_flags_reserved;
26082cd038dSYoshinobu Inoue 	u_int32_t	nd_opt_pi_valid_time;
26182cd038dSYoshinobu Inoue 	u_int32_t	nd_opt_pi_preferred_time;
26282cd038dSYoshinobu Inoue 	u_int32_t	nd_opt_pi_reserved2;
26382cd038dSYoshinobu Inoue 	struct	in6_addr	nd_opt_pi_prefix;
26482cd038dSYoshinobu Inoue };
26582cd038dSYoshinobu Inoue 
26682cd038dSYoshinobu Inoue #define	ND_OPT_PI_FLAG_ONLINK		0x80
26782cd038dSYoshinobu Inoue #define	ND_OPT_PI_FLAG_AUTO		0x40
26882cd038dSYoshinobu Inoue 
26982cd038dSYoshinobu Inoue struct nd_opt_rd_hdr {         /* redirected header */
27082cd038dSYoshinobu Inoue 	u_int8_t	nd_opt_rh_type;
27182cd038dSYoshinobu Inoue 	u_int8_t	nd_opt_rh_len;
27282cd038dSYoshinobu Inoue 	u_int16_t	nd_opt_rh_reserved1;
27382cd038dSYoshinobu Inoue 	u_int32_t	nd_opt_rh_reserved2;
27482cd038dSYoshinobu Inoue 	/* followed by IP header and data */
27582cd038dSYoshinobu Inoue };
27682cd038dSYoshinobu Inoue 
27782cd038dSYoshinobu Inoue struct nd_opt_mtu {		/* MTU option */
27882cd038dSYoshinobu Inoue 	u_int8_t	nd_opt_mtu_type;
27982cd038dSYoshinobu Inoue 	u_int8_t	nd_opt_mtu_len;
28082cd038dSYoshinobu Inoue 	u_int16_t	nd_opt_mtu_reserved;
28182cd038dSYoshinobu Inoue 	u_int32_t	nd_opt_mtu_mtu;
28282cd038dSYoshinobu Inoue };
28382cd038dSYoshinobu Inoue 
28482cd038dSYoshinobu Inoue /*
28582cd038dSYoshinobu Inoue  * icmp6 namelookup
28682cd038dSYoshinobu Inoue  */
28782cd038dSYoshinobu Inoue 
28882cd038dSYoshinobu Inoue struct icmp6_namelookup {
28982cd038dSYoshinobu Inoue 	struct	icmp6_hdr	icmp6_nl_hdr;
29082cd038dSYoshinobu Inoue 	u_int64_t	icmp6_nl_nonce;
29182cd038dSYoshinobu Inoue 	u_int32_t	icmp6_nl_ttl;
29282cd038dSYoshinobu Inoue 	/* could be followed by options */
29382cd038dSYoshinobu Inoue };
29482cd038dSYoshinobu Inoue 
29582cd038dSYoshinobu Inoue /*
29682cd038dSYoshinobu Inoue  * icmp6 node information
29782cd038dSYoshinobu Inoue  */
29882cd038dSYoshinobu Inoue struct icmp6_nodeinfo {
29982cd038dSYoshinobu Inoue 	struct	icmp6_hdr icmp6_ni_hdr;
30082cd038dSYoshinobu Inoue 	u_int64_t	icmp6_ni_nonce;
30182cd038dSYoshinobu Inoue 	/* could be followed by reply data */
30282cd038dSYoshinobu Inoue };
30382cd038dSYoshinobu Inoue 
30482cd038dSYoshinobu Inoue #define	ni_type		icmp6_ni_hdr.icmp6_type
30582cd038dSYoshinobu Inoue #define	ni_code		icmp6_ni_hdr.icmp6_code
30682cd038dSYoshinobu Inoue #define	ni_cksum	icmp6_ni_hdr.icmp6_cksum
30782cd038dSYoshinobu Inoue #define	ni_qtype	icmp6_ni_hdr.icmp6_data16[0]
30882cd038dSYoshinobu Inoue #define	ni_flags	icmp6_ni_hdr.icmp6_data16[1]
30982cd038dSYoshinobu Inoue 
31082cd038dSYoshinobu Inoue 
31182cd038dSYoshinobu Inoue #define	NI_QTYPE_NOOP		0 /* NOOP  */
31282cd038dSYoshinobu Inoue #define	NI_QTYPE_SUPTYPES	1 /* Supported Qtypes */
31382cd038dSYoshinobu Inoue #define	NI_QTYPE_FQDN		2 /* FQDN */
31482cd038dSYoshinobu Inoue #define	NI_QTYPE_NODEADDR	3 /* Node Addresses. XXX: spec says 2, but it may be a typo... */
31582cd038dSYoshinobu Inoue 
31682cd038dSYoshinobu Inoue #if BYTE_ORDER == BIG_ENDIAN
31782cd038dSYoshinobu Inoue #define	NI_SUPTYPE_FLAG_COMPRESS	0x1
31882cd038dSYoshinobu Inoue #define	NI_FQDN_FLAG_VALIDTTL		0x1
31982cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_LINKLOCAL	0x1
32082cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_SITELOCAL	0x2
32182cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_GLOBAL		0x4
32282cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_ALL		0x8
32382cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_TRUNCATE	0x10
32482cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_ANYCAST	0x20 /* just experimental. not in spec */
32582cd038dSYoshinobu Inoue #elif BYTE_ORDER == LITTLE_ENDIAN
32682cd038dSYoshinobu Inoue #define	NI_SUPTYPE_FLAG_COMPRESS	0x0100
32782cd038dSYoshinobu Inoue #define	NI_FQDN_FLAG_VALIDTTL		0x0100
32882cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_LINKLOCAL	0x0100
32982cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_SITELOCAL	0x0200
33082cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_GLOBAL		0x0400
33182cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_ALL		0x0800
33282cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_TRUNCATE	0x1000
33382cd038dSYoshinobu Inoue #define	NI_NODEADDR_FLAG_ANYCAST	0x2000 /* just experimental. not in spec */
33482cd038dSYoshinobu Inoue #endif
33582cd038dSYoshinobu Inoue 
33682cd038dSYoshinobu Inoue struct ni_reply_fqdn {
33782cd038dSYoshinobu Inoue 	u_int32_t	ni_fqdn_ttl;	/* TTL */
33882cd038dSYoshinobu Inoue 	u_int8_t	ni_fqdn_namelen; /* length in octets of the FQDN */
33982cd038dSYoshinobu Inoue 	u_int8_t	ni_fqdn_name[3]; /* XXX: alignment */
34082cd038dSYoshinobu Inoue };
34182cd038dSYoshinobu Inoue 
34282cd038dSYoshinobu Inoue /*
34382cd038dSYoshinobu Inoue  * Router Renumbering. as router-renum-08.txt
34482cd038dSYoshinobu Inoue  */
34582cd038dSYoshinobu Inoue struct icmp6_router_renum {	/* router renumbering header */
34682cd038dSYoshinobu Inoue 	struct icmp6_hdr	rr_hdr;
34782cd038dSYoshinobu Inoue 	u_int8_t	rr_segnum;
34882cd038dSYoshinobu Inoue 	u_int8_t	rr_flags;
34982cd038dSYoshinobu Inoue 	u_int16_t	rr_maxdelay;
35082cd038dSYoshinobu Inoue 	u_int32_t	rr_reserved;
35182cd038dSYoshinobu Inoue };
35282cd038dSYoshinobu Inoue #define	ICMP6_RR_FLAGS_SEGNUM		0x80
35382cd038dSYoshinobu Inoue #define	ICMP6_RR_FLAGS_TEST		0x40
35482cd038dSYoshinobu Inoue #define	ICMP6_RR_FLAGS_REQRESULT	0x20
35582cd038dSYoshinobu Inoue #define	ICMP6_RR_FLAGS_FORCEAPPLY	0x10
35682cd038dSYoshinobu Inoue #define	ICMP6_RR_FLAGS_SPECSITE		0x08
35782cd038dSYoshinobu Inoue #define	ICMP6_RR_FLAGS_PREVDONE		0x04
35882cd038dSYoshinobu Inoue 
35982cd038dSYoshinobu Inoue #define	rr_type		rr_hdr.icmp6_type
36082cd038dSYoshinobu Inoue #define	rr_code		rr_hdr.icmp6_code
36182cd038dSYoshinobu Inoue #define	rr_cksum	rr_hdr.icmp6_cksum
36282cd038dSYoshinobu Inoue #define	rr_seqnum 	rr_hdr.icmp6_data32[0]
36382cd038dSYoshinobu Inoue 
36482cd038dSYoshinobu Inoue struct rr_pco_match {		/* match prefix part */
36582cd038dSYoshinobu Inoue 	u_int8_t	rpm_code;
36682cd038dSYoshinobu Inoue 	u_int8_t	rpm_len;
36782cd038dSYoshinobu Inoue 	u_int8_t	rpm_ordinal;
36882cd038dSYoshinobu Inoue 	u_int8_t	rpm_matchlen;
36982cd038dSYoshinobu Inoue 	u_int8_t	rpm_minlen;
37082cd038dSYoshinobu Inoue 	u_int8_t	rpm_maxlen;
37182cd038dSYoshinobu Inoue 	u_int16_t	rpm_reserved;
37282cd038dSYoshinobu Inoue 	struct	in6_addr	rpm_prefix;
37382cd038dSYoshinobu Inoue };
37482cd038dSYoshinobu Inoue 
37582cd038dSYoshinobu Inoue #define	RPM_PCO_ADD		1
37682cd038dSYoshinobu Inoue #define	RPM_PCO_CHANGE		2
37782cd038dSYoshinobu Inoue #define	RPM_PCO_SETGLOBAL	3
37882cd038dSYoshinobu Inoue 
37982cd038dSYoshinobu Inoue struct rr_pco_use {		/* use prefix part */
38082cd038dSYoshinobu Inoue 	u_int8_t	rpu_uselen;
38182cd038dSYoshinobu Inoue 	u_int8_t	rpu_keeplen;
38282cd038dSYoshinobu Inoue 	u_int8_t	rpu_ramask;
38382cd038dSYoshinobu Inoue 	u_int8_t	rpu_raflags;
38482cd038dSYoshinobu Inoue 	u_int32_t	rpu_vltime;
38582cd038dSYoshinobu Inoue 	u_int32_t	rpu_pltime;
38682cd038dSYoshinobu Inoue 	u_int32_t	rpu_flags;
38782cd038dSYoshinobu Inoue 	struct	in6_addr rpu_prefix;
38882cd038dSYoshinobu Inoue };
38982cd038dSYoshinobu Inoue #define	ICMP6_RR_PCOUSE_RAFLAGS_ONLINK	0x20
39082cd038dSYoshinobu Inoue #define	ICMP6_RR_PCOUSE_RAFLAGS_AUTO	0x10
39182cd038dSYoshinobu Inoue 
39282cd038dSYoshinobu Inoue #if BYTE_ORDER == BIG_ENDIAN
39382cd038dSYoshinobu Inoue #define	ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME     0x80000000
39482cd038dSYoshinobu Inoue #define	ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME     0x40000000
39582cd038dSYoshinobu Inoue #elif BYTE_ORDER == LITTLE_ENDIAN
39682cd038dSYoshinobu Inoue #define	ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME     0x80
39782cd038dSYoshinobu Inoue #define	ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME     0x40
39882cd038dSYoshinobu Inoue #endif
39982cd038dSYoshinobu Inoue 
40082cd038dSYoshinobu Inoue struct rr_result {		/* router renumbering result message */
40182cd038dSYoshinobu Inoue 	u_int16_t	rrr_flags;
40282cd038dSYoshinobu Inoue 	u_int8_t	rrr_ordinal;
40382cd038dSYoshinobu Inoue 	u_int8_t	rrr_matchedlen;
40482cd038dSYoshinobu Inoue 	u_int32_t	rrr_ifid;
40582cd038dSYoshinobu Inoue 	struct	in6_addr rrr_prefix;
40682cd038dSYoshinobu Inoue };
40782cd038dSYoshinobu Inoue #if BYTE_ORDER == BIG_ENDIAN
40882cd038dSYoshinobu Inoue #define	ICMP6_RR_RESULT_FLAGS_OOB		0x0002
40982cd038dSYoshinobu Inoue #define	ICMP6_RR_RESULT_FLAGS_FORBIDDEN		0x0001
41082cd038dSYoshinobu Inoue #elif BYTE_ORDER == LITTLE_ENDIAN
41182cd038dSYoshinobu Inoue #define	ICMP6_RR_RESULT_FLAGS_OOB		0x02
41282cd038dSYoshinobu Inoue #define	ICMP6_RR_RESULT_FLAGS_FORBIDDEN		0x01
41382cd038dSYoshinobu Inoue #endif
41482cd038dSYoshinobu Inoue 
41582cd038dSYoshinobu Inoue /*
41682cd038dSYoshinobu Inoue  * icmp6 filter structures.
41782cd038dSYoshinobu Inoue  */
41882cd038dSYoshinobu Inoue 
41982cd038dSYoshinobu Inoue struct icmp6_filter {
42082cd038dSYoshinobu Inoue 	u_int32_t	icmp6_filter[8];
42182cd038dSYoshinobu Inoue };
42282cd038dSYoshinobu Inoue 
42382cd038dSYoshinobu Inoue #ifdef _KERNEL
42482cd038dSYoshinobu Inoue #define	ICMP6_FILTER_SETPASSALL(filterp) \
42582cd038dSYoshinobu Inoue     {								\
42682cd038dSYoshinobu Inoue 	int i; u_char *p;					\
42782cd038dSYoshinobu Inoue 	p = (u_char *)filterp;					\
42882cd038dSYoshinobu Inoue 	for (i = 0; i < sizeof(struct icmp6_filter); i++)	\
42982cd038dSYoshinobu Inoue 		p[i] = 0xff;					\
43082cd038dSYoshinobu Inoue     }
43182cd038dSYoshinobu Inoue #define	ICMP6_FILTER_SETBLOCKALL(filterp) \
43282cd038dSYoshinobu Inoue 	bzero(filterp, sizeof(struct icmp6_filter))
43382cd038dSYoshinobu Inoue #else /* _KERNEL */
43482cd038dSYoshinobu Inoue #define	ICMP6_FILTER_SETPASSALL(filterp) \
43582cd038dSYoshinobu Inoue 	memset(filterp, 0xff, sizeof(struct icmp6_filter))
43682cd038dSYoshinobu Inoue #define	ICMP6_FILTER_SETBLOCKALL(filterp) \
43782cd038dSYoshinobu Inoue 	memset(filterp, 0x00, sizeof(struct icmp6_filter))
43882cd038dSYoshinobu Inoue #endif /* _KERNEL */
43982cd038dSYoshinobu Inoue 
44082cd038dSYoshinobu Inoue #define	ICMP6_FILTER_SETPASS(type, filterp) \
44182cd038dSYoshinobu Inoue 	(((filterp)->icmp6_filter[(type) >> 5]) |= (1 << ((type) & 31)))
44282cd038dSYoshinobu Inoue #define	ICMP6_FILTER_SETBLOCK(type, filterp) \
44382cd038dSYoshinobu Inoue 	(((filterp)->icmp6_filter[(type) >> 5]) &= ~(1 << ((type) & 31)))
44482cd038dSYoshinobu Inoue #define	ICMP6_FILTER_WILLPASS(type, filterp) \
44582cd038dSYoshinobu Inoue 	((((filterp)->icmp6_filter[(type) >> 5]) & (1 << ((type) & 31))) != 0)
44682cd038dSYoshinobu Inoue #define	ICMP6_FILTER_WILLBLOCK(type, filterp) \
44782cd038dSYoshinobu Inoue 	((((filterp)->icmp6_filter[(type) >> 5]) & (1 << ((type) & 31))) == 0)
44882cd038dSYoshinobu Inoue 
44982cd038dSYoshinobu Inoue /*
45082cd038dSYoshinobu Inoue  * Variables related to this implementation
45182cd038dSYoshinobu Inoue  * of the internet control message protocol version 6.
45282cd038dSYoshinobu Inoue  */
45382cd038dSYoshinobu Inoue struct icmp6stat {
45482cd038dSYoshinobu Inoue /* statistics related to icmp6 packets generated */
45582cd038dSYoshinobu Inoue 	u_long	icp6s_error;		/* # of calls to icmp6_error */
45682cd038dSYoshinobu Inoue 	u_long	icp6s_canterror;	/* no error 'cuz old was icmp */
45782cd038dSYoshinobu Inoue 	u_long	icp6s_toofreq;		/* no error 'cuz rate limitation */
45882cd038dSYoshinobu Inoue 	u_long	icp6s_outhist[256];
45982cd038dSYoshinobu Inoue /* statistics related to input messages proccesed */
46082cd038dSYoshinobu Inoue 	u_long	icp6s_badcode;		/* icmp6_code out of range */
46182cd038dSYoshinobu Inoue 	u_long	icp6s_tooshort;		/* packet < sizeof(struct icmp6_hdr) */
46282cd038dSYoshinobu Inoue 	u_long	icp6s_checksum;		/* bad checksum */
46382cd038dSYoshinobu Inoue 	u_long	icp6s_badlen;		/* calculated bound mismatch */
46482cd038dSYoshinobu Inoue 	u_long	icp6s_reflect;		/* number of responses */
46582cd038dSYoshinobu Inoue 	u_long	icp6s_inhist[256];
46682cd038dSYoshinobu Inoue };
46782cd038dSYoshinobu Inoue 
46882cd038dSYoshinobu Inoue /*
46982cd038dSYoshinobu Inoue  * Names for ICMP sysctl objects
47082cd038dSYoshinobu Inoue  */
47182cd038dSYoshinobu Inoue #define	ICMPV6CTL_STATS			1
47282cd038dSYoshinobu Inoue #define	ICMPV6CTL_REDIRACCEPT		2 /* accept/process redirects */
47382cd038dSYoshinobu Inoue #define	ICMPV6CTL_REDIRTIMEOUT		3 /* redirect cache time */
47482cd038dSYoshinobu Inoue #define	ICMPV6CTL_ERRRATELIMIT		5 /* ICMPv6 error rate limitation */
47582cd038dSYoshinobu Inoue #define	ICMPV6CTL_ND6_PRUNE		6
47682cd038dSYoshinobu Inoue #define	ICMPV6CTL_ND6_DELAY		8
47782cd038dSYoshinobu Inoue #define	ICMPV6CTL_ND6_UMAXTRIES		9
47882cd038dSYoshinobu Inoue #define	ICMPV6CTL_ND6_MMAXTRIES		10
47982cd038dSYoshinobu Inoue #define	ICMPV6CTL_ND6_USELOOPBACK	11
48082cd038dSYoshinobu Inoue #define	ICMPV6CTL_ND6_PROXYALL		12
48182cd038dSYoshinobu Inoue #define	ICMPV6CTL_MAXID			13
48282cd038dSYoshinobu Inoue 
48382cd038dSYoshinobu Inoue #define ICMPV6CTL_NAMES { \
48482cd038dSYoshinobu Inoue 	{ 0, 0 }, \
48582cd038dSYoshinobu Inoue 	{ 0, 0 }, \
48682cd038dSYoshinobu Inoue 	{ "rediraccept", CTLTYPE_INT }, \
48782cd038dSYoshinobu Inoue 	{ "redirtimeout", CTLTYPE_INT }, \
48882cd038dSYoshinobu Inoue 	{ 0, 0 }, \
48982cd038dSYoshinobu Inoue 	{ "errratelimit", CTLTYPE_INT }, \
49082cd038dSYoshinobu Inoue 	{ "nd6_prune", CTLTYPE_INT }, \
49182cd038dSYoshinobu Inoue 	{ 0, 0 }, \
49282cd038dSYoshinobu Inoue 	{ "nd6_delay", CTLTYPE_INT }, \
49382cd038dSYoshinobu Inoue 	{ "nd6_umaxtries", CTLTYPE_INT }, \
49482cd038dSYoshinobu Inoue 	{ "nd6_mmaxtries", CTLTYPE_INT }, \
49582cd038dSYoshinobu Inoue 	{ "nd6_useloopback", CTLTYPE_INT }, \
49682cd038dSYoshinobu Inoue 	{ "nd6_proxyall", CTLTYPE_INT }, \
49782cd038dSYoshinobu Inoue }
49882cd038dSYoshinobu Inoue 
49982cd038dSYoshinobu Inoue #define ICMPV6CTL_VARS { \
50082cd038dSYoshinobu Inoue 	0, \
50182cd038dSYoshinobu Inoue 	0, \
50282cd038dSYoshinobu Inoue 	&icmp6_rediraccept,   \
50382cd038dSYoshinobu Inoue 	&icmp6_redirtimeout,  \
50482cd038dSYoshinobu Inoue 	0, \
50582cd038dSYoshinobu Inoue 	0, \
50682cd038dSYoshinobu Inoue 	&icmp6errratelim, \
50782cd038dSYoshinobu Inoue 	&nd6_prune,	\
50882cd038dSYoshinobu Inoue 	0, \
50982cd038dSYoshinobu Inoue 	&nd6_delay,	\
51082cd038dSYoshinobu Inoue 	&nd6_umaxtries, \
51182cd038dSYoshinobu Inoue 	&nd6_mmaxtries,	\
51282cd038dSYoshinobu Inoue 	&nd6_useloopback, \
51382cd038dSYoshinobu Inoue 	&nd6_proxyall, \
51482cd038dSYoshinobu Inoue }
51582cd038dSYoshinobu Inoue 
51682cd038dSYoshinobu Inoue #define RTF_PROBEMTU	RTF_PROTO1
51782cd038dSYoshinobu Inoue 
51882cd038dSYoshinobu Inoue #ifdef _KERNEL
51982cd038dSYoshinobu Inoue # ifdef __STDC__
52082cd038dSYoshinobu Inoue struct	rtentry;
52182cd038dSYoshinobu Inoue struct	rttimer;
52282cd038dSYoshinobu Inoue struct	in6_multi;
52382cd038dSYoshinobu Inoue # endif
52482cd038dSYoshinobu Inoue void	icmp6_init __P((void));
52582cd038dSYoshinobu Inoue void	icmp6_paramerror __P((struct mbuf *, int));
52682cd038dSYoshinobu Inoue void	icmp6_error __P((struct mbuf *, int, int, int));
52782cd038dSYoshinobu Inoue int	icmp6_input __P((struct mbuf **, int *, int));
52882cd038dSYoshinobu Inoue void	icmp6_fasttimo __P((void));
52982cd038dSYoshinobu Inoue void	icmp6_reflect __P((struct mbuf *, size_t));
53082cd038dSYoshinobu Inoue void	icmp6_prepare __P((struct mbuf *));
53182cd038dSYoshinobu Inoue void	icmp6_redirect_input __P((struct mbuf *, int));
53282cd038dSYoshinobu Inoue void	icmp6_redirect_output __P((struct mbuf *, struct rtentry *));
53382cd038dSYoshinobu Inoue 
53482cd038dSYoshinobu Inoue /* XXX: is this the right place for these macros? */
53582cd038dSYoshinobu Inoue #define icmp6_ifstat_inc(ifp, tag) \
53682cd038dSYoshinobu Inoue do {								\
53782cd038dSYoshinobu Inoue 	if ((ifp) && (ifp)->if_index <= if_index			\
53882cd038dSYoshinobu Inoue 	 && (ifp)->if_index < icmp6_ifstatmax			\
53982cd038dSYoshinobu Inoue 	 && icmp6_ifstat && icmp6_ifstat[(ifp)->if_index]) {	\
54082cd038dSYoshinobu Inoue 		icmp6_ifstat[(ifp)->if_index]->tag++;		\
54182cd038dSYoshinobu Inoue 	}							\
54282cd038dSYoshinobu Inoue } while (0)
54382cd038dSYoshinobu Inoue 
54482cd038dSYoshinobu Inoue #define icmp6_ifoutstat_inc(ifp, type, code) \
54582cd038dSYoshinobu Inoue do { \
54682cd038dSYoshinobu Inoue 		icmp6_ifstat_inc(ifp, ifs6_out_msg); \
54782cd038dSYoshinobu Inoue  		if (type < ICMP6_INFOMSG_MASK) \
54882cd038dSYoshinobu Inoue  			icmp6_ifstat_inc(ifp, ifs6_out_error); \
54982cd038dSYoshinobu Inoue 		switch(type) { \
55082cd038dSYoshinobu Inoue 		 case ICMP6_DST_UNREACH: \
55182cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_dstunreach); \
55282cd038dSYoshinobu Inoue 			 if (code == ICMP6_DST_UNREACH_ADMIN) \
55382cd038dSYoshinobu Inoue 				 icmp6_ifstat_inc(ifp, ifs6_out_adminprohib); \
55482cd038dSYoshinobu Inoue 			 break; \
55582cd038dSYoshinobu Inoue 		 case ICMP6_PACKET_TOO_BIG: \
55682cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_pkttoobig); \
55782cd038dSYoshinobu Inoue 			 break; \
55882cd038dSYoshinobu Inoue 		 case ICMP6_TIME_EXCEEDED: \
55982cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_timeexceed); \
56082cd038dSYoshinobu Inoue 			 break; \
56182cd038dSYoshinobu Inoue 		 case ICMP6_PARAM_PROB: \
56282cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_paramprob); \
56382cd038dSYoshinobu Inoue 			 break; \
56482cd038dSYoshinobu Inoue 		 case ICMP6_ECHO_REQUEST: \
56582cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_echo); \
56682cd038dSYoshinobu Inoue 			 break; \
56782cd038dSYoshinobu Inoue 		 case ICMP6_ECHO_REPLY: \
56882cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_echoreply); \
56982cd038dSYoshinobu Inoue 			 break; \
57082cd038dSYoshinobu Inoue 		 case MLD6_LISTENER_QUERY: \
57182cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_mldquery); \
57282cd038dSYoshinobu Inoue 			 break; \
57382cd038dSYoshinobu Inoue 		 case MLD6_LISTENER_REPORT: \
57482cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_mldreport); \
57582cd038dSYoshinobu Inoue 			 break; \
57682cd038dSYoshinobu Inoue 		 case MLD6_LISTENER_DONE: \
57782cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_mlddone); \
57882cd038dSYoshinobu Inoue 			 break; \
57982cd038dSYoshinobu Inoue 		 case ND_ROUTER_SOLICIT: \
58082cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_routersolicit); \
58182cd038dSYoshinobu Inoue 			 break; \
58282cd038dSYoshinobu Inoue 		 case ND_ROUTER_ADVERT: \
58382cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_routeradvert); \
58482cd038dSYoshinobu Inoue 			 break; \
58582cd038dSYoshinobu Inoue 		 case ND_NEIGHBOR_SOLICIT: \
58682cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_neighborsolicit); \
58782cd038dSYoshinobu Inoue 			 break; \
58882cd038dSYoshinobu Inoue 		 case ND_NEIGHBOR_ADVERT: \
58982cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_neighboradvert); \
59082cd038dSYoshinobu Inoue 			 break; \
59182cd038dSYoshinobu Inoue 		 case ND_REDIRECT: \
59282cd038dSYoshinobu Inoue 			 icmp6_ifstat_inc(ifp, ifs6_out_redirect); \
59382cd038dSYoshinobu Inoue 			 break; \
59482cd038dSYoshinobu Inoue 		} \
59582cd038dSYoshinobu Inoue } while (0)
59682cd038dSYoshinobu Inoue 
59782cd038dSYoshinobu Inoue extern int	icmp6_rediraccept;	/* accept/process redirects */
59882cd038dSYoshinobu Inoue extern int	icmp6_redirtimeout;	/* cache time for redirect routes */
59982cd038dSYoshinobu Inoue #endif /* _KERNEL */
60082cd038dSYoshinobu Inoue 
60182cd038dSYoshinobu Inoue #endif /* not _NETINET6_ICMPV6_H_ */
60282cd038dSYoshinobu Inoue 
603