Project

General

Profile

Statistics
| Revision:

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

History | View | Annotate | Download (15.1 KB)

1 13 up20180614
/*        $NetBSD: nd6.h,v 1.66 2015/07/17 02:21:08 ozaki-r Exp $        */
2
/*        $KAME: nd6.h,v 1.95 2002/06/08 11:31:06 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
#ifndef _NETINET6_ND6_H_
34
#define _NETINET6_ND6_H_
35
36
#include <sys/queue.h>
37
#include <sys/callout.h>
38
39
struct        llinfo_nd6 {
40
        struct        llinfo_nd6 *ln_next;
41
        struct        llinfo_nd6 *ln_prev;
42
        struct        rtentry *ln_rt;
43
        struct        mbuf *ln_hold;        /* last packet until resolved/timeout */
44
        long        ln_asked;        /* number of queries already sent for this addr */
45
        u_long        ln_expire;        /* lifetime for NDP state transition */
46
        short        ln_state;        /* reachability state */
47
        short        ln_router;        /* 2^0: ND6 router bit */
48
        int        ln_byhint;        /* # of times we made it reachable by UL hint */
49
50
        long        ln_ntick;
51
        struct callout ln_timer_ch;
52
};
53
54
#define ND6_LLINFO_PURGE        -3
55
#define ND6_LLINFO_NOSTATE        -2
56
/*
57
 * We don't need the WAITDELETE state any more, but we keep the definition
58
 * in a comment line instead of removing it. This is necessary to avoid
59
 * unintentionally reusing the value for another purpose, which might
60
 * affect backward compatibility with old applications.
61
 * (20000711 jinmei@kame.net)
62
 */
63
/* #define ND6_LLINFO_WAITDELETE        -1 */
64
#define ND6_LLINFO_INCOMPLETE        0
65
#define ND6_LLINFO_REACHABLE        1
66
#define ND6_LLINFO_STALE        2
67
#define ND6_LLINFO_DELAY        3
68
#define ND6_LLINFO_PROBE        4
69
70
#define ND6_IS_LLINFO_PROBREACH(n) ((n)->ln_state > ND6_LLINFO_INCOMPLETE)
71
#define ND6_LLINFO_PERMANENT(n)        (((n)->ln_expire == 0) && ((n)->ln_state > ND6_LLINFO_INCOMPLETE))
72
73
struct nd_ifinfo {
74
        u_int32_t linkmtu;                /* LinkMTU */
75
        u_int32_t maxmtu;                /* Upper bound of LinkMTU */
76
        u_int32_t basereachable;        /* BaseReachableTime */
77
        u_int32_t reachable;                /* Reachable Time */
78
        u_int32_t retrans;                /* Retrans Timer */
79
        u_int32_t flags;                /* Flags */
80
        int recalctm;                        /* BaseReacable re-calculation timer */
81
        u_int8_t chlim;                        /* CurHopLimit */
82
        u_int8_t initialized; /* Flag to see the entry is initialized */
83
        /* the following 3 members are for privacy extension for addrconf */
84
        u_int8_t randomseed0[8]; /* upper 64 bits of MD5 digest */
85
        u_int8_t randomseed1[8]; /* lower 64 bits (usually the EUI64 IFID) */
86
        u_int8_t randomid[8];        /* current random ID */
87
};
88
89
#define ND6_IFF_PERFORMNUD        0x01
90
#define ND6_IFF_ACCEPT_RTADV        0x02        /* See "RTADV Key", below. */
91
#define ND6_IFF_PREFER_SOURCE        0x04        /* XXX: not related to ND. */
92
#define ND6_IFF_IFDISABLED        0x08        /* IPv6 operation is disabled due to
93
                                         * DAD failure.  (XXX: not ND-specific)
94
                                         */
95
#define        ND6_IFF_OVERRIDE_RTADV        0x10        /* See "RTADV Key", below. */
96
#define        ND6_IFF_AUTO_LINKLOCAL        0x20
97
98
/*
99
 * RTADV Key
100
 *
101
 * The flags ND6_IFF_ACCEPT_RTADV and ND6_IFF_OVERRIDE_RTADV form a
102
 * tri-state variable.  (There are actually four different states, but
103
 * two of the states are functionally identical.)
104
 *
105
 * ND6_IFF_OVERRIDE_RTADV or 0:        This interface does not accept
106
 *                                Router Advertisements.
107
 *
108
 * ND6_IFF_OVERRIDE_RTADV|
109
 * ND6_IFF_ACCEPT_RTADV:        This interface accepts Router
110
 *                                Advertisements regardless of the
111
 *                                global setting, ip6_accept_rtadv.
112
 *
113
 * ND6_IFF_ACCEPT_RTADV:        This interface follows the global setting,
114
 *                                ip6_accept_rtadv.  If ip6_accept_rtadv == 0,
115
 *                                this interface does not accept Router
116
 *                                Advertisements.  If ip6_accept_rtadv != 0,
117
 *                                this interface does accept them.
118
 */
119
120
#ifdef _KERNEL
121
#define ND_IFINFO(ifp) \
122
        (((struct in6_ifextra *)(ifp)->if_afdata[AF_INET6])->nd_ifinfo)
123
#define IN6_LINKMTU(ifp) \
124
        ((ND_IFINFO(ifp)->linkmtu && ND_IFINFO(ifp)->linkmtu < (ifp)->if_mtu) \
125
            ? ND_IFINFO(ifp)->linkmtu \
126
            : ((ND_IFINFO(ifp)->maxmtu && ND_IFINFO(ifp)->maxmtu < (ifp)->if_mtu) \
127
                ? ND_IFINFO(ifp)->maxmtu : (ifp)->if_mtu))
128
#endif
129
130
struct in6_nbrinfo {
131
        char ifname[IFNAMSIZ];        /* if name, e.g. "en0" */
132
        struct in6_addr addr;        /* IPv6 address of the neighbor */
133
        long        asked;                /* number of queries already sent for this addr */
134
        int        isrouter;        /* if it acts as a router */
135
        int        state;                /* reachability state */
136
        int        expire;                /* lifetime for NDP state transition */
137
};
138
139
#define DRLSTSIZ 10
140
#define PRLSTSIZ 10
141
struct        in6_drlist {
142
        char ifname[IFNAMSIZ];
143
        struct {
144
                struct        in6_addr rtaddr;
145
                u_char        flags;
146
                u_short        rtlifetime;
147
                u_long        expire;
148
                u_short if_index;
149
        } defrouter[DRLSTSIZ];
150
};
151
152
struct        in6_defrouter {
153
        struct        sockaddr_in6 rtaddr;
154
        u_char        flags;
155
        u_short        rtlifetime;
156
        u_long        expire;
157
        u_short if_index;
158
};
159
160
#ifdef _KERNEL
161
struct        in6_oprlist {
162
        char ifname[IFNAMSIZ];
163
        struct {
164
                struct        in6_addr prefix;
165
                struct prf_ra raflags;
166
                u_char        prefixlen;
167
                u_char        origin;
168
                u_long vltime;
169
                u_long pltime;
170
                u_long expire;
171
                u_short if_index;
172
                u_short advrtrs; /* number of advertisement routers */
173
                struct        in6_addr advrtr[DRLSTSIZ]; /* XXX: explicit limit */
174
        } prefix[PRLSTSIZ];
175
};
176
#endif
177
178
struct        in6_prlist {
179
        char ifname[IFNAMSIZ];
180
        struct {
181
                struct        in6_addr prefix;
182
                struct prf_ra raflags;
183
                u_char        prefixlen;
184
                u_char        origin;
185
                u_int32_t vltime;
186
                u_int32_t pltime;
187
                time_t expire;
188
                u_short if_index;
189
                u_short advrtrs; /* number of advertisement routers */
190
                struct        in6_addr advrtr[DRLSTSIZ]; /* XXX: explicit limit */
191
        } prefix[PRLSTSIZ];
192
};
193
194
struct in6_prefix {
195
        struct        sockaddr_in6 prefix;
196
        struct prf_ra raflags;
197
        u_char        prefixlen;
198
        u_char        origin;
199
        u_int32_t vltime;
200
        u_int32_t pltime;
201
        time_t expire;
202
        u_int32_t flags;
203
        int refcnt;
204
        u_short if_index;
205
        u_short advrtrs; /* number of advertisement routers */
206
        /* struct sockaddr_in6 advrtr[] */
207
};
208
209
#ifdef _KERNEL
210
struct        in6_ondireq {
211
        char ifname[IFNAMSIZ];
212
        struct {
213
                u_int32_t linkmtu;        /* LinkMTU */
214
                u_int32_t maxmtu;        /* Upper bound of LinkMTU */
215
                u_int32_t basereachable; /* BaseReachableTime */
216
                u_int32_t reachable;        /* Reachable Time */
217
                u_int32_t retrans;        /* Retrans Timer */
218
                u_int32_t flags;        /* Flags */
219
                int recalctm;                /* BaseReacable re-calculation timer */
220
                u_int8_t chlim;                /* CurHopLimit */
221
                u_int8_t receivedra;
222
        } ndi;
223
};
224
#endif
225
226
struct        in6_ndireq {
227
        char ifname[IFNAMSIZ];
228
        struct nd_ifinfo ndi;
229
};
230
231
struct        in6_ndifreq {
232
        char ifname[IFNAMSIZ];
233
        u_long ifindex;
234
};
235
236
/* Prefix status */
237
#define NDPRF_ONLINK                0x1
238
#define NDPRF_DETACHED                0x2
239
#define NDPRF_HOME                0x4
240
241
/* protocol constants */
242
#define MAX_RTR_SOLICITATION_DELAY        1        /* 1sec */
243
#define RTR_SOLICITATION_INTERVAL        4        /* 4sec */
244
#define MAX_RTR_SOLICITATIONS                3
245
246
#define ND6_INFINITE_LIFETIME                ((u_int32_t)~0)
247
248
#ifdef _KERNEL
249
/* node constants */
250
#define MAX_REACHABLE_TIME                3600000        /* msec */
251
#define REACHABLE_TIME                        30000        /* msec */
252
#define RETRANS_TIMER                        1000        /* msec */
253
#define MIN_RANDOM_FACTOR                512        /* 1024 * 0.5 */
254
#define MAX_RANDOM_FACTOR                1536        /* 1024 * 1.5 */
255
#define DEF_TEMP_VALID_LIFETIME                604800        /* 1 week */
256
#define DEF_TEMP_PREFERRED_LIFETIME        86400        /* 1 day */
257
#define TEMPADDR_REGEN_ADVANCE                5        /* sec */
258
#define MAX_TEMP_DESYNC_FACTOR                600        /* 10 min */
259
#define ND_COMPUTE_RTIME(x) \
260
                (((MIN_RANDOM_FACTOR * (x >> 10)) + (cprng_fast32() & \
261
                ((MAX_RANDOM_FACTOR - MIN_RANDOM_FACTOR) * (x >> 10)))) /1000)
262
263
TAILQ_HEAD(nd_drhead, nd_defrouter);
264
struct        nd_defrouter {
265
        TAILQ_ENTRY(nd_defrouter) dr_entry;
266
        struct        in6_addr rtaddr;
267
        u_char        flags;                /* flags on RA message */
268
        u_short        rtlifetime;
269
        u_long        expire;
270
        struct  ifnet *ifp;
271
        int        installed;        /* is installed into kernel routing table */
272
};
273
274
struct nd_prefixctl {
275
        struct ifnet *ndprc_ifp;
276
277
        /* prefix */
278
        struct sockaddr_in6 ndprc_prefix;
279
        u_char        ndprc_plen;
280
281
        u_int32_t ndprc_vltime;        /* advertised valid lifetime */
282
        u_int32_t ndprc_pltime;        /* advertised preferred lifetime */
283
284
        struct prf_ra ndprc_flags;
285
};
286
287
#define ndprc_raf                ndprc_flags
288
#define ndprc_raf_onlink        ndprc_flags.onlink
289
#define ndprc_raf_auto                ndprc_flags.autonomous
290
#define ndprc_raf_router        ndprc_flags.router
291
292
struct nd_prefix {
293
        struct ifnet *ndpr_ifp;
294
        LIST_ENTRY(nd_prefix) ndpr_entry;
295
        struct sockaddr_in6 ndpr_prefix;        /* prefix */
296
        struct in6_addr ndpr_mask; /* netmask derived from the prefix */
297
298
        u_int32_t ndpr_vltime;        /* advertised valid lifetime */
299
        u_int32_t ndpr_pltime;        /* advertised preferred lifetime */
300
301
        time_t ndpr_expire;        /* expiration time of the prefix */
302
        time_t ndpr_preferred;        /* preferred time of the prefix */
303
        time_t ndpr_lastupdate; /* reception time of last advertisement */
304
305
        struct prf_ra ndpr_flags;
306
        u_int32_t ndpr_stateflags; /* actual state flags */
307
        /* list of routers that advertise the prefix: */
308
        LIST_HEAD(pr_rtrhead, nd_pfxrouter) ndpr_advrtrs;
309
        u_char        ndpr_plen;
310
        int        ndpr_refcnt;        /* reference couter from addresses */
311
};
312
313
#define ndpr_next                ndpr_entry.le_next
314
315
#define ndpr_raf                ndpr_flags
316
#define ndpr_raf_onlink                ndpr_flags.onlink
317
#define ndpr_raf_auto                ndpr_flags.autonomous
318
#define ndpr_raf_router                ndpr_flags.router
319
320
/*
321
 * Message format for use in obtaining information about prefixes
322
 * from inet6 sysctl function
323
 */
324
struct inet6_ndpr_msghdr {
325
        u_short        inpm_msglen;        /* to skip over non-understood messages */
326
        u_char        inpm_version;        /* future binary compatibility */
327
        u_char        inpm_type;        /* message type */
328
        struct in6_addr inpm_prefix;
329
        u_long        prm_vltim;
330
        u_long        prm_pltime;
331
        u_long        prm_expire;
332
        u_long        prm_preferred;
333
        struct in6_prflags prm_flags;
334
        u_short        prm_index;        /* index for associated ifp */
335
        u_char        prm_plen;        /* length of prefix in bits */
336
};
337
338
#define prm_raf_onlink                prm_flags.prf_ra.onlink
339
#define prm_raf_auto                prm_flags.prf_ra.autonomous
340
341
#define prm_statef_onlink        prm_flags.prf_state.onlink
342
343
#define prm_rrf_decrvalid        prm_flags.prf_rr.decrvalid
344
#define prm_rrf_decrprefd        prm_flags.prf_rr.decrprefd
345
346
struct nd_pfxrouter {
347
        LIST_ENTRY(nd_pfxrouter) pfr_entry;
348
        struct nd_defrouter *router;
349
};
350
351
LIST_HEAD(nd_prhead, nd_prefix);
352
353
#include <sys/mallocvar.h>
354
MALLOC_DECLARE(M_IP6NDP);
355
356
/* nd6.c */
357
extern int nd6_prune;
358
extern int nd6_delay;
359
extern int nd6_umaxtries;
360
extern int nd6_mmaxtries;
361
extern int nd6_useloopback;
362
extern int nd6_maxnudhint;
363
extern int nd6_gctimer;
364
extern struct llinfo_nd6 llinfo_nd6;
365
extern struct nd_drhead nd_defrouter;
366
extern struct nd_prhead nd_prefix;
367
extern int nd6_debug;
368
369
#define nd6log(x)        do { if (nd6_debug) log x; } while (/*CONSTCOND*/ 0)
370
371
extern struct callout nd6_timer_ch;
372
373
/* nd6_rtr.c */
374
extern int nd6_defifindex;
375
extern int ip6_desync_factor;        /* seconds */
376
extern u_int32_t ip6_temp_preferred_lifetime; /* seconds */
377
extern u_int32_t ip6_temp_valid_lifetime; /* seconds */
378
extern int ip6_temp_regen_advance; /* seconds */
379
extern int nd6_numroutes;
380
381
union nd_opts {
382
        struct nd_opt_hdr *nd_opt_array[8];
383
        struct {
384
                struct nd_opt_hdr *zero;
385
                struct nd_opt_hdr *src_lladdr;
386
                struct nd_opt_hdr *tgt_lladdr;
387
                struct nd_opt_prefix_info *pi_beg; /* multiple opts, start */
388
                struct nd_opt_rd_hdr *rh;
389
                struct nd_opt_mtu *mtu;
390
                struct nd_opt_hdr *search;        /* multiple opts */
391
                struct nd_opt_hdr *last;        /* multiple opts */
392
                int done;
393
                struct nd_opt_prefix_info *pi_end;/* multiple opts, end */
394
        } nd_opt_each;
395
};
396
#define nd_opts_src_lladdr        nd_opt_each.src_lladdr
397
#define nd_opts_tgt_lladdr        nd_opt_each.tgt_lladdr
398
#define nd_opts_pi                nd_opt_each.pi_beg
399
#define nd_opts_pi_end                nd_opt_each.pi_end
400
#define nd_opts_rh                nd_opt_each.rh
401
#define nd_opts_mtu                nd_opt_each.mtu
402
#define nd_opts_search                nd_opt_each.search
403
#define nd_opts_last                nd_opt_each.last
404
#define nd_opts_done                nd_opt_each.done
405
406
/* XXX: need nd6_var.h?? */
407
/* nd6.c */
408
void nd6_init(void);
409
struct nd_ifinfo *nd6_ifattach(struct ifnet *);
410
void nd6_ifdetach(struct ifnet *, struct in6_ifextra *);
411
int nd6_is_addr_neighbor(const struct sockaddr_in6 *, struct ifnet *);
412
void nd6_option_init(void *, int, union nd_opts *);
413
struct nd_opt_hdr *nd6_option(union nd_opts *);
414
int nd6_options(union nd_opts *);
415
struct        rtentry *nd6_lookup(const struct in6_addr *, int, struct ifnet *);
416
void nd6_setmtu(struct ifnet *);
417
void nd6_llinfo_settimer(struct llinfo_nd6 *, long);
418
void nd6_timer(void *);
419
void nd6_purge(struct ifnet *, struct in6_ifextra *);
420
void nd6_nud_hint(struct rtentry *);
421
int nd6_resolve(struct ifnet *, struct rtentry *,
422
        struct mbuf *, struct sockaddr *, u_char *);
423
void nd6_rtrequest(int, struct rtentry *, const struct rt_addrinfo *);
424
int nd6_ioctl(u_long, void *, struct ifnet *);
425
void nd6_cache_lladdr(struct ifnet *, struct in6_addr *,
426
        char *, int, int, int);
427
int nd6_output(struct ifnet *, struct ifnet *, struct mbuf *,
428
        const struct sockaddr_in6 *, struct rtentry *);
429
int nd6_storelladdr(const struct ifnet *, const struct rtentry *, struct mbuf *,
430
        const struct sockaddr *, uint8_t *, size_t);
431
int nd6_sysctl(int, void *, size_t *, void *, size_t);
432
int nd6_need_cache(struct ifnet *);
433
void nd6_llinfo_release_pkts(struct llinfo_nd6 *, struct ifnet *,
434
    struct rtentry *);
435
436
/* nd6_nbr.c */
437
void nd6_na_input(struct mbuf *, int, int);
438
void nd6_na_output(struct ifnet *, const struct in6_addr *,
439
        const struct in6_addr *, u_long, int, const struct sockaddr *);
440
void nd6_ns_input(struct mbuf *, int, int);
441
void nd6_ns_output(struct ifnet *, const struct in6_addr *,
442
        const struct in6_addr *, struct llinfo_nd6 *, int);
443
const void *nd6_ifptomac(const struct ifnet *);
444
void nd6_dad_start(struct ifaddr *, int);
445
void nd6_dad_stop(struct ifaddr *);
446
void nd6_dad_duplicated(struct ifaddr *);
447
448
/* nd6_rtr.c */
449
void nd6_rs_input(struct mbuf *, int, int);
450
void nd6_ra_input(struct mbuf *, int, int);
451
void prelist_del(struct nd_prefix *);
452
void defrouter_addreq(struct nd_defrouter *);
453
void defrouter_reset(void);
454
void defrouter_select(void);
455
void defrtrlist_del(struct nd_defrouter *, struct in6_ifextra *);
456
void prelist_remove(struct nd_prefix *);
457
int nd6_prelist_add(struct nd_prefixctl *, struct nd_defrouter *,
458
        struct nd_prefix **);
459
int nd6_prefix_onlink(struct nd_prefix *);
460
int nd6_prefix_offlink(struct nd_prefix *);
461
void pfxlist_onlink_check(void);
462
struct nd_defrouter *defrouter_lookup(const struct in6_addr *, struct ifnet *);
463
struct nd_prefix *nd6_prefix_lookup(struct nd_prefixctl *);
464
int in6_ifdel(struct ifnet *, struct in6_addr *);
465
void rt6_flush(struct in6_addr *, struct ifnet *);
466
int nd6_setdefaultiface(int);
467
int in6_tmpifadd(const struct in6_ifaddr *, int, int);
468
bool nd6_accepts_rtadv(const struct nd_ifinfo *);
469
470
#endif /* _KERNEL */
471
472
#endif /* !_NETINET6_ND6_H_ */