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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 #ifndef _NETINET6_IN6_VAR_H_
65 #define _NETINET6_IN6_VAR_H_
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 struct in6_addrlifetime {
83 time_t ia6t_expire;
84 time_t ia6t_preferred;
85 u_int32_t ia6t_vltime;
86 u_int32_t ia6t_pltime;
87 };
88
89 struct nd_ifinfo;
90 struct in6_ifextra {
91 struct in6_ifstat *in6_ifstat;
92 struct icmp6_ifstat *icmp6_ifstat;
93 struct nd_ifinfo *nd_ifinfo;
94 };
95
96 struct in6_ifaddr {
97 struct ifaddr ia_ifa;
98 #define ia_ifp ia_ifa.ifa_ifp
99 #define ia_flags ia_ifa.ifa_flags
100 struct sockaddr_in6 ia_addr;
101 struct sockaddr_in6 ia_net;
102 struct sockaddr_in6 ia_dstaddr;
103 struct sockaddr_in6 ia_prefixmask;
104 u_int32_t ia_plen;
105 struct in6_ifaddr *ia_next;
106 LIST_HEAD(in6_multihead, in6_multi) ia6_multiaddrs;
107
108 int ia6_flags;
109
110 struct in6_addrlifetime ia6_lifetime;
111 time_t ia6_createtime;
112
113
114 time_t ia6_updatetime;
115
116
117 struct nd_prefix *ia6_ndpr;
118
119
120 LIST_HEAD(, in6_multi_mship) ia6_memberships;
121 };
122
123
124
125
126 struct in6_ifstat {
127 u_int64_t ifs6_in_receive;
128 u_int64_t ifs6_in_hdrerr;
129 u_int64_t ifs6_in_toobig;
130 u_int64_t ifs6_in_noroute;
131 u_int64_t ifs6_in_addrerr;
132 u_int64_t ifs6_in_protounknown;
133
134 u_int64_t ifs6_in_truncated;
135 u_int64_t ifs6_in_discard;
136
137 u_int64_t ifs6_in_deliver;
138
139 u_int64_t ifs6_out_forward;
140
141 u_int64_t ifs6_out_request;
142
143 u_int64_t ifs6_out_discard;
144 u_int64_t ifs6_out_fragok;
145 u_int64_t ifs6_out_fragfail;
146 u_int64_t ifs6_out_fragcreat;
147
148 u_int64_t ifs6_reass_reqd;
149
150 u_int64_t ifs6_reass_ok;
151
152
153 u_int64_t ifs6_reass_fail;
154
155
156 u_int64_t ifs6_in_mcast;
157 u_int64_t ifs6_out_mcast;
158 };
159
160
161
162
163
164 struct icmp6_ifstat {
165
166
167
168
169 u_int64_t ifs6_in_msg;
170
171 u_int64_t ifs6_in_error;
172
173 u_int64_t ifs6_in_dstunreach;
174
175 u_int64_t ifs6_in_adminprohib;
176
177 u_int64_t ifs6_in_timeexceed;
178
179 u_int64_t ifs6_in_paramprob;
180
181 u_int64_t ifs6_in_pkttoobig;
182
183 u_int64_t ifs6_in_echo;
184
185 u_int64_t ifs6_in_echoreply;
186
187 u_int64_t ifs6_in_routersolicit;
188
189 u_int64_t ifs6_in_routeradvert;
190
191 u_int64_t ifs6_in_neighborsolicit;
192
193 u_int64_t ifs6_in_neighboradvert;
194
195 u_int64_t ifs6_in_redirect;
196
197 u_int64_t ifs6_in_mldquery;
198
199 u_int64_t ifs6_in_mldreport;
200
201 u_int64_t ifs6_in_mlddone;
202
203
204
205
206
207 u_int64_t ifs6_out_msg;
208
209 u_int64_t ifs6_out_error;
210
211 u_int64_t ifs6_out_dstunreach;
212
213 u_int64_t ifs6_out_adminprohib;
214
215 u_int64_t ifs6_out_timeexceed;
216
217 u_int64_t ifs6_out_paramprob;
218
219 u_int64_t ifs6_out_pkttoobig;
220
221 u_int64_t ifs6_out_echo;
222
223 u_int64_t ifs6_out_echoreply;
224
225 u_int64_t ifs6_out_routersolicit;
226
227 u_int64_t ifs6_out_routeradvert;
228
229 u_int64_t ifs6_out_neighborsolicit;
230
231 u_int64_t ifs6_out_neighboradvert;
232
233 u_int64_t ifs6_out_redirect;
234
235 u_int64_t ifs6_out_mldquery;
236
237 u_int64_t ifs6_out_mldreport;
238
239 u_int64_t ifs6_out_mlddone;
240 };
241
242 struct in6_ifreq {
243 char ifr_name[IFNAMSIZ];
244 union {
245 struct sockaddr_in6 ifru_addr;
246 struct sockaddr_in6 ifru_dstaddr;
247 short ifru_flags;
248 int ifru_flags6;
249 int ifru_metric;
250 caddr_t ifru_data;
251 struct in6_addrlifetime ifru_lifetime;
252 struct in6_ifstat ifru_stat;
253 struct icmp6_ifstat ifru_icmp6stat;
254 } ifr_ifru;
255 };
256
257 struct in6_aliasreq {
258 char ifra_name[IFNAMSIZ];
259 struct sockaddr_in6 ifra_addr;
260 struct sockaddr_in6 ifra_dstaddr;
261 struct sockaddr_in6 ifra_prefixmask;
262 int ifra_flags;
263 struct in6_addrlifetime ifra_lifetime;
264 };
265
266
267 #define IN6_PREFIX_ND 1
268 #define IN6_PREFIX_RR 2
269
270
271
272
273
274 struct prf_ra {
275 u_int onlink : 1;
276 u_int autonomous : 1;
277 u_int router : 1;
278 u_int reserved : 5;
279 };
280
281 struct in6_prflags {
282 struct prf_ra prf_ra;
283 u_char prf_reserved1;
284 u_short prf_reserved2;
285
286 struct prf_rr {
287 u_int decrvalid : 1;
288 u_int decrprefd : 1;
289 u_int reserved : 6;
290 } prf_rr;
291 u_char prf_reserved3;
292 u_short prf_reserved4;
293 };
294
295 struct in6_prefixreq {
296 char ipr_name[IFNAMSIZ];
297 u_char ipr_origin;
298 u_char ipr_plen;
299 u_int32_t ipr_vltime;
300 u_int32_t ipr_pltime;
301 struct in6_prflags ipr_flags;
302 struct sockaddr_in6 ipr_prefix;
303 };
304
305 #define PR_ORIG_RA 0
306 #define PR_ORIG_RR 1
307 #define PR_ORIG_STATIC 2
308 #define PR_ORIG_KERNEL 3
309
310 #define ipr_raf_onlink ipr_flags.prf_ra.onlink
311 #define ipr_raf_auto ipr_flags.prf_ra.autonomous
312
313 #define ipr_statef_onlink ipr_flags.prf_state.onlink
314
315 #define ipr_rrf_decrvalid ipr_flags.prf_rr.decrvalid
316 #define ipr_rrf_decrprefd ipr_flags.prf_rr.decrprefd
317
318 struct in6_rrenumreq {
319 char irr_name[IFNAMSIZ];
320 u_char irr_origin;
321 u_char irr_m_len;
322 u_char irr_m_minlen;
323 u_char irr_m_maxlen;
324 u_char irr_u_uselen;
325 u_char irr_u_keeplen;
326 struct irr_raflagmask {
327 u_int onlink : 1;
328 u_int autonomous : 1;
329 u_int reserved : 6;
330 } irr_raflagmask;
331 u_int32_t irr_vltime;
332 u_int32_t irr_pltime;
333 struct in6_prflags irr_flags;
334 struct sockaddr_in6 irr_matchprefix;
335 struct sockaddr_in6 irr_useprefix;
336 };
337
338 #define irr_raf_mask_onlink irr_raflagmask.onlink
339 #define irr_raf_mask_auto irr_raflagmask.autonomous
340 #define irr_raf_mask_reserved irr_raflagmask.reserved
341
342 #define irr_raf_onlink irr_flags.prf_ra.onlink
343 #define irr_raf_auto irr_flags.prf_ra.autonomous
344
345 #define irr_statef_onlink irr_flags.prf_state.onlink
346
347 #define irr_rrf irr_flags.prf_rr
348 #define irr_rrf_decrvalid irr_flags.prf_rr.decrvalid
349 #define irr_rrf_decrprefd irr_flags.prf_rr.decrprefd
350
351
352
353
354
355 #define IA6_IN6(ia) (&((ia)->ia_addr.sin6_addr))
356 #define IA6_DSTIN6(ia) (&((ia)->ia_dstaddr.sin6_addr))
357 #define IA6_MASKIN6(ia) (&((ia)->ia_prefixmask.sin6_addr))
358 #define IA6_SIN6(ia) (&((ia)->ia_addr))
359 #define IA6_DSTSIN6(ia) (&((ia)->ia_dstaddr))
360 #define IFA_IN6(x) (&((struct sockaddr_in6 *)((x)->ifa_addr))->sin6_addr)
361 #define IFA_DSTIN6(x) (&((struct sockaddr_in6 *)((x)->ifa_dstaddr))->sin6_addr)
362
363 #ifdef _KERNEL
364 #define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \
365 (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
366 (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \
367 (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \
368 (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 )
369 #endif
370
371 #define SIOCSIFADDR_IN6 _IOW('i', 12, struct in6_ifreq)
372 #define SIOCGIFADDR_IN6 _IOWR('i', 33, struct in6_ifreq)
373
374 #ifdef _KERNEL
375
376
377
378
379 #define SIOCSIFDSTADDR_IN6 _IOW('i', 14, struct in6_ifreq)
380 #define SIOCSIFNETMASK_IN6 _IOW('i', 22, struct in6_ifreq)
381 #endif
382
383 #define SIOCGIFDSTADDR_IN6 _IOWR('i', 34, struct in6_ifreq)
384 #define SIOCGIFNETMASK_IN6 _IOWR('i', 37, struct in6_ifreq)
385
386 #define SIOCDIFADDR_IN6 _IOW('i', 25, struct in6_ifreq)
387 #define SIOCAIFADDR_IN6 _IOW('i', 26, struct in6_aliasreq)
388
389 #define SIOCSIFPHYADDR_IN6 _IOW('i', 70, struct in6_aliasreq)
390 #define SIOCGIFPSRCADDR_IN6 _IOWR('i', 71, struct in6_ifreq)
391 #define SIOCGIFPDSTADDR_IN6 _IOWR('i', 72, struct in6_ifreq)
392
393 #define SIOCGIFAFLAG_IN6 _IOWR('i', 73, struct in6_ifreq)
394
395 #define SIOCGDRLST_IN6 _IOWR('i', 74, struct in6_drlist)
396 #define SIOCGPRLST_IN6 _IOWR('i', 75, struct in6_prlist)
397 #ifdef _KERNEL
398 #define OSIOCGIFINFO_IN6 _IOWR('i', 76, struct in6_ondireq)
399 #endif
400 #define SIOCGIFINFO_IN6 _IOWR('i', 108, struct in6_ndireq)
401 #define SIOCSNDFLUSH_IN6 _IOWR('i', 77, struct in6_ifreq)
402 #define SIOCGNBRINFO_IN6 _IOWR('i', 78, struct in6_nbrinfo)
403 #define SIOCSPFXFLUSH_IN6 _IOWR('i', 79, struct in6_ifreq)
404 #define SIOCSRTRFLUSH_IN6 _IOWR('i', 80, struct in6_ifreq)
405
406 #define SIOCGIFALIFETIME_IN6 _IOWR('i', 81, struct in6_ifreq)
407 #define SIOCSIFALIFETIME_IN6 _IOWR('i', 82, struct in6_ifreq)
408 #define SIOCGIFSTAT_IN6 _IOWR('i', 83, struct in6_ifreq)
409 #define SIOCGIFSTAT_ICMP6 _IOWR('i', 84, struct in6_ifreq)
410
411 #define SIOCSDEFIFACE_IN6 _IOWR('i', 85, struct in6_ndifreq)
412 #define SIOCGDEFIFACE_IN6 _IOWR('i', 86, struct in6_ndifreq)
413
414 #define SIOCSIFINFO_FLAGS _IOWR('i', 87, struct in6_ndireq)
415
416 #define SIOCSIFPREFIX_IN6 _IOW('i', 100, struct in6_prefixreq)
417 #define SIOCGIFPREFIX_IN6 _IOWR('i', 101, struct in6_prefixreq)
418 #define SIOCDIFPREFIX_IN6 _IOW('i', 102, struct in6_prefixreq)
419 #define SIOCAIFPREFIX_IN6 _IOW('i', 103, struct in6_rrenumreq)
420 #define SIOCCIFPREFIX_IN6 _IOW('i', 104, \
421 struct in6_rrenumreq)
422 #define SIOCSGIFPREFIX_IN6 _IOW('i', 105, \
423 struct in6_rrenumreq)
424
425 #define SIOCGETSGCNT_IN6 _IOWR('u', 106, \
426 struct sioc_sg_req6)
427 #define SIOCGETMIFCNT_IN6 _IOWR('u', 107, \
428 struct sioc_mif_req6)
429
430 #define IN6_IFF_ANYCAST 0x01
431 #define IN6_IFF_TENTATIVE 0x02
432 #define IN6_IFF_DUPLICATED 0x04
433 #define IN6_IFF_DETACHED 0x08
434 #define IN6_IFF_DEPRECATED 0x10
435 #define IN6_IFF_NODAD 0x20
436
437
438 #define IN6_IFF_AUTOCONF 0x40
439
440
441 #define IN6_IFF_NOTREADY (IN6_IFF_TENTATIVE|IN6_IFF_DUPLICATED)
442
443 #ifdef _KERNEL
444 #define IN6_ARE_SCOPE_CMP(a,b) ((a)-(b))
445 #define IN6_ARE_SCOPE_EQUAL(a,b) ((a)==(b))
446 #endif
447
448 #ifdef _KERNEL
449 extern struct in6_ifaddr *in6_ifaddr;
450
451 extern struct icmp6stat icmp6stat;
452 #define in6_ifstat_inc(ifp, tag) \
453 do { \
454 if (ifp) \
455 ((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->in6_ifstat->tag++; \
456 } while (0)
457
458 extern struct ifqueue ip6intrq;
459 extern struct in6_addr zeroin6_addr;
460 extern u_char inet6ctlerrmap[];
461 extern unsigned long in6_maxmtu;
462
463
464
465
466
467 #define IFP_TO_IA6(ifp, ia) \
468 \
469 \
470 do { \
471 struct ifaddr *ifa; \
472 TAILQ_FOREACH(ifa, &(ifp)->if_addrlist, ifa_list) { \
473 if (!ifa->ifa_addr) \
474 continue; \
475 if (ifa->ifa_addr->sa_family == AF_INET6) \
476 break; \
477 } \
478 (ia) = (struct in6_ifaddr *)ifa; \
479 } while (0)
480 #endif
481
482
483
484
485
486 struct in6_multi_mship {
487 struct in6_multi *i6mm_maddr;
488 LIST_ENTRY(in6_multi_mship) i6mm_chain;
489 };
490
491 struct in6_multi {
492 LIST_ENTRY(in6_multi) in6m_entry;
493 struct in6_addr in6m_addr;
494 struct ifnet *in6m_ifp;
495 struct in6_ifaddr *in6m_ia;
496 u_int in6m_refcount;
497 u_int in6m_state;
498 u_int in6m_timer;
499 };
500
501 #ifdef _KERNEL
502
503
504
505
506 struct in6_multistep {
507 struct in6_ifaddr *i_ia;
508 struct in6_multi *i_in6m;
509 };
510
511
512
513
514
515
516
517 #define IN6_LOOKUP_MULTI(addr, ifp, in6m) \
518 \
519 \
520 \
521 do { \
522 struct in6_ifaddr *ia; \
523 \
524 IFP_TO_IA6((ifp), ia); \
525 if (ia == NULL) \
526 (in6m) = NULL; \
527 else \
528 for ((in6m) = LIST_FIRST(&ia->ia6_multiaddrs); \
529 (in6m) != LIST_END(&ia->ia6_multiaddrs) && \
530 !IN6_ARE_ADDR_EQUAL(&(in6m)->in6m_addr, &(addr)); \
531 (in6m) = LIST_NEXT((in6m), in6m_entry)) \
532 continue; \
533 } while (0)
534
535
536
537
538
539
540
541
542 #define IN6_NEXT_MULTI(step, in6m) \
543 \
544 \
545 do { \
546 if (((in6m) = (step).i_in6m) != NULL) \
547 (step).i_in6m = LIST_NEXT((in6m), in6m_entry); \
548 else \
549 while ((step).i_ia != NULL) { \
550 (in6m) = LIST_FIRST(&(step).i_ia->ia6_multiaddrs); \
551 (step).i_ia = (step).i_ia->ia_next; \
552 if ((in6m) != NULL) { \
553 (step).i_in6m = LIST_NEXT((in6m), in6m_entry); \
554 break; \
555 } \
556 } \
557 } while (0)
558
559 #define IN6_FIRST_MULTI(step, in6m) \
560 \
561 \
562 do { \
563 (step).i_ia = in6_ifaddr; \
564 (step).i_in6m = NULL; \
565 IN6_NEXT_MULTI((step), (in6m)); \
566 } while (0)
567
568 struct in6_multi *in6_addmulti(struct in6_addr *, struct ifnet *, int *);
569 void in6_delmulti(struct in6_multi *);
570 struct in6_multi_mship *in6_joingroup(struct ifnet *, struct in6_addr *, int *);
571 int in6_leavegroup(struct in6_multi_mship *);
572 int in6_mask2len(struct in6_addr *, u_char *);
573 int in6_control(struct socket *, u_long, caddr_t, struct ifnet *,
574 struct proc *);
575 int in6_update_ifa(struct ifnet *, struct in6_aliasreq *,
576 struct in6_ifaddr *);
577 void in6_purgeaddr(struct ifaddr *);
578 int in6if_do_dad(struct ifnet *);
579 void in6_purgeif(struct ifnet *);
580 void in6_savemkludge(struct in6_ifaddr *);
581 void in6_setmaxmtu(void);
582 void *in6_domifattach(struct ifnet *);
583 void in6_domifdetach(struct ifnet *, void *);
584 void in6_restoremkludge(struct in6_ifaddr *, struct ifnet *);
585 void in6_createmkludge(struct ifnet *);
586 void in6_purgemkludge(struct ifnet *);
587 struct in6_ifaddr *in6ifa_ifpforlinklocal(struct ifnet *, int);
588 struct in6_ifaddr *in6ifa_ifpwithaddr(struct ifnet *, struct in6_addr *);
589 char *ip6_sprintf(struct in6_addr *);
590 int in6_addr2scopeid(struct ifnet *, struct in6_addr *);
591 int in6_matchlen(struct in6_addr *, struct in6_addr *);
592 int in6_are_prefix_equal(struct in6_addr *, struct in6_addr *, int);
593 void in6_prefixlen2mask(struct in6_addr *, int);
594 void in6_purgeprefix(struct ifnet *);
595 void in6_ifaddloop(struct ifaddr *);
596 void in6_ifremloop(struct ifaddr *);
597
598 int in6_is_addr_deprecated(struct sockaddr_in6 *);
599 struct inpcb;
600 int in6_embedscope(struct in6_addr *, const struct sockaddr_in6 *,
601 struct inpcb *, struct ifnet **);
602 int in6_recoverscope(struct sockaddr_in6 *, const struct in6_addr *,
603 struct ifnet *);
604 void in6_clearscope(struct in6_addr *);
605 #endif
606
607 #endif