xref: /OK3568_Linux_fs/kernel/include/uapi/linux/icmpv6.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2*4882a593Smuzhiyun #ifndef _UAPI_LINUX_ICMPV6_H
3*4882a593Smuzhiyun #define _UAPI_LINUX_ICMPV6_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/types.h>
6*4882a593Smuzhiyun #include <asm/byteorder.h>
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun struct icmp6hdr {
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun 	__u8		icmp6_type;
11*4882a593Smuzhiyun 	__u8		icmp6_code;
12*4882a593Smuzhiyun 	__sum16		icmp6_cksum;
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun 	union {
16*4882a593Smuzhiyun 		__be32			un_data32[1];
17*4882a593Smuzhiyun 		__be16			un_data16[2];
18*4882a593Smuzhiyun 		__u8			un_data8[4];
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun 		struct icmpv6_echo {
21*4882a593Smuzhiyun 			__be16		identifier;
22*4882a593Smuzhiyun 			__be16		sequence;
23*4882a593Smuzhiyun 		} u_echo;
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun                 struct icmpv6_nd_advt {
26*4882a593Smuzhiyun #if defined(__LITTLE_ENDIAN_BITFIELD)
27*4882a593Smuzhiyun                         __u32		reserved:5,
28*4882a593Smuzhiyun                         		override:1,
29*4882a593Smuzhiyun                         		solicited:1,
30*4882a593Smuzhiyun                         		router:1,
31*4882a593Smuzhiyun 					reserved2:24;
32*4882a593Smuzhiyun #elif defined(__BIG_ENDIAN_BITFIELD)
33*4882a593Smuzhiyun                         __u32		router:1,
34*4882a593Smuzhiyun 					solicited:1,
35*4882a593Smuzhiyun                         		override:1,
36*4882a593Smuzhiyun                         		reserved:29;
37*4882a593Smuzhiyun #else
38*4882a593Smuzhiyun #error	"Please fix <asm/byteorder.h>"
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun                 } u_nd_advt;
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun                 struct icmpv6_nd_ra {
43*4882a593Smuzhiyun 			__u8		hop_limit;
44*4882a593Smuzhiyun #if defined(__LITTLE_ENDIAN_BITFIELD)
45*4882a593Smuzhiyun 			__u8		reserved:3,
46*4882a593Smuzhiyun 					router_pref:2,
47*4882a593Smuzhiyun 					home_agent:1,
48*4882a593Smuzhiyun 					other:1,
49*4882a593Smuzhiyun 					managed:1;
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #elif defined(__BIG_ENDIAN_BITFIELD)
52*4882a593Smuzhiyun 			__u8		managed:1,
53*4882a593Smuzhiyun 					other:1,
54*4882a593Smuzhiyun 					home_agent:1,
55*4882a593Smuzhiyun 					router_pref:2,
56*4882a593Smuzhiyun 					reserved:3;
57*4882a593Smuzhiyun #else
58*4882a593Smuzhiyun #error	"Please fix <asm/byteorder.h>"
59*4882a593Smuzhiyun #endif
60*4882a593Smuzhiyun 			__be16		rt_lifetime;
61*4882a593Smuzhiyun                 } u_nd_ra;
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	} icmp6_dataun;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun #define icmp6_identifier	icmp6_dataun.u_echo.identifier
66*4882a593Smuzhiyun #define icmp6_sequence		icmp6_dataun.u_echo.sequence
67*4882a593Smuzhiyun #define icmp6_pointer		icmp6_dataun.un_data32[0]
68*4882a593Smuzhiyun #define icmp6_mtu		icmp6_dataun.un_data32[0]
69*4882a593Smuzhiyun #define icmp6_unused		icmp6_dataun.un_data32[0]
70*4882a593Smuzhiyun #define icmp6_maxdelay		icmp6_dataun.un_data16[0]
71*4882a593Smuzhiyun #define icmp6_datagram_len	icmp6_dataun.un_data8[0]
72*4882a593Smuzhiyun #define icmp6_router		icmp6_dataun.u_nd_advt.router
73*4882a593Smuzhiyun #define icmp6_solicited		icmp6_dataun.u_nd_advt.solicited
74*4882a593Smuzhiyun #define icmp6_override		icmp6_dataun.u_nd_advt.override
75*4882a593Smuzhiyun #define icmp6_ndiscreserved	icmp6_dataun.u_nd_advt.reserved
76*4882a593Smuzhiyun #define icmp6_hop_limit		icmp6_dataun.u_nd_ra.hop_limit
77*4882a593Smuzhiyun #define icmp6_addrconf_managed	icmp6_dataun.u_nd_ra.managed
78*4882a593Smuzhiyun #define icmp6_addrconf_other	icmp6_dataun.u_nd_ra.other
79*4882a593Smuzhiyun #define icmp6_rt_lifetime	icmp6_dataun.u_nd_ra.rt_lifetime
80*4882a593Smuzhiyun #define icmp6_router_pref	icmp6_dataun.u_nd_ra.router_pref
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define ICMPV6_ROUTER_PREF_LOW		0x3
85*4882a593Smuzhiyun #define ICMPV6_ROUTER_PREF_MEDIUM	0x0
86*4882a593Smuzhiyun #define ICMPV6_ROUTER_PREF_HIGH		0x1
87*4882a593Smuzhiyun #define ICMPV6_ROUTER_PREF_INVALID	0x2
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #define ICMPV6_DEST_UNREACH		1
90*4882a593Smuzhiyun #define ICMPV6_PKT_TOOBIG		2
91*4882a593Smuzhiyun #define ICMPV6_TIME_EXCEED		3
92*4882a593Smuzhiyun #define ICMPV6_PARAMPROB		4
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #define ICMPV6_ERRMSG_MAX       127
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun #define ICMPV6_INFOMSG_MASK		0x80
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun #define ICMPV6_ECHO_REQUEST		128
99*4882a593Smuzhiyun #define ICMPV6_ECHO_REPLY		129
100*4882a593Smuzhiyun #define ICMPV6_MGM_QUERY		130
101*4882a593Smuzhiyun #define ICMPV6_MGM_REPORT       	131
102*4882a593Smuzhiyun #define ICMPV6_MGM_REDUCTION    	132
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #define ICMPV6_NI_QUERY			139
105*4882a593Smuzhiyun #define ICMPV6_NI_REPLY			140
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #define ICMPV6_MLD2_REPORT		143
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun #define ICMPV6_DHAAD_REQUEST		144
110*4882a593Smuzhiyun #define ICMPV6_DHAAD_REPLY		145
111*4882a593Smuzhiyun #define ICMPV6_MOBILE_PREFIX_SOL	146
112*4882a593Smuzhiyun #define ICMPV6_MOBILE_PREFIX_ADV	147
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun #define ICMPV6_MRDISC_ADV		151
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define ICMPV6_MSG_MAX          255
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun /*
119*4882a593Smuzhiyun  *	Codes for Destination Unreachable
120*4882a593Smuzhiyun  */
121*4882a593Smuzhiyun #define ICMPV6_NOROUTE			0
122*4882a593Smuzhiyun #define ICMPV6_ADM_PROHIBITED		1
123*4882a593Smuzhiyun #define ICMPV6_NOT_NEIGHBOUR		2
124*4882a593Smuzhiyun #define ICMPV6_ADDR_UNREACH		3
125*4882a593Smuzhiyun #define ICMPV6_PORT_UNREACH		4
126*4882a593Smuzhiyun #define ICMPV6_POLICY_FAIL		5
127*4882a593Smuzhiyun #define ICMPV6_REJECT_ROUTE		6
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun /*
130*4882a593Smuzhiyun  *	Codes for Time Exceeded
131*4882a593Smuzhiyun  */
132*4882a593Smuzhiyun #define ICMPV6_EXC_HOPLIMIT		0
133*4882a593Smuzhiyun #define ICMPV6_EXC_FRAGTIME		1
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun /*
136*4882a593Smuzhiyun  *	Codes for Parameter Problem
137*4882a593Smuzhiyun  */
138*4882a593Smuzhiyun #define ICMPV6_HDR_FIELD		0
139*4882a593Smuzhiyun #define ICMPV6_UNK_NEXTHDR		1
140*4882a593Smuzhiyun #define ICMPV6_UNK_OPTION		2
141*4882a593Smuzhiyun #define ICMPV6_HDR_INCOMP		3
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /*
144*4882a593Smuzhiyun  *	constants for (set|get)sockopt
145*4882a593Smuzhiyun  */
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun #define ICMPV6_FILTER			1
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /*
150*4882a593Smuzhiyun  *	ICMPV6 filter
151*4882a593Smuzhiyun  */
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun #define ICMPV6_FILTER_BLOCK		1
154*4882a593Smuzhiyun #define ICMPV6_FILTER_PASS		2
155*4882a593Smuzhiyun #define ICMPV6_FILTER_BLOCKOTHERS	3
156*4882a593Smuzhiyun #define ICMPV6_FILTER_PASSONLY		4
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun struct icmp6_filter {
159*4882a593Smuzhiyun 	__u32		data[8];
160*4882a593Smuzhiyun };
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun /*
163*4882a593Smuzhiyun  *	Definitions for MLDv2
164*4882a593Smuzhiyun  */
165*4882a593Smuzhiyun #define MLD2_MODE_IS_INCLUDE	1
166*4882a593Smuzhiyun #define MLD2_MODE_IS_EXCLUDE	2
167*4882a593Smuzhiyun #define MLD2_CHANGE_TO_INCLUDE	3
168*4882a593Smuzhiyun #define MLD2_CHANGE_TO_EXCLUDE	4
169*4882a593Smuzhiyun #define MLD2_ALLOW_NEW_SOURCES	5
170*4882a593Smuzhiyun #define MLD2_BLOCK_OLD_SOURCES	6
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun #define MLD2_ALL_MCR_INIT { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x16 } } }
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #endif /* _UAPI_LINUX_ICMPV6_H */
176