1#ifndef _NETINET_ICMP6_H
2#define _NETINET_ICMP6_H
3
4#ifdef __cplusplus
5extern "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
20struct icmp6_filter {
21	uint32_t icmp6_filt[8];
22};
23
24struct 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
94struct 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
103struct 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
119struct 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
129struct 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
148struct 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
159struct 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
172struct 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
187struct 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
194struct 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
201struct 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
214struct 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
233struct 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
248struct 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
270struct 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
286struct 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
293struct 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