1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #ifndef _NETINET6_ND6_H_
34 #define _NETINET6_ND6_H_
35
36
37 #ifndef RTF_ANNOUNCE
38 #define RTF_ANNOUNCE RTF_PROTO2
39 #endif
40
41 #include <sys/queue.h>
42 #include <sys/timeout.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;
49 long ln_asked;
50 u_long ln_expire;
51 short ln_state;
52 short ln_router;
53 int ln_byhint;
54
55 long ln_ntick;
56 struct timeout ln_timer_ch;
57 };
58
59 #define ND6_LLINFO_NOSTATE -2
60
61
62
63
64
65
66
67
68 #define ND6_LLINFO_INCOMPLETE 0
69 #define ND6_LLINFO_REACHABLE 1
70 #define ND6_LLINFO_STALE 2
71 #define ND6_LLINFO_DELAY 3
72 #define ND6_LLINFO_PROBE 4
73
74 #define ND6_IS_LLINFO_PROBREACH(n) ((n)->ln_state > ND6_LLINFO_INCOMPLETE)
75 #define ND6_LLINFO_PERMANENT(n) ((n)->ln_expire == 0)
76
77 struct nd_ifinfo {
78 u_int32_t linkmtu;
79 u_int32_t maxmtu;
80 u_int32_t basereachable;
81 u_int32_t reachable;
82 u_int32_t retrans;
83 u_int32_t flags;
84 int recalctm;
85 u_int8_t chlim;
86 u_int8_t initialized;
87
88 u_int8_t randomseed0[8];
89 u_int8_t randomseed1[8];
90 u_int8_t randomid[8];
91 };
92
93 #define ND6_IFF_PERFORMNUD 0x1
94 #define ND6_IFF_ACCEPT_RTADV 0x2
95
96 #ifdef _KERNEL
97 #define ND_IFINFO(ifp) \
98 (((struct in6_ifextra *)(ifp)->if_afdata[AF_INET6])->nd_ifinfo)
99 #define IN6_LINKMTU(ifp) \
100 ((ND_IFINFO(ifp)->linkmtu && ND_IFINFO(ifp)->linkmtu < (ifp)->if_mtu) \
101 ? ND_IFINFO(ifp)->linkmtu \
102 : ((ND_IFINFO(ifp)->maxmtu && ND_IFINFO(ifp)->maxmtu < (ifp)->if_mtu) \
103 ? ND_IFINFO(ifp)->maxmtu : (ifp)->if_mtu))
104 #endif
105
106 struct in6_nbrinfo {
107 char ifname[IFNAMSIZ];
108 struct in6_addr addr;
109 long asked;
110 int isrouter;
111 int state;
112 int expire;
113 };
114
115 #define DRLSTSIZ 10
116 #define PRLSTSIZ 10
117 struct in6_drlist {
118 char ifname[IFNAMSIZ];
119 struct {
120 struct in6_addr rtaddr;
121 u_char flags;
122 u_short rtlifetime;
123 u_long expire;
124 u_short if_index;
125 } defrouter[DRLSTSIZ];
126 };
127
128 struct in6_defrouter {
129 struct sockaddr_in6 rtaddr;
130 u_char flags;
131 u_short rtlifetime;
132 u_long expire;
133 u_short if_index;
134 };
135
136 #ifdef _KERNEL
137 struct in6_oprlist {
138 char ifname[IFNAMSIZ];
139 struct {
140 struct in6_addr prefix;
141 struct prf_ra raflags;
142 u_char prefixlen;
143 u_char origin;
144 u_long vltime;
145 u_long pltime;
146 u_long expire;
147 u_short if_index;
148 u_short advrtrs;
149 struct in6_addr advrtr[DRLSTSIZ];
150 } prefix[PRLSTSIZ];
151 };
152 #endif
153
154 struct in6_prlist {
155 char ifname[IFNAMSIZ];
156 struct {
157 struct in6_addr prefix;
158 struct prf_ra raflags;
159 u_char prefixlen;
160 u_char origin;
161 u_int32_t vltime;
162 u_int32_t pltime;
163 time_t expire;
164 u_short if_index;
165 u_short advrtrs;
166 struct in6_addr advrtr[DRLSTSIZ];
167 } prefix[PRLSTSIZ];
168 };
169
170 struct in6_prefix {
171 struct sockaddr_in6 prefix;
172 struct prf_ra raflags;
173 u_char prefixlen;
174 u_char origin;
175 u_int32_t vltime;
176 u_int32_t pltime;
177 time_t expire;
178 u_int32_t flags;
179 int refcnt;
180 u_short if_index;
181 u_short advrtrs;
182
183 };
184
185 #ifdef _KERNEL
186 struct in6_ondireq {
187 char ifname[IFNAMSIZ];
188 struct {
189 u_int32_t linkmtu;
190 u_int32_t maxmtu;
191 u_int32_t basereachable;
192 u_int32_t reachable;
193 u_int32_t retrans;
194 u_int32_t flags;
195 int recalctm;
196 u_int8_t chlim;
197 u_int8_t receivedra;
198 } ndi;
199 };
200 #endif
201
202 struct in6_ndireq {
203 char ifname[IFNAMSIZ];
204 struct nd_ifinfo ndi;
205 };
206
207 struct in6_ndifreq {
208 char ifname[IFNAMSIZ];
209 u_long ifindex;
210 };
211
212
213 #define NDPRF_ONLINK 0x1
214 #define NDPRF_DETACHED 0x2
215 #define NDPRF_HOME 0x4
216
217
218 #define MAX_RTR_SOLICITATION_DELAY 1
219 #define RTR_SOLICITATION_INTERVAL 4
220 #define MAX_RTR_SOLICITATIONS 3
221
222 #define ND6_INFINITE_LIFETIME 0xffffffff
223
224 #ifdef _KERNEL
225
226 #define MAX_REACHABLE_TIME 3600000
227 #define REACHABLE_TIME 30000
228 #define RETRANS_TIMER 1000
229 #define MIN_RANDOM_FACTOR 512
230 #define MAX_RANDOM_FACTOR 1536
231 #define ND_COMPUTE_RTIME(x) \
232 (((MIN_RANDOM_FACTOR * (x >> 10)) + (arc4random() & \
233 ((MAX_RANDOM_FACTOR - MIN_RANDOM_FACTOR) * (x >> 10)))) /1000)
234
235 TAILQ_HEAD(nd_drhead, nd_defrouter);
236 struct nd_defrouter {
237 TAILQ_ENTRY(nd_defrouter) dr_entry;
238 struct in6_addr rtaddr;
239 u_char flags;
240 u_short rtlifetime;
241 u_long expire;
242 struct ifnet *ifp;
243 int installed;
244 };
245
246 struct nd_prefix {
247 struct ifnet *ndpr_ifp;
248 LIST_ENTRY(nd_prefix) ndpr_entry;
249 struct sockaddr_in6 ndpr_prefix;
250 struct in6_addr ndpr_mask;
251
252 u_int32_t ndpr_vltime;
253 u_int32_t ndpr_pltime;
254
255 time_t ndpr_expire;
256 time_t ndpr_preferred;
257 time_t ndpr_lastupdate;
258
259 struct prf_ra ndpr_flags;
260 u_int32_t ndpr_stateflags;
261
262 LIST_HEAD(pr_rtrhead, nd_pfxrouter) ndpr_advrtrs;
263 u_char ndpr_plen;
264 int ndpr_refcnt;
265 };
266
267 #define ndpr_next ndpr_entry.le_next
268
269 #define ndpr_raf ndpr_flags
270 #define ndpr_raf_onlink ndpr_flags.onlink
271 #define ndpr_raf_auto ndpr_flags.autonomous
272 #define ndpr_raf_router ndpr_flags.router
273
274
275
276
277
278 struct inet6_ndpr_msghdr {
279 u_short inpm_msglen;
280 u_char inpm_version;
281 u_char inpm_type;
282 struct in6_addr inpm_prefix;
283 u_long prm_vltim;
284 u_long prm_pltime;
285 u_long prm_expire;
286 u_long prm_preferred;
287 struct in6_prflags prm_flags;
288 u_short prm_index;
289 u_char prm_plen;
290 };
291
292 #define prm_raf_onlink prm_flags.prf_ra.onlink
293 #define prm_raf_auto prm_flags.prf_ra.autonomous
294
295 #define prm_statef_onlink prm_flags.prf_state.onlink
296
297 #define prm_rrf_decrvalid prm_flags.prf_rr.decrvalid
298 #define prm_rrf_decrprefd prm_flags.prf_rr.decrprefd
299
300 struct nd_pfxrouter {
301 LIST_ENTRY(nd_pfxrouter) pfr_entry;
302 #define pfr_next pfr_entry.le_next
303 struct nd_defrouter *router;
304 };
305
306 LIST_HEAD(nd_prhead, nd_prefix);
307
308
309 extern int nd6_prune;
310 extern int nd6_delay;
311 extern int nd6_umaxtries;
312 extern int nd6_mmaxtries;
313 extern int nd6_useloopback;
314 extern int nd6_maxnudhint;
315 extern int nd6_gctimer;
316 extern struct llinfo_nd6 llinfo_nd6;
317 extern struct nd_drhead nd_defrouter;
318 extern struct nd_prhead nd_prefix;
319 extern int nd6_debug;
320
321 #define nd6log(x) do { if (nd6_debug) log x; } while (0)
322
323 extern struct timeout nd6_timer_ch;
324
325
326 extern int nd6_defifindex;
327
328 union nd_opts {
329 struct nd_opt_hdr *nd_opt_array[9];
330 struct {
331 struct nd_opt_hdr *zero;
332 struct nd_opt_hdr *src_lladdr;
333 struct nd_opt_hdr *tgt_lladdr;
334 struct nd_opt_prefix_info *pi_beg;
335 struct nd_opt_rd_hdr *rh;
336 struct nd_opt_mtu *mtu;
337 struct nd_opt_hdr *search;
338 struct nd_opt_hdr *last;
339 int done;
340 struct nd_opt_prefix_info *pi_end;
341 } nd_opt_each;
342 };
343 #define nd_opts_src_lladdr nd_opt_each.src_lladdr
344 #define nd_opts_tgt_lladdr nd_opt_each.tgt_lladdr
345 #define nd_opts_pi nd_opt_each.pi_beg
346 #define nd_opts_pi_end nd_opt_each.pi_end
347 #define nd_opts_rh nd_opt_each.rh
348 #define nd_opts_mtu nd_opt_each.mtu
349 #define nd_opts_search nd_opt_each.search
350 #define nd_opts_last nd_opt_each.last
351 #define nd_opts_done nd_opt_each.done
352
353
354
355 void nd6_init(void);
356 struct nd_ifinfo *nd6_ifattach(struct ifnet *);
357 void nd6_ifdetach(struct nd_ifinfo *);
358 int nd6_is_addr_neighbor(struct sockaddr_in6 *, struct ifnet *);
359 void nd6_option_init(void *, int, union nd_opts *);
360 struct nd_opt_hdr *nd6_option(union nd_opts *);
361 int nd6_options(union nd_opts *);
362 struct rtentry *nd6_lookup(struct in6_addr *, int, struct ifnet *);
363 void nd6_setmtu(struct ifnet *);
364 void nd6_llinfo_settimer(struct llinfo_nd6 *, long);
365 void nd6_timer(void *);
366 void nd6_purge(struct ifnet *);
367 void nd6_nud_hint(struct rtentry *, struct in6_addr *, int);
368 int nd6_resolve(struct ifnet *, struct rtentry *,
369 struct mbuf *, struct sockaddr *, u_char *);
370 void nd6_rtrequest(int, struct rtentry *, struct rt_addrinfo *);
371 int nd6_ioctl(u_long, caddr_t, struct ifnet *);
372 struct rtentry *nd6_cache_lladdr(struct ifnet *, struct in6_addr *,
373 char *, int, int, int);
374 int nd6_output(struct ifnet *, struct ifnet *, struct mbuf *,
375 struct sockaddr_in6 *, struct rtentry *);
376 int nd6_storelladdr(struct ifnet *, struct rtentry *, struct mbuf *,
377 struct sockaddr *, u_char *);
378 int nd6_sysctl(int, void *, size_t *, void *, size_t);
379 int nd6_need_cache(struct ifnet *);
380
381
382 void nd6_na_input(struct mbuf *, int, int);
383 void nd6_na_output(struct ifnet *, struct in6_addr *,
384 struct in6_addr *, u_long, int, struct sockaddr *);
385 void nd6_ns_input(struct mbuf *, int, int);
386 void nd6_ns_output(struct ifnet *, struct in6_addr *,
387 struct in6_addr *, struct llinfo_nd6 *, int);
388 caddr_t nd6_ifptomac(struct ifnet *);
389 void nd6_dad_start(struct ifaddr *, int *);
390 void nd6_dad_stop(struct ifaddr *);
391 void nd6_dad_duplicated(struct ifaddr *);
392
393
394 void nd6_rs_input(struct mbuf *, int, int);
395 void nd6_ra_input(struct mbuf *, int, int);
396 void prelist_del(struct nd_prefix *);
397 void defrouter_addreq(struct nd_defrouter *);
398 void defrouter_reset(void);
399 void defrouter_select(void);
400 void defrtrlist_del(struct nd_defrouter *);
401 void prelist_remove(struct nd_prefix *);
402 int prelist_update(struct nd_prefix *, struct nd_defrouter *, struct mbuf *);
403 int nd6_prelist_add(struct nd_prefix *, struct nd_defrouter *,
404 struct nd_prefix **);
405 int nd6_prefix_onlink(struct nd_prefix *);
406 int nd6_prefix_offlink(struct nd_prefix *);
407 void pfxlist_onlink_check(void);
408 struct nd_defrouter *defrouter_lookup(struct in6_addr *, struct ifnet *);
409 struct nd_prefix *nd6_prefix_lookup(struct nd_prefix *);
410 int in6_ifdel(struct ifnet *, struct in6_addr *);
411 int in6_init_prefix_ltimes(struct nd_prefix *ndpr);
412 void rt6_flush(struct in6_addr *, struct ifnet *);
413 int nd6_setdefaultiface(int);
414
415 #endif
416
417 #endif