1 #ifndef _NETINET_ICMP6_H
2 #define _NETINET_ICMP6_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include <stdint.h>
9 #include <string.h>
10 #include <sys/types.h>
11 #include <netinet/in.h>
12 
13 #define ICMP6_FILTER 1
14 
15 #define ICMP6_FILTER_BLOCK		1
16 #define ICMP6_FILTER_PASS		2
17 #define ICMP6_FILTER_BLOCKOTHERS	3
18 #define ICMP6_FILTER_PASSONLY		4
19 
20 struct icmp6_filter {
21 	uint32_t icmp6_filt[8];
22 };
23 
24 struct icmp6_hdr {
25 	uint8_t     icmp6_type;
26 	uint8_t     icmp6_code;
27 	uint16_t    icmp6_cksum;
28 	union {
29 		uint32_t  icmp6_un_data32[1];
30 		uint16_t  icmp6_un_data16[2];
31 		uint8_t   icmp6_un_data8[4];
32 	} icmp6_dataun;
33 };
34 
35 #define icmp6_data32    icmp6_dataun.icmp6_un_data32
36 #define icmp6_data16    icmp6_dataun.icmp6_un_data16
37 #define icmp6_data8     icmp6_dataun.icmp6_un_data8
38 #define icmp6_pptr      icmp6_data32[0]
39 #define icmp6_mtu       icmp6_data32[0]
40 #define icmp6_id        icmp6_data16[0]
41 #define icmp6_seq       icmp6_data16[1]
42 #define icmp6_maxdelay  icmp6_data16[0]
43 
44 #define ICMP6_DST_UNREACH             1
45 #define ICMP6_PACKET_TOO_BIG          2
46 #define ICMP6_TIME_EXCEEDED           3
47 #define ICMP6_PARAM_PROB              4
48 
49 #define ICMP6_INFOMSG_MASK  0x80
50 
51 #define ICMP6_ECHO_REQUEST          128
52 #define ICMP6_ECHO_REPLY            129
53 #define MLD_LISTENER_QUERY          130
54 #define MLD_LISTENER_REPORT         131
55 #define MLD_LISTENER_REDUCTION      132
56 
57 #define ICMP6_DST_UNREACH_NOROUTE     0
58 #define ICMP6_DST_UNREACH_ADMIN       1
59 #define ICMP6_DST_UNREACH_BEYONDSCOPE 2
60 #define ICMP6_DST_UNREACH_ADDR        3
61 #define ICMP6_DST_UNREACH_NOPORT      4
62 
63 #define ICMP6_TIME_EXCEED_TRANSIT     0
64 #define ICMP6_TIME_EXCEED_REASSEMBLY  1
65 
66 #define ICMP6_PARAMPROB_HEADER        0
67 #define ICMP6_PARAMPROB_NEXTHEADER    1
68 #define ICMP6_PARAMPROB_OPTION        2
69 
70 #define ICMP6_FILTER_WILLPASS(type, filterp) \
71 	((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0)
72 
73 #define ICMP6_FILTER_WILLBLOCK(type, filterp) \
74 	((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0)
75 
76 #define ICMP6_FILTER_SETPASS(type, filterp) \
77 	((((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31))))
78 
79 #define ICMP6_FILTER_SETBLOCK(type, filterp) \
80 	((((filterp)->icmp6_filt[(type) >> 5]) |=  (1 << ((type) & 31))))
81 
82 #define ICMP6_FILTER_SETPASSALL(filterp) \
83 	memset (filterp, 0, sizeof (struct icmp6_filter));
84 
85 #define ICMP6_FILTER_SETBLOCKALL(filterp) \
86 	memset (filterp, 0xFF, sizeof (struct icmp6_filter));
87 
88 #define ND_ROUTER_SOLICIT           133
89 #define ND_ROUTER_ADVERT            134
90 #define ND_NEIGHBOR_SOLICIT         135
91 #define ND_NEIGHBOR_ADVERT          136
92 #define ND_REDIRECT                 137
93 
94 struct nd_router_solicit {
95 	struct icmp6_hdr  nd_rs_hdr;
96 };
97 
98 #define nd_rs_type               nd_rs_hdr.icmp6_type
99 #define nd_rs_code               nd_rs_hdr.icmp6_code
100 #define nd_rs_cksum              nd_rs_hdr.icmp6_cksum
101 #define nd_rs_reserved           nd_rs_hdr.icmp6_data32[0]
102 
103 struct nd_router_advert {
104 	struct icmp6_hdr  nd_ra_hdr;
105 	uint32_t   nd_ra_reachable;
106 	uint32_t   nd_ra_retransmit;
107 };
108 
109 #define nd_ra_type               nd_ra_hdr.icmp6_type
110 #define nd_ra_code               nd_ra_hdr.icmp6_code
111 #define nd_ra_cksum              nd_ra_hdr.icmp6_cksum
112 #define nd_ra_curhoplimit        nd_ra_hdr.icmp6_data8[0]
113 #define nd_ra_flags_reserved     nd_ra_hdr.icmp6_data8[1]
114 #define ND_RA_FLAG_MANAGED       0x80
115 #define ND_RA_FLAG_OTHER         0x40
116 #define ND_RA_FLAG_HOME_AGENT    0x20
117 #define nd_ra_router_lifetime    nd_ra_hdr.icmp6_data16[1]
118 
119 struct nd_neighbor_solicit {
120 	struct icmp6_hdr  nd_ns_hdr;
121 	struct in6_addr   nd_ns_target;
122 };
123 
124 #define nd_ns_type               nd_ns_hdr.icmp6_type
125 #define nd_ns_code               nd_ns_hdr.icmp6_code
126 #define nd_ns_cksum              nd_ns_hdr.icmp6_cksum
127 #define nd_ns_reserved           nd_ns_hdr.icmp6_data32[0]
128 
129 struct nd_neighbor_advert {
130 	struct icmp6_hdr  nd_na_hdr;
131 	struct in6_addr   nd_na_target;
132 };
133 
134 #define nd_na_type               nd_na_hdr.icmp6_type
135 #define nd_na_code               nd_na_hdr.icmp6_code
136 #define nd_na_cksum              nd_na_hdr.icmp6_cksum
137 #define nd_na_flags_reserved     nd_na_hdr.icmp6_data32[0]
138 #if     __BYTE_ORDER == __BIG_ENDIAN
139 #define ND_NA_FLAG_ROUTER        0x80000000
140 #define ND_NA_FLAG_SOLICITED     0x40000000
141 #define ND_NA_FLAG_OVERRIDE      0x20000000
142 #else
143 #define ND_NA_FLAG_ROUTER        0x00000080
144 #define ND_NA_FLAG_SOLICITED     0x00000040
145 #define ND_NA_FLAG_OVERRIDE      0x00000020
146 #endif
147 
148 struct nd_redirect {
149 	struct icmp6_hdr  nd_rd_hdr;
150 	struct in6_addr   nd_rd_target;
151 	struct in6_addr   nd_rd_dst;
152 };
153 
154 #define nd_rd_type               nd_rd_hdr.icmp6_type
155 #define nd_rd_code               nd_rd_hdr.icmp6_code
156 #define nd_rd_cksum              nd_rd_hdr.icmp6_cksum
157 #define nd_rd_reserved           nd_rd_hdr.icmp6_data32[0]
158 
159 struct nd_opt_hdr {
160 	uint8_t  nd_opt_type;
161 	uint8_t  nd_opt_len;
162 };
163 
164 #define ND_OPT_SOURCE_LINKADDR		1
165 #define ND_OPT_TARGET_LINKADDR		2
166 #define ND_OPT_PREFIX_INFORMATION	3
167 #define ND_OPT_REDIRECTED_HEADER	4
168 #define ND_OPT_MTU			5
169 #define ND_OPT_RTR_ADV_INTERVAL		7
170 #define ND_OPT_HOME_AGENT_INFO		8
171 
172 struct nd_opt_prefix_info {
173 	uint8_t   nd_opt_pi_type;
174 	uint8_t   nd_opt_pi_len;
175 	uint8_t   nd_opt_pi_prefix_len;
176 	uint8_t   nd_opt_pi_flags_reserved;
177 	uint32_t  nd_opt_pi_valid_time;
178 	uint32_t  nd_opt_pi_preferred_time;
179 	uint32_t  nd_opt_pi_reserved2;
180 	struct in6_addr  nd_opt_pi_prefix;
181 };
182 
183 #define ND_OPT_PI_FLAG_ONLINK	0x80
184 #define ND_OPT_PI_FLAG_AUTO	0x40
185 #define ND_OPT_PI_FLAG_RADDR	0x20
186 
187 struct nd_opt_rd_hdr {
188 	uint8_t   nd_opt_rh_type;
189 	uint8_t   nd_opt_rh_len;
190 	uint16_t  nd_opt_rh_reserved1;
191 	uint32_t  nd_opt_rh_reserved2;
192 };
193 
194 struct nd_opt_mtu {
195 	uint8_t   nd_opt_mtu_type;
196 	uint8_t   nd_opt_mtu_len;
197 	uint16_t  nd_opt_mtu_reserved;
198 	uint32_t  nd_opt_mtu_mtu;
199 };
200 
201 struct mld_hdr {
202 	struct icmp6_hdr    mld_icmp6_hdr;
203 	struct in6_addr     mld_addr;
204 };
205 
206 #define mld_type        mld_icmp6_hdr.icmp6_type
207 #define mld_code        mld_icmp6_hdr.icmp6_code
208 #define mld_cksum       mld_icmp6_hdr.icmp6_cksum
209 #define mld_maxdelay    mld_icmp6_hdr.icmp6_data16[0]
210 #define mld_reserved    mld_icmp6_hdr.icmp6_data16[1]
211 
212 #define ICMP6_ROUTER_RENUMBERING    138
213 
214 struct icmp6_router_renum {
215 	struct icmp6_hdr    rr_hdr;
216 	uint8_t             rr_segnum;
217 	uint8_t             rr_flags;
218 	uint16_t            rr_maxdelay;
219 	uint32_t            rr_reserved;
220 };
221 
222 #define rr_type		rr_hdr.icmp6_type
223 #define rr_code         rr_hdr.icmp6_code
224 #define rr_cksum        rr_hdr.icmp6_cksum
225 #define rr_seqnum       rr_hdr.icmp6_data32[0]
226 
227 #define ICMP6_RR_FLAGS_TEST             0x80
228 #define ICMP6_RR_FLAGS_REQRESULT        0x40
229 #define ICMP6_RR_FLAGS_FORCEAPPLY       0x20
230 #define ICMP6_RR_FLAGS_SPECSITE         0x10
231 #define ICMP6_RR_FLAGS_PREVDONE         0x08
232 
233 struct rr_pco_match {
234 	uint8_t             rpm_code;
235 	uint8_t             rpm_len;
236 	uint8_t             rpm_ordinal;
237 	uint8_t             rpm_matchlen;
238 	uint8_t             rpm_minlen;
239 	uint8_t             rpm_maxlen;
240 	uint16_t            rpm_reserved;
241 	struct in6_addr     rpm_prefix;
242 };
243 
244 #define RPM_PCO_ADD             1
245 #define RPM_PCO_CHANGE          2
246 #define RPM_PCO_SETGLOBAL       3
247 
248 struct rr_pco_use {
249 	uint8_t             rpu_uselen;
250 	uint8_t             rpu_keeplen;
251 	uint8_t             rpu_ramask;
252 	uint8_t             rpu_raflags;
253 	uint32_t            rpu_vltime;
254 	uint32_t            rpu_pltime;
255 	uint32_t            rpu_flags;
256 	struct in6_addr     rpu_prefix;
257 };
258 
259 #define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK  0x20
260 #define ICMP6_RR_PCOUSE_RAFLAGS_AUTO    0x10
261 
262 #if __BYTE_ORDER == __BIG_ENDIAN
263 #define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80000000
264 #define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40000000
265 #else
266 #define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80
267 #define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40
268 #endif
269 
270 struct rr_result {
271 	uint16_t            rrr_flags;
272 	uint8_t             rrr_ordinal;
273 	uint8_t             rrr_matchedlen;
274 	uint32_t            rrr_ifid;
275 	struct in6_addr     rrr_prefix;
276 };
277 
278 #if __BYTE_ORDER == __BIG_ENDIAN
279 #define ICMP6_RR_RESULT_FLAGS_OOB       0x0002
280 #define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0001
281 #else
282 #define ICMP6_RR_RESULT_FLAGS_OOB       0x0200
283 #define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0100
284 #endif
285 
286 struct nd_opt_adv_interval {
287 	uint8_t   nd_opt_adv_interval_type;
288 	uint8_t   nd_opt_adv_interval_len;
289 	uint16_t  nd_opt_adv_interval_reserved;
290 	uint32_t  nd_opt_adv_interval_ival;
291 };
292 
293 struct nd_opt_home_agent_info {
294 	uint8_t   nd_opt_home_agent_info_type;
295 	uint8_t   nd_opt_home_agent_info_len;
296 	uint16_t  nd_opt_home_agent_info_reserved;
297 	uint16_t  nd_opt_home_agent_info_preference;
298 	uint16_t  nd_opt_home_agent_info_lifetime;
299 };
300 
301 #ifdef __cplusplus
302 }
303 #endif
304 
305 #endif
306