Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / netinet6 / in6_var.h @ 13

History | View | Annotate | Download (24.7 KB)

1 13 up20180614
/*        $NetBSD: in6_var.h,v 1.74 2015/09/06 06:01:01 dholland Exp $        */
2
/*        $KAME: in6_var.h,v 1.81 2002/06/08 11:16:51 itojun Exp $        */
3
4
/*
5
 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
6
 * All rights reserved.
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions
10
 * are met:
11
 * 1. Redistributions of source code must retain the above copyright
12
 *    notice, this list of conditions and the following disclaimer.
13
 * 2. Redistributions in binary form must reproduce the above copyright
14
 *    notice, this list of conditions and the following disclaimer in the
15
 *    documentation and/or other materials provided with the distribution.
16
 * 3. Neither the name of the project nor the names of its contributors
17
 *    may be used to endorse or promote products derived from this software
18
 *    without specific prior written permission.
19
 *
20
 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
 * SUCH DAMAGE.
31
 */
32
33
/*
34
 * Copyright (c) 1985, 1986, 1993
35
 *        The Regents of the University of California.  All rights reserved.
36
 *
37
 * Redistribution and use in source and binary forms, with or without
38
 * modification, are permitted provided that the following conditions
39
 * are met:
40
 * 1. Redistributions of source code must retain the above copyright
41
 *    notice, this list of conditions and the following disclaimer.
42
 * 2. Redistributions in binary form must reproduce the above copyright
43
 *    notice, this list of conditions and the following disclaimer in the
44
 *    documentation and/or other materials provided with the distribution.
45
 * 3. Neither the name of the University nor the names of its contributors
46
 *    may be used to endorse or promote products derived from this software
47
 *    without specific prior written permission.
48
 *
49
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
50
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59
 * SUCH DAMAGE.
60
 *
61
 *        @(#)in_var.h        8.1 (Berkeley) 6/10/93
62
 */
63
64
#ifndef _NETINET6_IN6_VAR_H_
65
#define _NETINET6_IN6_VAR_H_
66
67
#include <sys/callout.h>
68
#include <sys/ioccom.h>
69
70
/*
71
 * Interface address, Internet version.  One of these structures
72
 * is allocated for each interface with an Internet address.
73
 * The ifaddr structure contains the protocol-independent part
74
 * of the structure and is assumed to be first.
75
 */
76
77
/*
78
 * pltime/vltime are just for future reference (required to implements 2
79
 * hour rule for hosts).  they should never be modified by nd6_timeout or
80
 * anywhere else.
81
 *        userland -> kernel: accept pltime/vltime
82
 *        kernel -> userland: throw up everything
83
 *        in kernel: modify preferred/expire only
84
 */
85
struct in6_addrlifetime {
86
        time_t ia6t_expire;        /* valid lifetime expiration time */
87
        time_t ia6t_preferred;        /* preferred lifetime expiration time */
88
        u_int32_t ia6t_vltime;        /* valid lifetime */
89
        u_int32_t ia6t_pltime;        /* prefix lifetime */
90
};
91
92
struct nd_ifinfo;
93
struct in6_ifextra {
94
        struct in6_ifstat *in6_ifstat;
95
        struct icmp6_ifstat *icmp6_ifstat;
96
        struct nd_ifinfo *nd_ifinfo;
97
        struct scope6_id *scope6_id;
98
        int nprefixes;
99
        int ndefrouters;
100
};
101
102
LIST_HEAD(in6_multihead, in6_multi);
103
struct        in6_ifaddr {
104
        struct        ifaddr ia_ifa;                /* protocol-independent info */
105
#define        ia_ifp                ia_ifa.ifa_ifp
106
#define ia_flags        ia_ifa.ifa_flags
107
        struct        sockaddr_in6 ia_addr;        /* interface address */
108
        struct        sockaddr_in6 ia_net;        /* network number of interface */
109
        struct        sockaddr_in6 ia_dstaddr; /* space for destination addr */
110
        struct        sockaddr_in6 ia_prefixmask; /* prefix mask */
111
        u_int32_t ia_plen;                /* prefix length */
112
        struct        in6_ifaddr *ia_next;        /* next in6 list of IP6 addresses */
113
        struct        in6_multihead ia6_multiaddrs;
114
                                        /* list of multicast addresses */
115
        int        ia6_flags;
116
117
        struct in6_addrlifetime ia6_lifetime;
118
        time_t        ia6_createtime; /* the creation time of this address, which is
119
                                 * currently used for temporary addresses only.
120
                                 */
121
        time_t        ia6_updatetime;
122
123
        /* back pointer to the ND prefix (for autoconfigured addresses only) */
124
        struct nd_prefix *ia6_ndpr;
125
126
        /* multicast addresses joined from the kernel */
127
        LIST_HEAD(, in6_multi_mship) ia6_memberships;
128
};
129
130
/* control structure to manage address selection policy */
131
struct in6_addrpolicy {
132
        struct sockaddr_in6 addr; /* prefix address */
133
        struct sockaddr_in6 addrmask; /* prefix mask */
134
        int preced;                /* precedence */
135
        int label;                /* matching label */
136
        u_quad_t use;                /* statistics */
137
};
138
139
/*
140
 * IPv6 interface statistics, as defined in RFC2465 Ipv6IfStatsEntry (p12).
141
 */
142
struct in6_ifstat {
143
        u_quad_t ifs6_in_receive;        /* # of total input datagram */
144
        u_quad_t ifs6_in_hdrerr;        /* # of datagrams with invalid hdr */
145
        u_quad_t ifs6_in_toobig;        /* # of datagrams exceeded MTU */
146
        u_quad_t ifs6_in_noroute;        /* # of datagrams with no route */
147
        u_quad_t ifs6_in_addrerr;        /* # of datagrams with invalid dst */
148
        u_quad_t ifs6_in_protounknown;        /* # of datagrams with unknown proto */
149
                                        /* NOTE: increment on final dst if */
150
        u_quad_t ifs6_in_truncated;        /* # of truncated datagrams */
151
        u_quad_t ifs6_in_discard;        /* # of discarded datagrams */
152
                                        /* NOTE: fragment timeout is not here */
153
        u_quad_t ifs6_in_deliver;        /* # of datagrams delivered to ULP */
154
                                        /* NOTE: increment on final dst if */
155
        u_quad_t ifs6_out_forward;        /* # of datagrams forwarded */
156
                                        /* NOTE: increment on outgoing if */
157
        u_quad_t ifs6_out_request;        /* # of outgoing datagrams from ULP */
158
                                        /* NOTE: does not include forwrads */
159
        u_quad_t ifs6_out_discard;        /* # of discarded datagrams */
160
        u_quad_t ifs6_out_fragok;        /* # of datagrams fragmented */
161
        u_quad_t ifs6_out_fragfail;        /* # of datagrams failed on fragment */
162
        u_quad_t ifs6_out_fragcreat;        /* # of fragment datagrams */
163
                                        /* NOTE: this is # after fragment */
164
        u_quad_t ifs6_reass_reqd;        /* # of incoming fragmented packets */
165
                                        /* NOTE: increment on final dst if */
166
        u_quad_t ifs6_reass_ok;                /* # of reassembled packets */
167
                                        /* NOTE: this is # after reass */
168
                                        /* NOTE: increment on final dst if */
169
        u_quad_t ifs6_reass_fail;        /* # of reass failures */
170
                                        /* NOTE: may not be packet count */
171
                                        /* NOTE: increment on final dst if */
172
        u_quad_t ifs6_in_mcast;                /* # of inbound multicast datagrams */
173
        u_quad_t ifs6_out_mcast;        /* # of outbound multicast datagrams */
174
};
175
176
/*
177
 * ICMPv6 interface statistics, as defined in RFC2466 Ipv6IfIcmpEntry.
178
 * XXX: I'm not sure if this file is the right place for this structure...
179
 */
180
struct icmp6_ifstat {
181
        /*
182
         * Input statistics
183
         */
184
        /* ipv6IfIcmpInMsgs, total # of input messages */
185
        u_quad_t ifs6_in_msg;
186
        /* ipv6IfIcmpInErrors, # of input error messages */
187
        u_quad_t ifs6_in_error;
188
        /* ipv6IfIcmpInDestUnreachs, # of input dest unreach errors */
189
        u_quad_t ifs6_in_dstunreach;
190
        /* ipv6IfIcmpInAdminProhibs, # of input administratively prohibited errs */
191
        u_quad_t ifs6_in_adminprohib;
192
        /* ipv6IfIcmpInTimeExcds, # of input time exceeded errors */
193
        u_quad_t ifs6_in_timeexceed;
194
        /* ipv6IfIcmpInParmProblems, # of input parameter problem errors */
195
        u_quad_t ifs6_in_paramprob;
196
        /* ipv6IfIcmpInPktTooBigs, # of input packet too big errors */
197
        u_quad_t ifs6_in_pkttoobig;
198
        /* ipv6IfIcmpInEchos, # of input echo requests */
199
        u_quad_t ifs6_in_echo;
200
        /* ipv6IfIcmpInEchoReplies, # of input echo replies */
201
        u_quad_t ifs6_in_echoreply;
202
        /* ipv6IfIcmpInRouterSolicits, # of input router solicitations */
203
        u_quad_t ifs6_in_routersolicit;
204
        /* ipv6IfIcmpInRouterAdvertisements, # of input router advertisements */
205
        u_quad_t ifs6_in_routeradvert;
206
        /* ipv6IfIcmpInNeighborSolicits, # of input neighbor solicitations */
207
        u_quad_t ifs6_in_neighborsolicit;
208
        /* ipv6IfIcmpInNeighborAdvertisements, # of input neighbor advertisements */
209
        u_quad_t ifs6_in_neighboradvert;
210
        /* ipv6IfIcmpInRedirects, # of input redirects */
211
        u_quad_t ifs6_in_redirect;
212
        /* ipv6IfIcmpInGroupMembQueries, # of input MLD queries */
213
        u_quad_t ifs6_in_mldquery;
214
        /* ipv6IfIcmpInGroupMembResponses, # of input MLD reports */
215
        u_quad_t ifs6_in_mldreport;
216
        /* ipv6IfIcmpInGroupMembReductions, # of input MLD done */
217
        u_quad_t ifs6_in_mlddone;
218
219
        /*
220
         * Output statistics. We should solve unresolved routing problem...
221
         */
222
        /* ipv6IfIcmpOutMsgs, total # of output messages */
223
        u_quad_t ifs6_out_msg;
224
        /* ipv6IfIcmpOutErrors, # of output error messages */
225
        u_quad_t ifs6_out_error;
226
        /* ipv6IfIcmpOutDestUnreachs, # of output dest unreach errors */
227
        u_quad_t ifs6_out_dstunreach;
228
        /* ipv6IfIcmpOutAdminProhibs, # of output administratively prohibited errs */
229
        u_quad_t ifs6_out_adminprohib;
230
        /* ipv6IfIcmpOutTimeExcds, # of output time exceeded errors */
231
        u_quad_t ifs6_out_timeexceed;
232
        /* ipv6IfIcmpOutParmProblems, # of output parameter problem errors */
233
        u_quad_t ifs6_out_paramprob;
234
        /* ipv6IfIcmpOutPktTooBigs, # of output packet too big errors */
235
        u_quad_t ifs6_out_pkttoobig;
236
        /* ipv6IfIcmpOutEchos, # of output echo requests */
237
        u_quad_t ifs6_out_echo;
238
        /* ipv6IfIcmpOutEchoReplies, # of output echo replies */
239
        u_quad_t ifs6_out_echoreply;
240
        /* ipv6IfIcmpOutRouterSolicits, # of output router solicitations */
241
        u_quad_t ifs6_out_routersolicit;
242
        /* ipv6IfIcmpOutRouterAdvertisements, # of output router advertisements */
243
        u_quad_t ifs6_out_routeradvert;
244
        /* ipv6IfIcmpOutNeighborSolicits, # of output neighbor solicitations */
245
        u_quad_t ifs6_out_neighborsolicit;
246
        /* ipv6IfIcmpOutNeighborAdvertisements, # of output neighbor advertisements */
247
        u_quad_t ifs6_out_neighboradvert;
248
        /* ipv6IfIcmpOutRedirects, # of output redirects */
249
        u_quad_t ifs6_out_redirect;
250
        /* ipv6IfIcmpOutGroupMembQueries, # of output MLD queries */
251
        u_quad_t ifs6_out_mldquery;
252
        /* ipv6IfIcmpOutGroupMembResponses, # of output MLD reports */
253
        u_quad_t ifs6_out_mldreport;
254
        /* ipv6IfIcmpOutGroupMembReductions, # of output MLD done */
255
        u_quad_t ifs6_out_mlddone;
256
};
257
258
/*
259
 * If you make changes that change the size of in6_ifreq,
260
 * make sure you fix compat/netinet6/in6_var.h
261
 */
262
struct        in6_ifreq {
263
        char        ifr_name[IFNAMSIZ];
264
        union {
265
                struct        sockaddr_in6 ifru_addr;
266
                struct        sockaddr_in6 ifru_dstaddr;
267
                short        ifru_flags;
268
                int        ifru_flags6;
269
                int        ifru_metric;
270
                void *        ifru_data;
271
                struct in6_addrlifetime ifru_lifetime;
272
                struct in6_ifstat ifru_stat;
273
                struct icmp6_ifstat ifru_icmp6stat;
274
        } ifr_ifru;
275
};
276
277
struct        in6_aliasreq {
278
        char        ifra_name[IFNAMSIZ];
279
        struct        sockaddr_in6 ifra_addr;
280
        struct        sockaddr_in6 ifra_dstaddr;
281
        struct        sockaddr_in6 ifra_prefixmask;
282
        int        ifra_flags;
283
        struct in6_addrlifetime ifra_lifetime;
284
};
285
286
/* prefix type macro */
287
#define IN6_PREFIX_ND        1
288
#define IN6_PREFIX_RR        2
289
290
/*
291
 * prefix related flags passed between kernel(NDP related part) and
292
 * user land command(ifconfig) and daemon(rtadvd).
293
 * Note: We originally intended to use prf_ra{} only within in6_prflags{}, but
294
 * it was (probably unintentionally) used in nd6.h as well.  Since C++ does
295
 * not allow such a reference, prf_ra{} was then moved outside.  In general,
296
 * however, this structure should not be used directly.
297
 */
298
struct prf_ra {
299
        u_int32_t onlink : 1;
300
        u_int32_t autonomous : 1;
301
        u_int32_t router : 1;
302
        u_int32_t reserved : 5;
303
};
304
305
struct in6_prflags {
306
        struct prf_ra prf_ra;
307
        u_char prf_reserved1;
308
        u_short prf_reserved2;
309
        /* want to put this on 4byte offset */
310
        struct prf_rr {
311
                u_int32_t decrvalid : 1;
312
                u_int32_t decrprefd : 1;
313
                u_int32_t reserved : 6;
314
        } prf_rr;
315
        u_char prf_reserved3;
316
        u_short prf_reserved4;
317
};
318
319
struct  in6_prefixreq {
320
        char        ipr_name[IFNAMSIZ];
321
        u_char        ipr_origin;
322
        u_char        ipr_plen;
323
        u_int32_t ipr_vltime;
324
        u_int32_t ipr_pltime;
325
        struct in6_prflags ipr_flags;
326
        struct        sockaddr_in6 ipr_prefix;
327
};
328
329
#define PR_ORIG_RA        0
330
#define PR_ORIG_RR        1
331
#define PR_ORIG_STATIC        2
332
#define PR_ORIG_KERNEL        3
333
334
#define ipr_raf_onlink                ipr_flags.prf_ra.onlink
335
#define ipr_raf_auto                ipr_flags.prf_ra.autonomous
336
337
#define ipr_statef_onlink        ipr_flags.prf_state.onlink
338
339
#define ipr_rrf_decrvalid        ipr_flags.prf_rr.decrvalid
340
#define ipr_rrf_decrprefd        ipr_flags.prf_rr.decrprefd
341
342
struct        in6_rrenumreq {
343
        char        irr_name[IFNAMSIZ];
344
        u_char        irr_origin;
345
        u_char        irr_m_len;        /* match len for matchprefix */
346
        u_char        irr_m_minlen;        /* minlen for matching prefix */
347
        u_char        irr_m_maxlen;        /* maxlen for matching prefix */
348
        u_char        irr_u_uselen;        /* uselen for adding prefix */
349
        u_char        irr_u_keeplen;        /* keeplen from matching prefix */
350
        struct irr_raflagmask {
351
                u_int32_t onlink : 1;
352
                u_int32_t autonomous : 1;
353
                u_int32_t reserved : 6;
354
        } irr_raflagmask;
355
        u_int32_t irr_vltime;
356
        u_int32_t irr_pltime;
357
        struct in6_prflags irr_flags;
358
        struct        sockaddr_in6 irr_matchprefix;
359
        struct        sockaddr_in6 irr_useprefix;
360
};
361
362
#define irr_raf_mask_onlink        irr_raflagmask.onlink
363
#define irr_raf_mask_auto        irr_raflagmask.autonomous
364
#define irr_raf_mask_reserved        irr_raflagmask.reserved
365
366
#define irr_raf_onlink                irr_flags.prf_ra.onlink
367
#define irr_raf_auto                irr_flags.prf_ra.autonomous
368
369
#define irr_statef_onlink        irr_flags.prf_state.onlink
370
371
#define irr_rrf                        irr_flags.prf_rr
372
#define irr_rrf_decrvalid        irr_flags.prf_rr.decrvalid
373
#define irr_rrf_decrprefd        irr_flags.prf_rr.decrprefd
374
375
/*
376
 * Given a pointer to an in6_ifaddr (ifaddr),
377
 * return a pointer to the addr as a sockaddr_in6
378
 */
379
#define IA6_IN6(ia)        (&((ia)->ia_addr.sin6_addr))
380
#define IA6_DSTIN6(ia)        (&((ia)->ia_dstaddr.sin6_addr))
381
#define IA6_MASKIN6(ia)        (&((ia)->ia_prefixmask.sin6_addr))
382
#define IA6_SIN6(ia)        (&((ia)->ia_addr))
383
#define IA6_DSTSIN6(ia)        (&((ia)->ia_dstaddr))
384
#define IFA_IN6(x)        (&((struct sockaddr_in6 *)((x)->ifa_addr))->sin6_addr)
385
#define IFA_DSTIN6(x)        (&((struct sockaddr_in6 *)((x)->ifa_dstaddr))->sin6_addr)
386
387
#ifdef _KERNEL
388
#define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m)        (        \
389
        (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
390
        (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \
391
        (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \
392
        (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 )
393
#endif
394
395
#define SIOCSIFADDR_IN6                 _IOW('i', 12, struct in6_ifreq)
396
#define SIOCGIFADDR_IN6                _IOWR('i', 33, struct in6_ifreq)
397
398
#ifdef _KERNEL
399
/*
400
 * SIOCSxxx ioctls should be unused (see comments in in6.c), but
401
 * we do not shift numbers for binary compatibility.
402
 */
403
#define SIOCSIFDSTADDR_IN6         _IOW('i', 14, struct in6_ifreq)
404
#define SIOCSIFNETMASK_IN6         _IOW('i', 22, struct in6_ifreq)
405
#endif
406
407
#define SIOCGIFDSTADDR_IN6        _IOWR('i', 34, struct in6_ifreq)
408
#define SIOCGIFNETMASK_IN6        _IOWR('i', 37, struct in6_ifreq)
409
410
#define SIOCDIFADDR_IN6                 _IOW('i', 25, struct in6_ifreq)
411
/* 26 was OSIOCAIFADDR_IN6 */
412
413
/* 70 was OSIOCSIFPHYADDR_IN6 */
414
#define        SIOCGIFPSRCADDR_IN6        _IOWR('i', 71, struct in6_ifreq)
415
#define        SIOCGIFPDSTADDR_IN6        _IOWR('i', 72, struct in6_ifreq)
416
417
#define SIOCGIFAFLAG_IN6        _IOWR('i', 73, struct in6_ifreq)
418
419
#define SIOCGDRLST_IN6                _IOWR('i', 74, struct in6_drlist)
420
#define SIOCGPRLST_IN6                _IOWR('i', 75, struct in6_oprlist)
421
#ifdef _KERNEL
422
#define OSIOCGIFINFO_IN6        _IOWR('i', 76, struct in6_ondireq)
423
#endif
424
#define SIOCSNDFLUSH_IN6        _IOWR('i', 77, struct in6_ifreq)
425
#define SIOCGNBRINFO_IN6        _IOWR('i', 78, struct in6_nbrinfo)
426
#define SIOCSPFXFLUSH_IN6        _IOWR('i', 79, struct in6_ifreq)
427
#define SIOCSRTRFLUSH_IN6        _IOWR('i', 80, struct in6_ifreq)
428
/* 81 was old SIOCGIFALIFETIME_IN6 */
429
#if 0
430
/* withdrawn - do not reuse number 82 */
431
#define SIOCSIFALIFETIME_IN6        _IOWR('i', 82, struct in6_ifreq)
432
#endif
433
#define SIOCGIFSTAT_IN6                _IOWR('i', 83, struct in6_ifreq)
434
#define SIOCGIFSTAT_ICMP6        _IOWR('i', 84, struct in6_ifreq)
435
436
#define SIOCSDEFIFACE_IN6        _IOWR('i', 85, struct in6_ndifreq)
437
#define SIOCGDEFIFACE_IN6        _IOWR('i', 86, struct in6_ndifreq)
438
439
#define SIOCSIFINFO_FLAGS        _IOWR('i', 87, struct in6_ndireq) /* XXX */
440
441
#define SIOCSIFPREFIX_IN6        _IOW('i', 100, struct in6_prefixreq) /* set */
442
#define SIOCGIFPREFIX_IN6        _IOWR('i', 101, struct in6_prefixreq) /* get */
443
#define SIOCDIFPREFIX_IN6        _IOW('i', 102, struct in6_prefixreq) /* del */
444
#define SIOCAIFPREFIX_IN6        _IOW('i', 103, struct in6_rrenumreq) /* add */
445
#define SIOCCIFPREFIX_IN6        _IOW('i', 104, \
446
                                     struct in6_rrenumreq) /* change */
447
#define SIOCSGIFPREFIX_IN6        _IOW('i', 105, \
448
                                     struct in6_rrenumreq) /* set global */
449
#define SIOCGIFALIFETIME_IN6        _IOWR('i', 106, struct in6_ifreq)
450
#define SIOCAIFADDR_IN6                _IOW('i', 107, struct in6_aliasreq)
451
#define SIOCGIFINFO_IN6                _IOWR('i', 108, struct in6_ndireq)
452
#define SIOCSIFINFO_IN6                _IOWR('i', 109, struct in6_ndireq)
453
#define SIOCSIFPHYADDR_IN6      _IOW('i', 110, struct in6_aliasreq)
454
455
456
/* XXX: Someone decided to switch to 'u' here for unknown reasons! */
457
#define SIOCGETSGCNT_IN6        _IOWR('u', 106, \
458
                                      struct sioc_sg_req6) /* get s,g pkt cnt */
459
#define SIOCGETMIFCNT_IN6        _IOWR('u', 107, \
460
                                      struct sioc_mif_req6) /* get pkt cnt per if */
461
#define SIOCAADDRCTL_POLICY        _IOW('u', 108, struct in6_addrpolicy)
462
#define SIOCDADDRCTL_POLICY        _IOW('u', 109, struct in6_addrpolicy)
463
464
#define IN6_IFF_ANYCAST                0x01        /* anycast address */
465
#define IN6_IFF_TENTATIVE        0x02        /* tentative address */
466
#define IN6_IFF_DUPLICATED        0x04        /* DAD detected duplicate */
467
#define IN6_IFF_DETACHED        0x08        /* may be detached from the link */
468
#define IN6_IFF_DEPRECATED        0x10        /* deprecated address */
469
#define IN6_IFF_NODAD                0x20        /* don't perform DAD on this address
470
                                         * (used only at first SIOC* call)
471
                                         */
472
#define IN6_IFF_AUTOCONF        0x40        /* autoconfigurable address. */
473
#define IN6_IFF_TEMPORARY        0x80        /* temporary (anonymous) address. */
474
475
/* do not input/output */
476
#define IN6_IFF_NOTREADY (IN6_IFF_TENTATIVE|IN6_IFF_DUPLICATED)
477
478
#ifdef _KERNEL
479
#define IN6_ARE_SCOPE_CMP(a,b) ((a)-(b))
480
#define IN6_ARE_SCOPE_EQUAL(a,b) ((a)==(b))
481
#endif
482
483
#ifdef _KERNEL
484
485
#include <net/pktqueue.h>
486
487
extern pktqueue_t *ip6_pktq;
488
489
MALLOC_DECLARE(M_IP6OPT);
490
491
extern struct in6_ifaddr *in6_ifaddr;
492
493
#define in6_ifstat_inc(ifp, tag) \
494
do {                                                                \
495
        if (ifp)                                                \
496
                ((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->in6_ifstat->tag++; \
497
} while (/*CONSTCOND*/ 0)
498
499
extern const struct in6_addr zeroin6_addr;
500
extern const u_char inet6ctlerrmap[];
501
extern unsigned long in6_maxmtu;
502
extern bool in6_present;
503
504
/*
505
 * Macro for finding the internet address structure (in6_ifaddr) corresponding
506
 * to a given interface (ifnet structure).
507
 */
508
static inline struct in6_ifaddr *
509
ifp_to_ia6(struct ifnet *ifp)
510
{
511
        struct ifaddr *ifa;
512
513
        IFADDR_FOREACH(ifa, ifp) {
514
                if (ifa->ifa_addr == NULL)
515
                        continue;
516
                if (ifa->ifa_addr->sa_family == AF_INET6)
517
                        break;
518
        }
519
        return (struct in6_ifaddr *)ifa;
520
}
521
522
#define        IFP_TO_IA6(__ifp, __ia)                                \
523
do {                                                        \
524
        (__ia) = ifp_to_ia6((__ifp));                                \
525
} while (/*CONSTCOND*/0)
526
527
528
#endif /* _KERNEL */
529
530
/*
531
 * Multi-cast membership entry.  One for each group/ifp that a PCB
532
 * belongs to.
533
 */
534
struct in6_multi_mship {
535
        struct        in6_multi *i6mm_maddr;        /* Multicast address pointer */
536
        LIST_ENTRY(in6_multi_mship) i6mm_chain;  /* multicast options chain */
537
};
538
539
struct        in6_multi {
540
        LIST_ENTRY(in6_multi) in6m_entry; /* list glue */
541
        struct        in6_addr in6m_addr;        /* IP6 multicast address */
542
        struct        ifnet *in6m_ifp;        /* back pointer to ifnet */
543
        struct        in6_ifaddr *in6m_ia;        /* back pointer to in6_ifaddr */
544
        u_int        in6m_refcount;                /* # membership claims by sockets */
545
        u_int        in6m_state;                /* state of the membership */
546
        int        in6m_timer;                /* delay to send the 1st report */
547
        struct timeval in6m_timer_expire; /* when the timer expires */
548
        callout_t in6m_timer_ch;
549
};
550
551
#define IN6M_TIMER_UNDEF -1
552
553
554
#ifdef _KERNEL
555
/* flags to in6_update_ifa */
556
#define IN6_IFAUPDATE_DADDELAY        0x1 /* first time to configure an address */
557
558
/*
559
 * Structure used by macros below to remember position when stepping through
560
 * all of the in6_multi records.
561
 */
562
struct        in6_multistep {
563
        struct        in6_ifaddr *i_ia;
564
        struct        in6_multi *i_in6m;
565
};
566
567
/*
568
 * Macros for looking up the in6_multi record for a given IP6 multicast
569
 * address on a given interface. If no matching record is found, "in6m"
570
 * returns NULL.
571
 */
572
573
static inline struct in6_multi *
574
in6_lookup_multi(struct in6_addr *addr, struct ifnet *ifp)
575
{
576
        struct in6_multi *in6m;
577
        struct in6_ifaddr *ia;
578
579
        if ((ia = ifp_to_ia6(ifp)) == NULL)
580
                  return NULL;
581
        LIST_FOREACH(in6m, &ia->ia6_multiaddrs, in6m_entry) {
582
                if (IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr, addr))
583
                        break;
584
        }
585
        return in6m;
586
}
587
588
#define IN6_LOOKUP_MULTI(__addr, __ifp, __in6m)                        \
589
/* struct in6_addr __addr; */                                        \
590
/* struct ifnet *__ifp; */                                        \
591
/* struct in6_multi *__in6m; */                                        \
592
do {                                                                \
593
        (__in6m) = in6_lookup_multi(&(__addr), (__ifp));        \
594
} while (/*CONSTCOND*/ 0)
595
596
/*
597
 * Macro to step through all of the in6_multi records, one at a time.
598
 * The current position is remembered in "step", which the caller must
599
 * provide.  IN6_FIRST_MULTI(), below, must be called to initialize "step"
600
 * and get the first record.  Both macros return a NULL "in6m" when there
601
 * are no remaining records.
602
 */
603
static inline struct in6_multi *
604
in6_next_multi(struct in6_multistep *step)
605
{
606
        struct in6_multi *in6m;
607
608
        if ((in6m = step->i_in6m) != NULL) {
609
                step->i_in6m = LIST_NEXT(in6m, in6m_entry);
610
                return in6m;
611
        }
612
        while (step->i_ia != NULL) {
613
                in6m = LIST_FIRST(&step->i_ia->ia6_multiaddrs);
614
                step->i_ia = step->i_ia->ia_next;
615
                if (in6m != NULL) {
616
                        step->i_in6m = LIST_NEXT(in6m, in6m_entry);
617
                        break;
618
                }
619
        }
620
        return in6m;
621
}
622
623
static inline struct in6_multi *
624
in6_first_multi(struct in6_multistep *step)
625
{
626
        step->i_ia = in6_ifaddr;
627
        step->i_in6m = NULL;
628
        return in6_next_multi(step);
629
}
630
631
#define IN6_NEXT_MULTI(__step, __in6m)                \
632
/* struct in6_multistep __step; */                \
633
/* struct in6_multi *__in6m; */                        \
634
do {                                                \
635
        (__in6m) = in6_next_multi(&(__step));        \
636
} while (/*CONSTCOND*/ 0)
637
638
#define IN6_FIRST_MULTI(__step, __in6m)                \
639
/* struct in6_multistep __step; */                \
640
/* struct in6_multi *__in6m */                        \
641
do {                                                \
642
        (__in6m) = in6_first_multi(&(__step));        \
643
} while (/*CONSTCOND*/ 0)
644
645
646
#if 0
647
/*
648
 * Macros for looking up the in6_multi_mship record for a given IP6 multicast
649
 * address on a given interface. If no matching record is found, "imm"
650
 * returns NULL.
651
 */
652
static inline struct in6_multi_mship *
653
in6_lookup_mship(struct in6_addr *addr, struct ifnet *ifp,
654
    struct ip6_moptions *imop)
655
{
656
        struct in6_multi_mship *imm;
657

658
        LIST_FOREACH(imm, &imop->im6o_memberships, i6mm_chain) {
659
                if (imm->i6mm_maddr->in6m_ifp != ifp)
660
                            continue;
661
                if (IN6_ARE_ADDR_EQUAL(&imm->i6mm_maddr->in6m_addr,
662
                    addr))
663
                        break;
664
        }
665
        return imm;
666
}
667

668
#define IN6_LOOKUP_MSHIP(__addr, __ifp, __imop, __imm)                        \
669
/* struct in6_addr __addr; */                                                \
670
/* struct ifnet *__ifp; */                                                \
671
/* struct ip6_moptions *__imop */                                        \
672
/* struct in6_multi_mship *__imm; */                                        \
673
do {                                                                        \
674
        (__imm) = in6_lookup_mship(&(__addr), (__ifp), (__imop));        \
675
} while (/*CONSTCOND*/ 0)
676
#endif
677
678
struct        in6_multi *in6_addmulti(struct in6_addr *, struct ifnet *,
679
        int *, int);
680
void        in6_delmulti(struct in6_multi *);
681
struct in6_multi_mship *in6_joingroup(struct ifnet *, struct in6_addr *,
682
        int *, int);
683
int        in6_leavegroup(struct in6_multi_mship *);
684
int        in6_mask2len(struct in6_addr *, u_char *);
685
int        in6_control(struct socket *, u_long, void *, struct ifnet *);
686
int        in6_update_ifa(struct ifnet *, struct in6_aliasreq *,
687
        struct in6_ifaddr *, int);
688
void        in6_purgeaddr(struct ifaddr *);
689
void        in6_purgeif(struct ifnet *);
690
void        in6_savemkludge(struct in6_ifaddr *);
691
void        in6_setmaxmtu  (void);
692
int        in6_if2idlen  (struct ifnet *);
693
void        *in6_domifattach(struct ifnet *);
694
void        in6_domifdetach(struct ifnet *, void *);
695
void        in6_restoremkludge(struct in6_ifaddr *, struct ifnet *);
696
void        in6_ifremlocal(struct ifaddr *);
697
void        in6_ifaddlocal(struct ifaddr *);
698
void        in6_createmkludge(struct ifnet *);
699
void        in6_purgemkludge(struct ifnet *);
700
struct in6_ifaddr *in6ifa_ifpforlinklocal(const struct ifnet *, int);
701
struct in6_ifaddr *in6ifa_ifpwithaddr(const struct ifnet *,
702
    const struct in6_addr *);
703
char        *ip6_sprintf(const struct in6_addr *);
704
int        in6_matchlen(struct in6_addr *, struct in6_addr *);
705
int        in6_are_prefix_equal(struct in6_addr *, struct in6_addr *, int);
706
void        in6_prefixlen2mask(struct in6_addr *, int);
707
void        in6_purgeprefix(struct ifnet *);
708
709
int        ip6flow_fastforward(struct mbuf **); /* IPv6 fast forward routine */
710
711
int in6_src_ioctl(u_long, void *);
712
int        in6_is_addr_deprecated(struct sockaddr_in6 *);
713
struct in6pcb;
714
#endif /* _KERNEL */
715
716
#endif /* !_NETINET6_IN6_VAR_H_ */