Project

General

Profile

Statistics
| Revision:

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_ */