root / lab4 / .minix-src / include / netinet / icmp6.h @ 13
History | View | Annotate | Download (26.1 KB)
1 |
/* $NetBSD: icmp6.h,v 1.47 2013/07/01 12:43:15 christos Exp $ */
|
---|---|
2 |
/* $KAME: icmp6.h,v 1.84 2003/04/23 10:26:51 itojun Exp $ */
|
3 |
|
4 |
|
5 |
/*
|
6 |
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
7 |
* All rights reserved.
|
8 |
*
|
9 |
* Redistribution and use in source and binary forms, with or without
|
10 |
* modification, are permitted provided that the following conditions
|
11 |
* are met:
|
12 |
* 1. Redistributions of source code must retain the above copyright
|
13 |
* notice, this list of conditions and the following disclaimer.
|
14 |
* 2. Redistributions in binary form must reproduce the above copyright
|
15 |
* notice, this list of conditions and the following disclaimer in the
|
16 |
* documentation and/or other materials provided with the distribution.
|
17 |
* 3. Neither the name of the project nor the names of its contributors
|
18 |
* may be used to endorse or promote products derived from this software
|
19 |
* without specific prior written permission.
|
20 |
*
|
21 |
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
22 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
23 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
24 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
25 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
26 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
27 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
28 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
29 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
30 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
31 |
* SUCH DAMAGE.
|
32 |
*/
|
33 |
|
34 |
/*
|
35 |
* Copyright (c) 1982, 1986, 1993
|
36 |
* The Regents of the University of California. All rights reserved.
|
37 |
*
|
38 |
* Redistribution and use in source and binary forms, with or without
|
39 |
* modification, are permitted provided that the following conditions
|
40 |
* are met:
|
41 |
* 1. Redistributions of source code must retain the above copyright
|
42 |
* notice, this list of conditions and the following disclaimer.
|
43 |
* 2. Redistributions in binary form must reproduce the above copyright
|
44 |
* notice, this list of conditions and the following disclaimer in the
|
45 |
* documentation and/or other materials provided with the distribution.
|
46 |
* 3. Neither the name of the University nor the names of its contributors
|
47 |
* may be used to endorse or promote products derived from this software
|
48 |
* without specific prior written permission.
|
49 |
*
|
50 |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
51 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
52 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
53 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
54 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
55 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
56 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
57 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
58 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
59 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
60 |
* SUCH DAMAGE.
|
61 |
*
|
62 |
* @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93
|
63 |
*/
|
64 |
|
65 |
#ifndef _NETINET_ICMP6_H_
|
66 |
#define _NETINET_ICMP6_H_
|
67 |
|
68 |
#define ICMPV6_PLD_MAXLEN 1232 /* IPV6_MMTU - sizeof(struct ip6_hdr) |
69 |
- sizeof(struct icmp6_hdr) */
|
70 |
|
71 |
struct icmp6_hdr {
|
72 |
u_int8_t icmp6_type; /* type field */
|
73 |
u_int8_t icmp6_code; /* code field */
|
74 |
u_int16_t icmp6_cksum; /* checksum field */
|
75 |
union {
|
76 |
u_int32_t icmp6_un_data32[1]; /* type-specific field */ |
77 |
u_int16_t icmp6_un_data16[2]; /* type-specific field */ |
78 |
u_int8_t icmp6_un_data8[4]; /* type-specific field */ |
79 |
} icmp6_dataun; |
80 |
} __packed; |
81 |
|
82 |
#define icmp6_data32 icmp6_dataun.icmp6_un_data32
|
83 |
#define icmp6_data16 icmp6_dataun.icmp6_un_data16
|
84 |
#define icmp6_data8 icmp6_dataun.icmp6_un_data8
|
85 |
#define icmp6_pptr icmp6_data32[0] /* parameter prob */ |
86 |
#define icmp6_mtu icmp6_data32[0] /* packet too big */ |
87 |
#define icmp6_id icmp6_data16[0] /* echo request/reply */ |
88 |
#define icmp6_seq icmp6_data16[1] /* echo request/reply */ |
89 |
#define icmp6_maxdelay icmp6_data16[0] /* mcast group membership */ |
90 |
|
91 |
#define ICMP6_DST_UNREACH 1 /* dest unreachable, codes: */ |
92 |
#define ICMP6_PACKET_TOO_BIG 2 /* packet too big */ |
93 |
#define ICMP6_TIME_EXCEEDED 3 /* time exceeded, code: */ |
94 |
#define ICMP6_PARAM_PROB 4 /* ip6 header bad */ |
95 |
|
96 |
#define ICMP6_ECHO_REQUEST 128 /* echo service */ |
97 |
#define ICMP6_ECHO_REPLY 129 /* echo reply */ |
98 |
#define MLD_LISTENER_QUERY 130 /* multicast listener query */ |
99 |
#define MLD_LISTENER_REPORT 131 /* multicast listener report */ |
100 |
#define MLD_LISTENER_DONE 132 /* multicast listener done */ |
101 |
#define MLD_LISTENER_REDUCTION MLD_LISTENER_DONE /* RFC3542 definition */ |
102 |
|
103 |
/* RFC2292 decls */
|
104 |
#define ICMP6_MEMBERSHIP_QUERY 130 /* group membership query */ |
105 |
#define ICMP6_MEMBERSHIP_REPORT 131 /* group membership report */ |
106 |
#define ICMP6_MEMBERSHIP_REDUCTION 132 /* group membership termination */ |
107 |
|
108 |
#ifndef _KERNEL
|
109 |
/* the followings are for backward compatibility to old KAME apps. */
|
110 |
#define MLD6_LISTENER_QUERY MLD_LISTENER_QUERY
|
111 |
#define MLD6_LISTENER_REPORT MLD_LISTENER_REPORT
|
112 |
#define MLD6_LISTENER_DONE MLD_LISTENER_DONE
|
113 |
#endif
|
114 |
|
115 |
#define ND_ROUTER_SOLICIT 133 /* router solicitation */ |
116 |
#define ND_ROUTER_ADVERT 134 /* router advertisement */ |
117 |
#define ND_NEIGHBOR_SOLICIT 135 /* neighbor solicitation */ |
118 |
#define ND_NEIGHBOR_ADVERT 136 /* neighbor advertisement */ |
119 |
#define ND_REDIRECT 137 /* redirect */ |
120 |
|
121 |
#define ICMP6_ROUTER_RENUMBERING 138 /* router renumbering */ |
122 |
|
123 |
#define ICMP6_WRUREQUEST 139 /* who are you request */ |
124 |
#define ICMP6_WRUREPLY 140 /* who are you reply */ |
125 |
#define ICMP6_FQDN_QUERY 139 /* FQDN query */ |
126 |
#define ICMP6_FQDN_REPLY 140 /* FQDN reply */ |
127 |
#define ICMP6_NI_QUERY 139 /* node information request */ |
128 |
#define ICMP6_NI_REPLY 140 /* node information reply */ |
129 |
#define MLDV2_LISTENER_REPORT 143 /* RFC3810 listener report */ |
130 |
|
131 |
/* The definitions below are experimental. TBA */
|
132 |
#define MLD_MTRACE_RESP 200 /* mtrace response(to sender) */ |
133 |
#define MLD_MTRACE 201 /* mtrace messages */ |
134 |
|
135 |
#ifndef _KERNEL
|
136 |
/* the followings are for backward compatibility to old KAME apps. */
|
137 |
#define MLD6_MTRACE_RESP MLD_MTRACE_RESP
|
138 |
#define MLD6_MTRACE MLD_MTRACE
|
139 |
#endif
|
140 |
|
141 |
#define ICMP6_MAXTYPE 201 |
142 |
|
143 |
#define ICMP6_DST_UNREACH_NOROUTE 0 /* no route to destination */ |
144 |
#define ICMP6_DST_UNREACH_ADMIN 1 /* administratively prohibited */ |
145 |
#define ICMP6_DST_UNREACH_NOTNEIGHBOR 2 /* not a neighbor(obsolete) */ |
146 |
#define ICMP6_DST_UNREACH_BEYONDSCOPE 2 /* beyond scope of source address */ |
147 |
#define ICMP6_DST_UNREACH_ADDR 3 /* address unreachable */ |
148 |
#define ICMP6_DST_UNREACH_NOPORT 4 /* port unreachable */ |
149 |
#define ICMP6_DST_UNREACH_POLICY 5 /* source address failed ingress/egress policy */ |
150 |
#define ICMP6_DST_UNREACH_REJROUTE 6 /* reject route to destination */ |
151 |
#define ICMP6_DST_UNREACH_SOURCERT 7 /* error in source routing header */ |
152 |
|
153 |
#define ICMP6_TIME_EXCEED_TRANSIT 0 /* ttl==0 in transit */ |
154 |
#define ICMP6_TIME_EXCEED_REASSEMBLY 1 /* ttl==0 in reass */ |
155 |
|
156 |
#define ICMP6_PARAMPROB_HEADER 0 /* erroneous header field */ |
157 |
#define ICMP6_PARAMPROB_NEXTHEADER 1 /* unrecognized next header */ |
158 |
#define ICMP6_PARAMPROB_OPTION 2 /* unrecognized option */ |
159 |
|
160 |
#define ICMP6_INFOMSG_MASK 0x80 /* all informational messages */ |
161 |
|
162 |
#define ICMP6_NI_SUBJ_IPV6 0 /* Query Subject is an IPv6 address */ |
163 |
#define ICMP6_NI_SUBJ_FQDN 1 /* Query Subject is a Domain name */ |
164 |
#define ICMP6_NI_SUBJ_IPV4 2 /* Query Subject is an IPv4 address */ |
165 |
|
166 |
#define ICMP6_NI_SUCCESS 0 /* node information successful reply */ |
167 |
#define ICMP6_NI_REFUSED 1 /* node information request is refused */ |
168 |
#define ICMP6_NI_UNKNOWN 2 /* unknown Qtype */ |
169 |
|
170 |
#define ICMP6_ROUTER_RENUMBERING_COMMAND 0 /* rr command */ |
171 |
#define ICMP6_ROUTER_RENUMBERING_RESULT 1 /* rr result */ |
172 |
#define ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET 255 /* rr seq num reset */ |
173 |
|
174 |
/* Used in kernel only */
|
175 |
#define ND_REDIRECT_ONLINK 0 /* redirect to an on-link node */ |
176 |
#define ND_REDIRECT_ROUTER 1 /* redirect to a better router */ |
177 |
|
178 |
/*
|
179 |
* Multicast Listener Discovery
|
180 |
*/
|
181 |
struct mld_hdr {
|
182 |
struct icmp6_hdr mld_icmp6_hdr;
|
183 |
struct in6_addr mld_addr; /* multicast address */ |
184 |
} __packed; |
185 |
|
186 |
/* definitions to provide backward compatibility to old KAME applications */
|
187 |
#ifndef _KERNEL
|
188 |
#define mld6_hdr mld_hdr
|
189 |
#define mld6_type mld_type
|
190 |
#define mld6_code mld_code
|
191 |
#define mld6_cksum mld_cksum
|
192 |
#define mld6_maxdelay mld_maxdelay
|
193 |
#define mld6_reserved mld_reserved
|
194 |
#define mld6_addr mld_addr
|
195 |
#endif
|
196 |
|
197 |
/* shortcut macro definitions */
|
198 |
#define mld_type mld_icmp6_hdr.icmp6_type
|
199 |
#define mld_code mld_icmp6_hdr.icmp6_code
|
200 |
#define mld_cksum mld_icmp6_hdr.icmp6_cksum
|
201 |
#define mld_maxdelay mld_icmp6_hdr.icmp6_data16[0] |
202 |
#define mld_reserved mld_icmp6_hdr.icmp6_data16[1] |
203 |
|
204 |
#define MLD_MINLEN 24 |
205 |
|
206 |
/*
|
207 |
* Neighbor Discovery
|
208 |
*/
|
209 |
|
210 |
struct nd_router_solicit { /* router solicitation */ |
211 |
struct icmp6_hdr nd_rs_hdr;
|
212 |
/* could be followed by options */
|
213 |
} __packed; |
214 |
|
215 |
#define nd_rs_type nd_rs_hdr.icmp6_type
|
216 |
#define nd_rs_code nd_rs_hdr.icmp6_code
|
217 |
#define nd_rs_cksum nd_rs_hdr.icmp6_cksum
|
218 |
#define nd_rs_reserved nd_rs_hdr.icmp6_data32[0] |
219 |
|
220 |
struct nd_router_advert { /* router advertisement */ |
221 |
struct icmp6_hdr nd_ra_hdr;
|
222 |
u_int32_t nd_ra_reachable; /* reachable time */
|
223 |
u_int32_t nd_ra_retransmit; /* retransmit timer */
|
224 |
/* could be followed by options */
|
225 |
} __packed; |
226 |
|
227 |
#define nd_ra_type nd_ra_hdr.icmp6_type
|
228 |
#define nd_ra_code nd_ra_hdr.icmp6_code
|
229 |
#define nd_ra_cksum nd_ra_hdr.icmp6_cksum
|
230 |
#define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0] |
231 |
#define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1] |
232 |
#define ND_RA_FLAG_MANAGED 0x80 |
233 |
#define ND_RA_FLAG_OTHER 0x40 |
234 |
#define ND_RA_FLAG_HOME_AGENT 0x20 |
235 |
|
236 |
/*
|
237 |
* Router preference values based on RFC4191.
|
238 |
*/
|
239 |
#define ND_RA_FLAG_RTPREF_MASK 0x18 /* 00011000 */ |
240 |
|
241 |
#define ND_RA_FLAG_RTPREF_HIGH 0x08 /* 00001000 */ |
242 |
#define ND_RA_FLAG_RTPREF_MEDIUM 0x00 /* 00000000 */ |
243 |
#define ND_RA_FLAG_RTPREF_LOW 0x18 /* 00011000 */ |
244 |
#define ND_RA_FLAG_RTPREF_RSV 0x10 /* 00010000 */ |
245 |
|
246 |
#define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1] |
247 |
|
248 |
struct nd_neighbor_solicit { /* neighbor solicitation */ |
249 |
struct icmp6_hdr nd_ns_hdr;
|
250 |
struct in6_addr nd_ns_target; /*target address */ |
251 |
/* could be followed by options */
|
252 |
} __packed; |
253 |
|
254 |
#define nd_ns_type nd_ns_hdr.icmp6_type
|
255 |
#define nd_ns_code nd_ns_hdr.icmp6_code
|
256 |
#define nd_ns_cksum nd_ns_hdr.icmp6_cksum
|
257 |
#define nd_ns_reserved nd_ns_hdr.icmp6_data32[0] |
258 |
|
259 |
struct nd_neighbor_advert { /* neighbor advertisement */ |
260 |
struct icmp6_hdr nd_na_hdr;
|
261 |
struct in6_addr nd_na_target; /* target address */ |
262 |
/* could be followed by options */
|
263 |
} __packed; |
264 |
|
265 |
#define nd_na_type nd_na_hdr.icmp6_type
|
266 |
#define nd_na_code nd_na_hdr.icmp6_code
|
267 |
#define nd_na_cksum nd_na_hdr.icmp6_cksum
|
268 |
#define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0] |
269 |
#if BYTE_ORDER == BIG_ENDIAN
|
270 |
#define ND_NA_FLAG_ROUTER 0x80000000 |
271 |
#define ND_NA_FLAG_SOLICITED 0x40000000 |
272 |
#define ND_NA_FLAG_OVERRIDE 0x20000000 |
273 |
#else
|
274 |
#if BYTE_ORDER == LITTLE_ENDIAN
|
275 |
#define ND_NA_FLAG_ROUTER 0x80 |
276 |
#define ND_NA_FLAG_SOLICITED 0x40 |
277 |
#define ND_NA_FLAG_OVERRIDE 0x20 |
278 |
#endif
|
279 |
#endif
|
280 |
|
281 |
struct nd_redirect { /* redirect */ |
282 |
struct icmp6_hdr nd_rd_hdr;
|
283 |
struct in6_addr nd_rd_target; /* target address */ |
284 |
struct in6_addr nd_rd_dst; /* destination address */ |
285 |
/* could be followed by options */
|
286 |
} __packed; |
287 |
|
288 |
#define nd_rd_type nd_rd_hdr.icmp6_type
|
289 |
#define nd_rd_code nd_rd_hdr.icmp6_code
|
290 |
#define nd_rd_cksum nd_rd_hdr.icmp6_cksum
|
291 |
#define nd_rd_reserved nd_rd_hdr.icmp6_data32[0] |
292 |
|
293 |
struct nd_opt_hdr { /* Neighbor discovery option header */ |
294 |
u_int8_t nd_opt_type; |
295 |
u_int8_t nd_opt_len; |
296 |
/* followed by option specific data*/
|
297 |
} __packed; |
298 |
|
299 |
#define ND_OPT_SOURCE_LINKADDR 1 |
300 |
#define ND_OPT_TARGET_LINKADDR 2 |
301 |
#define ND_OPT_PREFIX_INFORMATION 3 |
302 |
#define ND_OPT_REDIRECTED_HEADER 4 |
303 |
#define ND_OPT_MTU 5 |
304 |
#define ND_OPT_ADVINTERVAL 7 |
305 |
#define ND_OPT_HOMEAGENT_INFO 8 |
306 |
#define ND_OPT_SOURCE_ADDRLIST 9 |
307 |
#define ND_OPT_TARGET_ADDRLIST 10 |
308 |
#define ND_OPT_MAP 23 /* RFC 5380 */ |
309 |
#define ND_OPT_ROUTE_INFO 24 /* RFC 4191 */ |
310 |
#define ND_OPT_RDNSS 25 /* RFC 6016 */ |
311 |
#define ND_OPT_DNSSL 31 /* RFC 6016 */ |
312 |
|
313 |
struct nd_opt_route_info { /* route info */ |
314 |
u_int8_t nd_opt_rti_type; |
315 |
u_int8_t nd_opt_rti_len; |
316 |
u_int8_t nd_opt_rti_prefixlen; |
317 |
u_int8_t nd_opt_rti_flags; |
318 |
u_int32_t nd_opt_rti_lifetime; |
319 |
/* prefix follows */
|
320 |
}; |
321 |
|
322 |
struct nd_opt_prefix_info { /* prefix information */ |
323 |
u_int8_t nd_opt_pi_type; |
324 |
u_int8_t nd_opt_pi_len; |
325 |
u_int8_t nd_opt_pi_prefix_len; |
326 |
u_int8_t nd_opt_pi_flags_reserved; |
327 |
u_int32_t nd_opt_pi_valid_time; |
328 |
u_int32_t nd_opt_pi_preferred_time; |
329 |
u_int32_t nd_opt_pi_reserved2; |
330 |
struct in6_addr nd_opt_pi_prefix;
|
331 |
} __packed; |
332 |
|
333 |
#define ND_OPT_PI_FLAG_ONLINK 0x80 |
334 |
#define ND_OPT_PI_FLAG_AUTO 0x40 |
335 |
|
336 |
struct nd_opt_rd_hdr { /* redirected header */ |
337 |
u_int8_t nd_opt_rh_type; |
338 |
u_int8_t nd_opt_rh_len; |
339 |
u_int16_t nd_opt_rh_reserved1; |
340 |
u_int32_t nd_opt_rh_reserved2; |
341 |
/* followed by IP header and data */
|
342 |
} __packed; |
343 |
|
344 |
struct nd_opt_mtu { /* MTU option */ |
345 |
u_int8_t nd_opt_mtu_type; |
346 |
u_int8_t nd_opt_mtu_len; |
347 |
u_int16_t nd_opt_mtu_reserved; |
348 |
u_int32_t nd_opt_mtu_mtu; |
349 |
} __packed; |
350 |
|
351 |
struct nd_opt_rdnss { /* RDNSS option RFC 6106 */ |
352 |
u_int8_t nd_opt_rdnss_type; |
353 |
u_int8_t nd_opt_rdnss_len; |
354 |
u_int16_t nd_opt_rdnss_reserved; |
355 |
u_int32_t nd_opt_rdnss_lifetime; |
356 |
/* followed by list of IP prefixes */
|
357 |
} __packed; |
358 |
|
359 |
struct nd_opt_dnssl { /* DNSSL option RFC 6106 */ |
360 |
u_int8_t nd_opt_dnssl_type; |
361 |
u_int8_t nd_opt_dnssl_len; |
362 |
u_int16_t nd_opt_dnssl_reserved; |
363 |
u_int32_t nd_opt_dnssl_lifetime; |
364 |
/* followed by list of IP prefixes */
|
365 |
} __packed; |
366 |
|
367 |
/*
|
368 |
* icmp6 namelookup
|
369 |
*/
|
370 |
|
371 |
struct icmp6_namelookup {
|
372 |
struct icmp6_hdr icmp6_nl_hdr;
|
373 |
u_int8_t icmp6_nl_nonce[8];
|
374 |
int32_t icmp6_nl_ttl; |
375 |
#if 0
|
376 |
u_int8_t icmp6_nl_len;
|
377 |
u_int8_t icmp6_nl_name[3];
|
378 |
#endif
|
379 |
/* could be followed by options */
|
380 |
} __packed; |
381 |
|
382 |
/*
|
383 |
* icmp6 node information
|
384 |
*/
|
385 |
struct icmp6_nodeinfo {
|
386 |
struct icmp6_hdr icmp6_ni_hdr;
|
387 |
u_int8_t icmp6_ni_nonce[8];
|
388 |
/* could be followed by reply data */
|
389 |
} __packed; |
390 |
|
391 |
#define ni_type icmp6_ni_hdr.icmp6_type
|
392 |
#define ni_code icmp6_ni_hdr.icmp6_code
|
393 |
#define ni_cksum icmp6_ni_hdr.icmp6_cksum
|
394 |
#define ni_qtype icmp6_ni_hdr.icmp6_data16[0] |
395 |
#define ni_flags icmp6_ni_hdr.icmp6_data16[1] |
396 |
|
397 |
#define NI_QTYPE_NOOP 0 /* NOOP */ |
398 |
#define NI_QTYPE_SUPTYPES 1 /* Supported Qtypes */ |
399 |
#define NI_QTYPE_FQDN 2 /* FQDN (draft 04) */ |
400 |
#define NI_QTYPE_DNSNAME 2 /* DNS Name */ |
401 |
#define NI_QTYPE_NODEADDR 3 /* Node Addresses */ |
402 |
#define NI_QTYPE_IPV4ADDR 4 /* IPv4 Addresses */ |
403 |
|
404 |
#if BYTE_ORDER == BIG_ENDIAN
|
405 |
#define NI_SUPTYPE_FLAG_COMPRESS 0x1 |
406 |
#define NI_FQDN_FLAG_VALIDTTL 0x1 |
407 |
#elif BYTE_ORDER == LITTLE_ENDIAN
|
408 |
#define NI_SUPTYPE_FLAG_COMPRESS 0x0100 |
409 |
#define NI_FQDN_FLAG_VALIDTTL 0x0100 |
410 |
#endif
|
411 |
|
412 |
#ifdef NAME_LOOKUPS_04
|
413 |
#if BYTE_ORDER == BIG_ENDIAN
|
414 |
#define NI_NODEADDR_FLAG_LINKLOCAL 0x1 |
415 |
#define NI_NODEADDR_FLAG_SITELOCAL 0x2 |
416 |
#define NI_NODEADDR_FLAG_GLOBAL 0x4 |
417 |
#define NI_NODEADDR_FLAG_ALL 0x8 |
418 |
#define NI_NODEADDR_FLAG_TRUNCATE 0x10 |
419 |
#define NI_NODEADDR_FLAG_ANYCAST 0x20 /* just experimental. not in spec */ |
420 |
#elif BYTE_ORDER == LITTLE_ENDIAN
|
421 |
#define NI_NODEADDR_FLAG_LINKLOCAL 0x0100 |
422 |
#define NI_NODEADDR_FLAG_SITELOCAL 0x0200 |
423 |
#define NI_NODEADDR_FLAG_GLOBAL 0x0400 |
424 |
#define NI_NODEADDR_FLAG_ALL 0x0800 |
425 |
#define NI_NODEADDR_FLAG_TRUNCATE 0x1000 |
426 |
#define NI_NODEADDR_FLAG_ANYCAST 0x2000 /* just experimental. not in spec */ |
427 |
#endif
|
428 |
#else /* draft-ietf-ipngwg-icmp-name-lookups-05 (and later?) */ |
429 |
#if BYTE_ORDER == BIG_ENDIAN
|
430 |
#define NI_NODEADDR_FLAG_TRUNCATE 0x1 |
431 |
#define NI_NODEADDR_FLAG_ALL 0x2 |
432 |
#define NI_NODEADDR_FLAG_COMPAT 0x4 |
433 |
#define NI_NODEADDR_FLAG_LINKLOCAL 0x8 |
434 |
#define NI_NODEADDR_FLAG_SITELOCAL 0x10 |
435 |
#define NI_NODEADDR_FLAG_GLOBAL 0x20 |
436 |
#define NI_NODEADDR_FLAG_ANYCAST 0x40 /* just experimental. not in spec */ |
437 |
#elif BYTE_ORDER == LITTLE_ENDIAN
|
438 |
#define NI_NODEADDR_FLAG_TRUNCATE 0x0100 |
439 |
#define NI_NODEADDR_FLAG_ALL 0x0200 |
440 |
#define NI_NODEADDR_FLAG_COMPAT 0x0400 |
441 |
#define NI_NODEADDR_FLAG_LINKLOCAL 0x0800 |
442 |
#define NI_NODEADDR_FLAG_SITELOCAL 0x1000 |
443 |
#define NI_NODEADDR_FLAG_GLOBAL 0x2000 |
444 |
#define NI_NODEADDR_FLAG_ANYCAST 0x4000 /* just experimental. not in spec */ |
445 |
#endif
|
446 |
#endif
|
447 |
|
448 |
struct ni_reply_fqdn {
|
449 |
u_int32_t ni_fqdn_ttl; /* TTL */
|
450 |
u_int8_t ni_fqdn_namelen; /* length in octets of the FQDN */
|
451 |
u_int8_t ni_fqdn_name[3]; /* XXX: alignment */ |
452 |
} __packed; |
453 |
|
454 |
/*
|
455 |
* Router Renumbering. as router-renum-08.txt
|
456 |
*/
|
457 |
struct icmp6_router_renum { /* router renumbering header */ |
458 |
struct icmp6_hdr rr_hdr;
|
459 |
u_int8_t rr_segnum; |
460 |
u_int8_t rr_flags; |
461 |
u_int16_t rr_maxdelay; |
462 |
u_int32_t rr_reserved; |
463 |
} __packed; |
464 |
|
465 |
#define ICMP6_RR_FLAGS_TEST 0x80 |
466 |
#define ICMP6_RR_FLAGS_REQRESULT 0x40 |
467 |
#define ICMP6_RR_FLAGS_FORCEAPPLY 0x20 |
468 |
#define ICMP6_RR_FLAGS_SPECSITE 0x10 |
469 |
#define ICMP6_RR_FLAGS_PREVDONE 0x08 |
470 |
|
471 |
#define rr_type rr_hdr.icmp6_type
|
472 |
#define rr_code rr_hdr.icmp6_code
|
473 |
#define rr_cksum rr_hdr.icmp6_cksum
|
474 |
#define rr_seqnum rr_hdr.icmp6_data32[0] |
475 |
|
476 |
struct rr_pco_match { /* match prefix part */ |
477 |
u_int8_t rpm_code; |
478 |
u_int8_t rpm_len; |
479 |
u_int8_t rpm_ordinal; |
480 |
u_int8_t rpm_matchlen; |
481 |
u_int8_t rpm_minlen; |
482 |
u_int8_t rpm_maxlen; |
483 |
u_int16_t rpm_reserved; |
484 |
struct in6_addr rpm_prefix;
|
485 |
} __packed; |
486 |
|
487 |
#define RPM_PCO_ADD 1 |
488 |
#define RPM_PCO_CHANGE 2 |
489 |
#define RPM_PCO_SETGLOBAL 3 |
490 |
#define RPM_PCO_MAX 4 |
491 |
|
492 |
struct rr_pco_use { /* use prefix part */ |
493 |
u_int8_t rpu_uselen; |
494 |
u_int8_t rpu_keeplen; |
495 |
u_int8_t rpu_ramask; |
496 |
u_int8_t rpu_raflags; |
497 |
u_int32_t rpu_vltime; |
498 |
u_int32_t rpu_pltime; |
499 |
u_int32_t rpu_flags; |
500 |
struct in6_addr rpu_prefix;
|
501 |
} __packed; |
502 |
#define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x80 |
503 |
#define ICMP6_RR_PCOUSE_RAFLAGS_AUTO 0x40 |
504 |
|
505 |
#if BYTE_ORDER == BIG_ENDIAN
|
506 |
#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80000000 |
507 |
#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40000000 |
508 |
#elif BYTE_ORDER == LITTLE_ENDIAN
|
509 |
#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80 |
510 |
#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40 |
511 |
#endif
|
512 |
|
513 |
struct rr_result { /* router renumbering result message */ |
514 |
u_int16_t rrr_flags; |
515 |
u_int8_t rrr_ordinal; |
516 |
u_int8_t rrr_matchedlen; |
517 |
u_int32_t rrr_ifid; |
518 |
struct in6_addr rrr_prefix;
|
519 |
} __packed; |
520 |
#if BYTE_ORDER == BIG_ENDIAN
|
521 |
#define ICMP6_RR_RESULT_FLAGS_OOB 0x0002 |
522 |
#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0001 |
523 |
#elif BYTE_ORDER == LITTLE_ENDIAN
|
524 |
#define ICMP6_RR_RESULT_FLAGS_OOB 0x0200 |
525 |
#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0100 |
526 |
#endif
|
527 |
|
528 |
/*
|
529 |
* icmp6 filter structures.
|
530 |
*/
|
531 |
|
532 |
struct icmp6_filter {
|
533 |
u_int32_t icmp6_filt[8];
|
534 |
}; |
535 |
|
536 |
#define ICMP6_FILTER_SETPASSALL(filterp) \
|
537 |
(void)memset(filterp, 0xff, sizeof(struct icmp6_filter)) |
538 |
#define ICMP6_FILTER_SETBLOCKALL(filterp) \
|
539 |
(void)memset(filterp, 0x00, sizeof(struct icmp6_filter)) |
540 |
#define ICMP6_FILTER_SETPASS(type, filterp) \
|
541 |
(((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type) & 31))) |
542 |
#define ICMP6_FILTER_SETBLOCK(type, filterp) \
|
543 |
(((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31))) |
544 |
#define ICMP6_FILTER_WILLPASS(type, filterp) \
|
545 |
((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0) |
546 |
#define ICMP6_FILTER_WILLBLOCK(type, filterp) \
|
547 |
((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0) |
548 |
|
549 |
/*
|
550 |
* Variables related to this implementation
|
551 |
* of the internet control message protocol version 6.
|
552 |
*/
|
553 |
|
554 |
/*
|
555 |
* IPv6 ICMP statistics.
|
556 |
* Each counter is an unsigned 64-bit value.
|
557 |
*/
|
558 |
#define ICMP6_STAT_ERROR 0 /* # of calls to icmp6_error */ |
559 |
#define ICMP6_STAT_CANTERROR 1 /* no error (old was icmp) */ |
560 |
#define ICMP6_STAT_TOOFREQ 2 /* no error (rate limitation) */ |
561 |
#define ICMP6_STAT_OUTHIST 3 /* # of output messages */ |
562 |
/* space for 256 counters */
|
563 |
#define ICMP6_STAT_BADCODE 259 /* icmp6_code out of range */ |
564 |
#define ICMP6_STAT_TOOSHORT 260 /* packet < sizeof(struct icmp6_hdr) */ |
565 |
#define ICMP6_STAT_CHECKSUM 261 /* bad checksum */ |
566 |
#define ICMP6_STAT_BADLEN 262 /* calculated bound mismatch */ |
567 |
/*
|
568 |
* number of responses; this member is inherited from the netinet code,
|
569 |
* but for netinet6 code, it is already available in outhist[].
|
570 |
*/
|
571 |
#define ICMP6_STAT_REFLECT 263 |
572 |
#define ICMP6_STAT_INHIST 264 /* # of input messages */ |
573 |
/* space for 256 counters */
|
574 |
#define ICMP6_STAT_ND_TOOMANYOPT 520 /* too many ND options */ |
575 |
#define ICMP6_STAT_OUTERRHIST 521 |
576 |
/* space for 13 counters */
|
577 |
#define ICMP6_STAT_PMTUCHG 534 /* path MTU changes */ |
578 |
#define ICMP6_STAT_ND_BADOPT 535 /* bad ND options */ |
579 |
#define ICMP6_STAT_BADNS 536 /* bad neighbor solicititation */ |
580 |
#define ICMP6_STAT_BADNA 537 /* bad neighbor advertisement */ |
581 |
#define ICMP6_STAT_BADRS 538 /* bad router solicitiation */ |
582 |
#define ICMP6_STAT_BADRA 539 /* bad router advertisement */ |
583 |
#define ICMP6_STAT_BADREDIRECT 540 /* bad redirect message */ |
584 |
#define ICMP6_STAT_DROPPED_RAROUTE 541 /* discarded routes from router advertisement */ |
585 |
|
586 |
#define ICMP6_NSTATS 542 |
587 |
|
588 |
#define ICMP6_ERRSTAT_DST_UNREACH_NOROUTE 0 |
589 |
#define ICMP6_ERRSTAT_DST_UNREACH_ADMIN 1 |
590 |
#define ICMP6_ERRSTAT_DST_UNREACH_BEYONDSCOPE 2 |
591 |
#define ICMP6_ERRSTAT_DST_UNREACH_ADDR 3 |
592 |
#define ICMP6_ERRSTAT_DST_UNREACH_NOPORT 4 |
593 |
#define ICMP6_ERRSTAT_PACKET_TOO_BIG 5 |
594 |
#define ICMP6_ERRSTAT_TIME_EXCEED_TRANSIT 6 |
595 |
#define ICMP6_ERRSTAT_TIME_EXCEED_REASSEMBLY 7 |
596 |
#define ICMP6_ERRSTAT_PARAMPROB_HEADER 8 |
597 |
#define ICMP6_ERRSTAT_PARAMPROB_NEXTHEADER 9 |
598 |
#define ICMP6_ERRSTAT_PARAMPROB_OPTION 10 |
599 |
#define ICMP6_ERRSTAT_REDIRECT 11 |
600 |
#define ICMP6_ERRSTAT_UNKNOWN 12 |
601 |
|
602 |
/*
|
603 |
* Names for ICMP sysctl objects
|
604 |
*/
|
605 |
#define ICMPV6CTL_STATS 1 |
606 |
#define ICMPV6CTL_REDIRACCEPT 2 /* accept/process redirects */ |
607 |
#define ICMPV6CTL_REDIRTIMEOUT 3 /* redirect cache time */ |
608 |
#if 0 /*obsoleted*/
|
609 |
#define ICMPV6CTL_ERRRATELIMIT 5 /* ICMPv6 error rate limitation */
|
610 |
#endif
|
611 |
#define ICMPV6CTL_ND6_PRUNE 6 |
612 |
#define ICMPV6CTL_ND6_DELAY 8 |
613 |
#define ICMPV6CTL_ND6_UMAXTRIES 9 |
614 |
#define ICMPV6CTL_ND6_MMAXTRIES 10 |
615 |
#define ICMPV6CTL_ND6_USELOOPBACK 11 |
616 |
/*#define ICMPV6CTL_ND6_PROXYALL 12 obsoleted, do not reuse here */
|
617 |
#define ICMPV6CTL_NODEINFO 13 |
618 |
#define ICMPV6CTL_ERRPPSLIMIT 14 /* ICMPv6 error pps limitation */ |
619 |
#define ICMPV6CTL_ND6_MAXNUDHINT 15 |
620 |
#define ICMPV6CTL_MTUDISC_HIWAT 16 |
621 |
#define ICMPV6CTL_MTUDISC_LOWAT 17 |
622 |
#define ICMPV6CTL_ND6_DEBUG 18 |
623 |
#define ICMPV6CTL_ND6_DRLIST 19 |
624 |
#define ICMPV6CTL_ND6_PRLIST 20 |
625 |
#define ICMPV6CTL_ND6_MAXQLEN 24 |
626 |
#define ICMPV6CTL_MAXID 25 |
627 |
|
628 |
#define ICMPV6CTL_NAMES { \
|
629 |
{ 0, 0 }, \ |
630 |
{ 0, 0 }, \ |
631 |
{ "rediraccept", CTLTYPE_INT }, \
|
632 |
{ "redirtimeout", CTLTYPE_INT }, \
|
633 |
{ 0, 0 }, \ |
634 |
{ 0, 0 }, \ |
635 |
{ "nd6_prune", CTLTYPE_INT }, \
|
636 |
{ 0, 0 }, \ |
637 |
{ "nd6_delay", CTLTYPE_INT }, \
|
638 |
{ "nd6_umaxtries", CTLTYPE_INT }, \
|
639 |
{ "nd6_mmaxtries", CTLTYPE_INT }, \
|
640 |
{ "nd6_useloopback", CTLTYPE_INT }, \
|
641 |
{ 0, 0 }, \ |
642 |
{ "nodeinfo", CTLTYPE_INT }, \
|
643 |
{ "errppslimit", CTLTYPE_INT }, \
|
644 |
{ "nd6_maxnudhint", CTLTYPE_INT }, \
|
645 |
{ "mtudisc_hiwat", CTLTYPE_INT }, \
|
646 |
{ "mtudisc_lowat", CTLTYPE_INT }, \
|
647 |
{ "nd6_debug", CTLTYPE_INT }, \
|
648 |
{ 0, 0 }, \ |
649 |
{ 0, 0 }, \ |
650 |
{ 0, 0 }, \ |
651 |
{ 0, 0 }, \ |
652 |
{ 0, 0 }, \ |
653 |
{ "nd6_maxqueuelen", CTLTYPE_INT }, \
|
654 |
} |
655 |
|
656 |
#ifdef _KERNEL
|
657 |
struct rtentry;
|
658 |
struct rttimer;
|
659 |
struct in6_multi;
|
660 |
|
661 |
void icmp6_init(void); |
662 |
void icmp6_paramerror(struct mbuf *, int); |
663 |
void icmp6_error(struct mbuf *, int, int, int); |
664 |
void icmp6_error2(struct mbuf *, int, int, int, struct ifnet *); |
665 |
int icmp6_input(struct mbuf **, int *, int); |
666 |
void icmp6_fasttimo(void); |
667 |
void icmp6_reflect(struct mbuf *, size_t); |
668 |
void icmp6_prepare(struct mbuf *); |
669 |
void icmp6_redirect_input(struct mbuf *, int); |
670 |
void icmp6_redirect_output(struct mbuf *, struct rtentry *); |
671 |
int icmp6_sysctl(int *, u_int, void *, size_t *, void *, size_t); |
672 |
|
673 |
void icmp6_statinc(u_int);
|
674 |
|
675 |
struct ip6ctlparam;
|
676 |
void icmp6_mtudisc_update(struct ip6ctlparam *, int); |
677 |
void icmp6_mtudisc_callback_register(void (*)(struct in6_addr *)); |
678 |
|
679 |
/* XXX: is this the right place for these macros? */
|
680 |
#define icmp6_ifstat_inc(ifp, tag) \
|
681 |
do { \
|
682 |
if (ifp) \
|
683 |
((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->icmp6_ifstat->tag++; \
|
684 |
} while (/*CONSTCOND*/ 0) |
685 |
|
686 |
#define icmp6_ifoutstat_inc(ifp, type, code) \
|
687 |
do { \
|
688 |
icmp6_ifstat_inc(ifp, ifs6_out_msg); \ |
689 |
switch(type) { \
|
690 |
case ICMP6_DST_UNREACH: \
|
691 |
icmp6_ifstat_inc(ifp, ifs6_out_dstunreach); \ |
692 |
if (code == ICMP6_DST_UNREACH_ADMIN) \
|
693 |
icmp6_ifstat_inc(ifp, ifs6_out_adminprohib); \ |
694 |
break; \
|
695 |
case ICMP6_PACKET_TOO_BIG: \
|
696 |
icmp6_ifstat_inc(ifp, ifs6_out_pkttoobig); \ |
697 |
break; \
|
698 |
case ICMP6_TIME_EXCEEDED: \
|
699 |
icmp6_ifstat_inc(ifp, ifs6_out_timeexceed); \ |
700 |
break; \
|
701 |
case ICMP6_PARAM_PROB: \
|
702 |
icmp6_ifstat_inc(ifp, ifs6_out_paramprob); \ |
703 |
break; \
|
704 |
case ICMP6_ECHO_REQUEST: \
|
705 |
icmp6_ifstat_inc(ifp, ifs6_out_echo); \ |
706 |
break; \
|
707 |
case ICMP6_ECHO_REPLY: \
|
708 |
icmp6_ifstat_inc(ifp, ifs6_out_echoreply); \ |
709 |
break; \
|
710 |
case MLD_LISTENER_QUERY: \
|
711 |
icmp6_ifstat_inc(ifp, ifs6_out_mldquery); \ |
712 |
break; \
|
713 |
case MLD_LISTENER_REPORT: \
|
714 |
icmp6_ifstat_inc(ifp, ifs6_out_mldreport); \ |
715 |
break; \
|
716 |
case MLD_LISTENER_DONE: \
|
717 |
icmp6_ifstat_inc(ifp, ifs6_out_mlddone); \ |
718 |
break; \
|
719 |
case ND_ROUTER_SOLICIT: \
|
720 |
icmp6_ifstat_inc(ifp, ifs6_out_routersolicit); \ |
721 |
break; \
|
722 |
case ND_ROUTER_ADVERT: \
|
723 |
icmp6_ifstat_inc(ifp, ifs6_out_routeradvert); \ |
724 |
break; \
|
725 |
case ND_NEIGHBOR_SOLICIT: \
|
726 |
icmp6_ifstat_inc(ifp, ifs6_out_neighborsolicit); \ |
727 |
break; \
|
728 |
case ND_NEIGHBOR_ADVERT: \
|
729 |
icmp6_ifstat_inc(ifp, ifs6_out_neighboradvert); \ |
730 |
break; \
|
731 |
case ND_REDIRECT: \
|
732 |
icmp6_ifstat_inc(ifp, ifs6_out_redirect); \ |
733 |
break; \
|
734 |
} \ |
735 |
} while (/*CONSTCOND*/ 0) |
736 |
|
737 |
extern int icmp6_rediraccept; /* accept/process redirects */ |
738 |
extern int icmp6_redirtimeout; /* cache time for redirect routes */ |
739 |
#endif /* _KERNEL */ |
740 |
|
741 |
#ifdef ICMP6_STRINGS
|
742 |
/* Info: http://www.iana.org/assignments/icmpv6-parameters */
|
743 |
|
744 |
static const char * const icmp6_type_err[] = { |
745 |
"reserved0", "unreach", "packet_too_big", "timxceed", "paramprob", |
746 |
NULL
|
747 |
}; |
748 |
|
749 |
static const char * const icmp6_type_info[] = { |
750 |
"echo", "echoreply", |
751 |
"mcastlistenq", "mcastlistenrep", "mcastlistendone", |
752 |
"rtsol", "rtadv", "neighsol", "neighadv", "redirect", |
753 |
"routerrenum", "nodeinfoq", "nodeinfor", "invneighsol", "invneighrep", |
754 |
"mcastlistenrep2", "haad_req", "haad_rep", |
755 |
"mobile_psol", "mobile_padv", "cga_sol", "cga_adv", |
756 |
"experimental150", "mcast_rtadv", "mcast_rtsol", "mcast_rtterm", |
757 |
"fmipv6_msg", "rpl_control", NULL |
758 |
}; |
759 |
|
760 |
static const char * const icmp6_code_none[] = { "none", NULL }; |
761 |
|
762 |
static const char * const icmp6_code_unreach[] = { |
763 |
"noroute", "admin", "beyondscope", "addr", "port", |
764 |
"srcaddr_policy", "reject_route", "source_route_err", NULL |
765 |
}; |
766 |
|
767 |
static const char * const icmp6_code_timxceed[] = { |
768 |
"intrans", "reass", NULL |
769 |
}; |
770 |
|
771 |
static const char * const icmp6_code_paramprob[] = { |
772 |
"hdr_field", "nxthdr_type", "option", NULL |
773 |
}; |
774 |
|
775 |
/* not all informational icmps that have codes have a names array */
|
776 |
#endif
|
777 |
|
778 |
#endif /* !_NETINET_ICMP6_H_ */ |