]>
Commit | Line | Data |
---|---|---|
9bccf70c A |
1 | /* $FreeBSD: src/sys/netinet6/nd6.h,v 1.2.2.3 2001/08/13 01:10:49 simokawa Exp $ */ |
2 | /* $KAME: nd6.h,v 1.55 2001/04/27 15:09:49 itojun Exp $ */ | |
1c79356b A |
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_ | |
9bccf70c | 35 | #include <sys/appleapiopts.h> |
1c79356b A |
36 | |
37 | /* see net/route.h, or net/if_inarp.h */ | |
38 | #ifndef RTF_ANNOUNCE | |
39 | #define RTF_ANNOUNCE RTF_PROTO2 | |
40 | #endif | |
41 | ||
42 | #include <sys/queue.h> | |
43 | ||
44 | struct llinfo_nd6 { | |
45 | struct llinfo_nd6 *ln_next; | |
46 | struct llinfo_nd6 *ln_prev; | |
47 | struct rtentry *ln_rt; | |
48 | struct mbuf *ln_hold; /* last packet until resolved/timeout */ | |
49 | long ln_asked; /* number of queries already sent for this addr */ | |
50 | u_long ln_expire; /* lifetime for NDP state transition */ | |
51 | short ln_state; /* reachability state */ | |
52 | short ln_router; /* 2^0: ND6 router bit */ | |
9bccf70c | 53 | int ln_byhint; /* # of times we made it reachable by UL hint */ |
1c79356b A |
54 | }; |
55 | ||
56 | #define ND6_LLINFO_NOSTATE -2 | |
9bccf70c A |
57 | /* |
58 | * We don't need the WAITDELETE state any more, but we keep the definition | |
59 | * in a comment line instead of removing it. This is necessary to avoid | |
60 | * unintentionally reusing the value for another purpose, which might | |
61 | * affect backward compatibility with old applications. | |
62 | * (20000711 jinmei@kame.net) | |
63 | */ | |
64 | /* #define ND6_LLINFO_WAITDELETE -1 */ | |
1c79356b A |
65 | #define ND6_LLINFO_INCOMPLETE 0 |
66 | #define ND6_LLINFO_REACHABLE 1 | |
67 | #define ND6_LLINFO_STALE 2 | |
68 | #define ND6_LLINFO_DELAY 3 | |
69 | #define ND6_LLINFO_PROBE 4 | |
70 | ||
71 | #define ND6_IS_LLINFO_PROBREACH(n) ((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 receivedra; | |
55e303ae | 83 | /* the following 3 members are for privacy extension for addrconf */ |
9bccf70c A |
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 */ | |
1c79356b A |
87 | }; |
88 | ||
89 | #define ND6_IFF_PERFORMNUD 0x1 | |
90 | ||
91 | struct in6_nbrinfo { | |
92 | char ifname[IFNAMSIZ]; /* if name, e.g. "en0" */ | |
93 | struct in6_addr addr; /* IPv6 address of the neighbor */ | |
94 | long asked; /* number of queries already sent for this addr */ | |
95 | int isrouter; /* if it acts as a router */ | |
96 | int state; /* reachability state */ | |
97 | int expire; /* lifetime for NDP state transition */ | |
98 | }; | |
99 | ||
100 | #define DRLSTSIZ 10 | |
101 | #define PRLSTSIZ 10 | |
102 | struct in6_drlist { | |
103 | char ifname[IFNAMSIZ]; | |
104 | struct { | |
105 | struct in6_addr rtaddr; | |
106 | u_char flags; | |
107 | u_short rtlifetime; | |
108 | u_long expire; | |
109 | u_short if_index; | |
110 | } defrouter[DRLSTSIZ]; | |
111 | }; | |
112 | ||
9bccf70c A |
113 | struct in6_defrouter { |
114 | struct sockaddr_in6 rtaddr; | |
115 | u_char flags; | |
116 | u_short rtlifetime; | |
117 | u_long expire; | |
118 | u_short if_index; | |
119 | }; | |
120 | ||
1c79356b A |
121 | struct in6_prlist { |
122 | char ifname[IFNAMSIZ]; | |
123 | struct { | |
124 | struct in6_addr prefix; | |
125 | struct prf_ra raflags; | |
126 | u_char prefixlen; | |
127 | u_char origin; | |
128 | u_long vltime; | |
129 | u_long pltime; | |
130 | u_long expire; | |
131 | u_short if_index; | |
132 | u_short advrtrs; /* number of advertisement routers */ | |
133 | struct in6_addr advrtr[DRLSTSIZ]; /* XXX: explicit limit */ | |
134 | } prefix[PRLSTSIZ]; | |
135 | }; | |
136 | ||
9bccf70c A |
137 | struct in6_prefix { |
138 | struct sockaddr_in6 prefix; | |
139 | struct prf_ra raflags; | |
140 | u_char prefixlen; | |
141 | u_char origin; | |
142 | u_long vltime; | |
143 | u_long pltime; | |
144 | u_long expire; | |
145 | u_int32_t flags; | |
146 | int refcnt; | |
147 | u_short if_index; | |
148 | u_short advrtrs; /* number of advertisement routers */ | |
149 | /* struct sockaddr_in6 advrtr[] */ | |
150 | }; | |
151 | ||
152 | struct in6_ondireq { | |
153 | char ifname[IFNAMSIZ]; | |
154 | struct { | |
155 | u_int32_t linkmtu; /* LinkMTU */ | |
156 | u_int32_t maxmtu; /* Upper bound of LinkMTU */ | |
157 | u_int32_t basereachable; /* BaseReachableTime */ | |
158 | u_int32_t reachable; /* Reachable Time */ | |
159 | u_int32_t retrans; /* Retrans Timer */ | |
160 | u_int32_t flags; /* Flags */ | |
161 | int recalctm; /* BaseReacable re-calculation timer */ | |
162 | u_int8_t chlim; /* CurHopLimit */ | |
163 | u_int8_t receivedra; | |
164 | } ndi; | |
165 | }; | |
166 | ||
1c79356b A |
167 | struct in6_ndireq { |
168 | char ifname[IFNAMSIZ]; | |
169 | struct nd_ifinfo ndi; | |
170 | }; | |
171 | ||
172 | struct in6_ndifreq { | |
173 | char ifname[IFNAMSIZ]; | |
174 | u_long ifindex; | |
175 | }; | |
176 | ||
9bccf70c A |
177 | /* Prefix status */ |
178 | #define NDPRF_ONLINK 0x1 | |
179 | #define NDPRF_DETACHED 0x2 | |
1c79356b A |
180 | |
181 | /* protocol constants */ | |
182 | #define MAX_RTR_SOLICITATION_DELAY 1 /*1sec*/ | |
183 | #define RTR_SOLICITATION_INTERVAL 4 /*4sec*/ | |
184 | #define MAX_RTR_SOLICITATIONS 3 | |
185 | ||
186 | #define ND6_INFINITE_LIFETIME 0xffffffff | |
187 | ||
9bccf70c A |
188 | #ifdef KERNEL |
189 | #ifdef __APPLE_API_PRIVATE | |
1c79356b A |
190 | /* node constants */ |
191 | #define MAX_REACHABLE_TIME 3600000 /* msec */ | |
192 | #define REACHABLE_TIME 30000 /* msec */ | |
193 | #define RETRANS_TIMER 1000 /* msec */ | |
194 | #define MIN_RANDOM_FACTOR 512 /* 1024 * 0.5 */ | |
195 | #define MAX_RANDOM_FACTOR 1536 /* 1024 * 1.5 */ | |
9bccf70c A |
196 | #define DEF_TEMP_VALID_LIFETIME 604800 /* 1 week */ |
197 | #define DEF_TEMP_PREFERRED_LIFETIME 86400 /* 1 day */ | |
198 | #define TEMPADDR_REGEN_ADVANCE 5 /* sec */ | |
199 | #define MAX_TEMP_DESYNC_FACTOR 600 /* 10 min */ | |
1c79356b A |
200 | #define ND_COMPUTE_RTIME(x) \ |
201 | (((MIN_RANDOM_FACTOR * (x >> 10)) + (random() & \ | |
202 | ((MAX_RANDOM_FACTOR - MIN_RANDOM_FACTOR) * (x >> 10)))) /1000) | |
1c79356b A |
203 | |
204 | TAILQ_HEAD(nd_drhead, nd_defrouter); | |
205 | struct nd_defrouter { | |
206 | TAILQ_ENTRY(nd_defrouter) dr_entry; | |
207 | struct in6_addr rtaddr; | |
55e303ae | 208 | u_char flags; /* flags on RA message */ |
1c79356b A |
209 | u_short rtlifetime; |
210 | u_long expire; | |
211 | u_long advint; /* Mobile IPv6 addition (milliseconds) */ | |
212 | u_long advint_expire; /* Mobile IPv6 addition */ | |
213 | int advints_lost; /* Mobile IPv6 addition */ | |
214 | struct ifnet *ifp; | |
215 | }; | |
216 | ||
217 | struct nd_prefix { | |
218 | struct ifnet *ndpr_ifp; | |
219 | LIST_ENTRY(nd_prefix) ndpr_entry; | |
220 | struct sockaddr_in6 ndpr_prefix; /* prefix */ | |
221 | struct in6_addr ndpr_mask; /* netmask derived from the prefix */ | |
222 | struct in6_addr ndpr_addr; /* address that is derived from the prefix */ | |
223 | u_int32_t ndpr_vltime; /* advertised valid lifetime */ | |
224 | u_int32_t ndpr_pltime; /* advertised preferred lifetime */ | |
225 | time_t ndpr_expire; /* expiration time of the prefix */ | |
226 | time_t ndpr_preferred; /* preferred time of the prefix */ | |
227 | struct prf_ra ndpr_flags; | |
9bccf70c | 228 | u_int32_t ndpr_stateflags; /* actual state flags */ |
1c79356b A |
229 | /* list of routers that advertise the prefix: */ |
230 | LIST_HEAD(pr_rtrhead, nd_pfxrouter) ndpr_advrtrs; | |
231 | u_char ndpr_plen; | |
9bccf70c | 232 | int ndpr_refcnt; /* reference couter from addresses */ |
1c79356b A |
233 | }; |
234 | ||
235 | #define ndpr_next ndpr_entry.le_next | |
236 | ||
237 | #define ndpr_raf ndpr_flags | |
238 | #define ndpr_raf_onlink ndpr_flags.onlink | |
239 | #define ndpr_raf_auto ndpr_flags.autonomous | |
240 | ||
1c79356b A |
241 | /* |
242 | * We keep expired prefix for certain amount of time, for validation purposes. | |
243 | * 1800s = MaxRtrAdvInterval | |
244 | */ | |
245 | #define NDPR_KEEP_EXPIRED (1800 * 2) | |
246 | ||
247 | /* | |
248 | * Message format for use in obtaining information about prefixes | |
249 | * from inet6 sysctl function | |
250 | */ | |
251 | struct inet6_ndpr_msghdr { | |
252 | u_short inpm_msglen; /* to skip over non-understood messages */ | |
55e303ae | 253 | u_char inpm_version; /* future binary compatibility */ |
1c79356b A |
254 | u_char inpm_type; /* message type */ |
255 | struct in6_addr inpm_prefix; | |
256 | u_long prm_vltim; | |
257 | u_long prm_pltime; | |
258 | u_long prm_expire; | |
259 | u_long prm_preferred; | |
260 | struct in6_prflags prm_flags; | |
261 | u_short prm_index; /* index for associated ifp */ | |
262 | u_char prm_plen; /* length of prefix in bits */ | |
263 | }; | |
264 | ||
265 | #define prm_raf_onlink prm_flags.prf_ra.onlink | |
266 | #define prm_raf_auto prm_flags.prf_ra.autonomous | |
267 | ||
268 | #define prm_statef_onlink prm_flags.prf_state.onlink | |
269 | ||
270 | #define prm_rrf_decrvalid prm_flags.prf_rr.decrvalid | |
271 | #define prm_rrf_decrprefd prm_flags.prf_rr.decrprefd | |
272 | ||
273 | #define ifpr2ndpr(ifpr) ((struct nd_prefix *)(ifpr)) | |
274 | #define ndpr2ifpr(ndpr) ((struct ifprefix *)(ndpr)) | |
275 | ||
276 | struct nd_pfxrouter { | |
277 | LIST_ENTRY(nd_pfxrouter) pfr_entry; | |
278 | #define pfr_next pfr_entry.le_next | |
279 | struct nd_defrouter *router; | |
280 | }; | |
281 | ||
282 | LIST_HEAD(nd_prhead, nd_prefix); | |
283 | ||
284 | /* nd6.c */ | |
285 | extern int nd6_prune; | |
286 | extern int nd6_delay; | |
287 | extern int nd6_umaxtries; | |
288 | extern int nd6_mmaxtries; | |
289 | extern int nd6_useloopback; | |
9bccf70c A |
290 | extern int nd6_maxnudhint; |
291 | extern int nd6_gctimer; | |
1c79356b A |
292 | extern struct llinfo_nd6 llinfo_nd6; |
293 | extern struct nd_ifinfo *nd_ifinfo; | |
294 | extern struct nd_drhead nd_defrouter; | |
295 | extern struct nd_prhead nd_prefix; | |
9bccf70c A |
296 | extern int nd6_debug; |
297 | ||
298 | #define nd6log(x) do { if (nd6_debug) log x; } while (0) | |
299 | ||
300 | extern struct callout nd6_timer_ch; | |
1c79356b A |
301 | |
302 | /* nd6_rtr.c */ | |
1c79356b | 303 | extern int nd6_defifindex; |
9bccf70c A |
304 | extern int ip6_desync_factor; /* seconds */ |
305 | extern u_int32_t ip6_temp_preferred_lifetime; /* seconds */ | |
306 | extern u_int32_t ip6_temp_valid_lifetime; /* seconds */ | |
307 | extern int ip6_temp_regen_advance; /* seconds */ | |
1c79356b A |
308 | |
309 | union nd_opts { | |
310 | struct nd_opt_hdr *nd_opt_array[9]; /*max = home agent info*/ | |
311 | struct { | |
312 | struct nd_opt_hdr *zero; | |
313 | struct nd_opt_hdr *src_lladdr; | |
314 | struct nd_opt_hdr *tgt_lladdr; | |
55e303ae | 315 | struct nd_opt_prefix_info *pi_beg; /* multiple opts, start */ |
1c79356b A |
316 | struct nd_opt_rd_hdr *rh; |
317 | struct nd_opt_mtu *mtu; | |
318 | struct nd_opt_hdr *six; | |
319 | struct nd_opt_advint *adv; | |
320 | struct nd_opt_hai *hai; | |
321 | struct nd_opt_hdr *search; /* multiple opts */ | |
322 | struct nd_opt_hdr *last; /* multiple opts */ | |
323 | int done; | |
324 | struct nd_opt_prefix_info *pi_end;/* multiple opts, end */ | |
325 | } nd_opt_each; | |
326 | }; | |
327 | #define nd_opts_src_lladdr nd_opt_each.src_lladdr | |
328 | #define nd_opts_tgt_lladdr nd_opt_each.tgt_lladdr | |
329 | #define nd_opts_pi nd_opt_each.pi_beg | |
330 | #define nd_opts_pi_end nd_opt_each.pi_end | |
331 | #define nd_opts_rh nd_opt_each.rh | |
332 | #define nd_opts_mtu nd_opt_each.mtu | |
333 | #define nd_opts_adv nd_opt_each.adv | |
334 | #define nd_opts_hai nd_opt_each.hai | |
335 | #define nd_opts_search nd_opt_each.search | |
336 | #define nd_opts_last nd_opt_each.last | |
337 | #define nd_opts_done nd_opt_each.done | |
338 | ||
339 | /* XXX: need nd6_var.h?? */ | |
340 | /* nd6.c */ | |
341 | void nd6_init __P((void)); | |
342 | void nd6_ifattach __P((struct ifnet *)); | |
9bccf70c | 343 | int nd6_is_addr_neighbor __P((struct sockaddr_in6 *, struct ifnet *)); |
1c79356b A |
344 | void nd6_option_init __P((void *, int, union nd_opts *)); |
345 | struct nd_opt_hdr *nd6_option __P((union nd_opts *)); | |
346 | int nd6_options __P((union nd_opts *)); | |
347 | struct rtentry *nd6_lookup __P((struct in6_addr *, int, struct ifnet *)); | |
348 | void nd6_setmtu __P((struct ifnet *)); | |
349 | void nd6_timer __P((void *)); | |
350 | void nd6_purge __P((struct ifnet *)); | |
9bccf70c A |
351 | struct llinfo_nd6 *nd6_free __P((struct rtentry *)); |
352 | void nd6_nud_hint __P((struct rtentry *, struct in6_addr *, int)); | |
1c79356b A |
353 | int nd6_resolve __P((struct ifnet *, struct rtentry *, |
354 | struct mbuf *, struct sockaddr *, u_char *)); | |
1c79356b | 355 | void nd6_rtrequest __P((int, struct rtentry *, struct sockaddr *)); |
1c79356b A |
356 | int nd6_ioctl __P((u_long, caddr_t, struct ifnet *)); |
357 | struct rtentry *nd6_cache_lladdr __P((struct ifnet *, struct in6_addr *, | |
358 | char *, int, int, int)); | |
9bccf70c A |
359 | int nd6_output __P((struct ifnet *, struct ifnet *, struct mbuf *, |
360 | struct sockaddr_in6 *, struct rtentry *)); | |
1c79356b A |
361 | int nd6_storelladdr __P((struct ifnet *, struct rtentry *, struct mbuf *, |
362 | struct sockaddr *, u_char *)); | |
9bccf70c | 363 | int nd6_need_cache __P((struct ifnet *)); |
1c79356b A |
364 | |
365 | /* nd6_nbr.c */ | |
366 | void nd6_na_input __P((struct mbuf *, int, int)); | |
9bccf70c A |
367 | void nd6_na_output __P((struct ifnet *, const struct in6_addr *, |
368 | const struct in6_addr *, u_long, int, struct sockaddr *)); | |
1c79356b | 369 | void nd6_ns_input __P((struct mbuf *, int, int)); |
9bccf70c A |
370 | void nd6_ns_output __P((struct ifnet *, const struct in6_addr *, |
371 | const struct in6_addr *, struct llinfo_nd6 *, int)); | |
1c79356b A |
372 | caddr_t nd6_ifptomac __P((struct ifnet *)); |
373 | void nd6_dad_start __P((struct ifaddr *, int *)); | |
9bccf70c | 374 | void nd6_dad_stop __P((struct ifaddr *)); |
1c79356b A |
375 | void nd6_dad_duplicated __P((struct ifaddr *)); |
376 | ||
377 | /* nd6_rtr.c */ | |
378 | void nd6_rs_input __P((struct mbuf *, int, int)); | |
379 | void nd6_ra_input __P((struct mbuf *, int, int)); | |
380 | void prelist_del __P((struct nd_prefix *)); | |
381 | void defrouter_addreq __P((struct nd_defrouter *)); | |
382 | void defrouter_delreq __P((struct nd_defrouter *, int)); | |
383 | void defrouter_select __P((void)); | |
384 | void defrtrlist_del __P((struct nd_defrouter *)); | |
385 | void prelist_remove __P((struct nd_prefix *)); | |
386 | int prelist_update __P((struct nd_prefix *, struct nd_defrouter *, | |
9bccf70c A |
387 | struct mbuf *)); |
388 | int nd6_prelist_add __P((struct nd_prefix *, struct nd_defrouter *, | |
389 | struct nd_prefix **)); | |
390 | int nd6_prefix_onlink __P((struct nd_prefix *)); | |
391 | int nd6_prefix_offlink __P((struct nd_prefix *)); | |
1c79356b | 392 | void pfxlist_onlink_check __P((void)); |
1c79356b A |
393 | struct nd_defrouter *defrouter_lookup __P((struct in6_addr *, |
394 | struct ifnet *)); | |
9bccf70c | 395 | struct nd_prefix *nd6_prefix_lookup __P((struct nd_prefix *)); |
1c79356b A |
396 | int in6_init_prefix_ltimes __P((struct nd_prefix *ndpr)); |
397 | void rt6_flush __P((struct in6_addr *, struct ifnet *)); | |
398 | int nd6_setdefaultiface __P((int)); | |
9bccf70c | 399 | int in6_tmpifadd __P((const struct in6_ifaddr *, int)); |
1c79356b | 400 | |
9bccf70c | 401 | #endif /* __APPLE_API_PRIVATE */ |
1c79356b A |
402 | #endif /* KERNEL */ |
403 | ||
404 | #endif /* _NETINET6_ND6_H_ */ |