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