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 __KAME_NETINET_IN_H_INCLUDED_
65 #error "do not include netinet6/in6.h directly, include netinet/in.h. see RFC2553"
66 #endif
67
68 #ifndef _NETINET6_IN6_H_
69 #define _NETINET6_IN6_H_
70
71
72
73
74
75
76 #define __KAME__
77 #define __KAME_VERSION "OpenBSD-current"
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107 #define IPV6PORT_RESERVED 1024
108 #define IPV6PORT_ANONMIN 49152
109 #define IPV6PORT_ANONMAX 65535
110 #define IPV6PORT_RESERVEDMIN 600
111 #define IPV6PORT_RESERVEDMAX (IPV6PORT_RESERVED-1)
112
113
114
115
116 struct in6_addr {
117 union {
118 u_int8_t __u6_addr8[16];
119 u_int16_t __u6_addr16[8];
120 u_int32_t __u6_addr32[4];
121 } __u6_addr;
122 };
123
124 #define s6_addr __u6_addr.__u6_addr8
125 #ifdef _KERNEL
126 #define s6_addr8 __u6_addr.__u6_addr8
127 #define s6_addr16 __u6_addr.__u6_addr16
128 #define s6_addr32 __u6_addr.__u6_addr32
129 #endif
130
131 #define INET6_ADDRSTRLEN 46
132
133
134
135
136 #if __BSD_VISIBLE
137 #define SIN6_LEN
138 #endif
139 struct sockaddr_in6 {
140 u_int8_t sin6_len;
141 sa_family_t sin6_family;
142 in_port_t sin6_port;
143 u_int32_t sin6_flowinfo;
144 struct in6_addr sin6_addr;
145 u_int32_t sin6_scope_id;
146 };
147
148
149
150
151 #ifdef _KERNEL
152 #define IN6MASK0 {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}}
153 #define IN6MASK32 {{{ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, \
154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
155 #define IN6MASK64 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
157 #define IN6MASK96 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
158 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}}
159 #define IN6MASK128 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
160 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}}
161 #endif
162
163 #ifdef _KERNEL
164 extern const struct sockaddr_in6 sa6_any;
165
166 extern const struct in6_addr in6mask0;
167 extern const struct in6_addr in6mask32;
168 extern const struct in6_addr in6mask64;
169 extern const struct in6_addr in6mask96;
170 extern const struct in6_addr in6mask128;
171 #endif
172
173
174
175
176 #ifdef _KERNEL
177 #if BYTE_ORDER == BIG_ENDIAN
178 #define IPV6_ADDR_INT32_ONE 1
179 #define IPV6_ADDR_INT32_TWO 2
180 #define IPV6_ADDR_INT32_MNL 0xff010000
181 #define IPV6_ADDR_INT32_MLL 0xff020000
182 #define IPV6_ADDR_INT32_SMP 0x0000ffff
183 #define IPV6_ADDR_INT16_ULL 0xfe80
184 #define IPV6_ADDR_INT16_USL 0xfec0
185 #define IPV6_ADDR_INT16_MLL 0xff02
186 #elif BYTE_ORDER == LITTLE_ENDIAN
187 #define IPV6_ADDR_INT32_ONE 0x01000000
188 #define IPV6_ADDR_INT32_TWO 0x02000000
189 #define IPV6_ADDR_INT32_MNL 0x000001ff
190 #define IPV6_ADDR_INT32_MLL 0x000002ff
191 #define IPV6_ADDR_INT32_SMP 0xffff0000
192 #define IPV6_ADDR_INT16_ULL 0x80fe
193 #define IPV6_ADDR_INT16_USL 0xc0fe
194 #define IPV6_ADDR_INT16_MLL 0x02ff
195 #endif
196 #endif
197
198
199
200
201 #if __BSD_VISIBLE
202 #define IN6ADDR_ANY_INIT \
203 {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
205 #define IN6ADDR_LOOPBACK_INIT \
206 {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
208 #define IN6ADDR_NODELOCAL_ALLNODES_INIT \
209 {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
211 #define IN6ADDR_INTFACELOCAL_ALLNODES_INIT \
212 {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
214 #define IN6ADDR_LINKLOCAL_ALLNODES_INIT \
215 {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
217 #define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \
218 {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}}
220 #endif
221
222 extern const struct in6_addr in6addr_any;
223 extern const struct in6_addr in6addr_loopback;
224 #if __BSD_VISIBLE
225 extern const struct in6_addr in6addr_intfacelocal_allnodes;
226 extern const struct in6_addr in6addr_linklocal_allnodes;
227 extern const struct in6_addr in6addr_linklocal_allrouters;
228 #endif
229
230
231
232
233
234
235
236 #ifdef _KERNEL
237 #define IN6_ARE_ADDR_EQUAL(a, b) \
238 (bcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
239 #else
240 #if __BSD_VISIBLE
241 #define IN6_ARE_ADDR_EQUAL(a, b) \
242 (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
243 #endif
244 #endif
245
246
247
248
249 #define IN6_IS_ADDR_UNSPECIFIED(a) \
250 ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
251 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
252 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
253 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == 0))
254
255
256
257
258 #define IN6_IS_ADDR_LOOPBACK(a) \
259 ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
260 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
261 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
262 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == ntohl(1)))
263
264
265
266
267 #define IN6_IS_ADDR_V4COMPAT(a) \
268 ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
269 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
270 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
271 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != 0) && \
272 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != ntohl(1)))
273
274
275
276
277 #define IN6_IS_ADDR_V4MAPPED(a) \
278 ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
279 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
280 (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff)))
281
282
283
284
285
286 #ifdef _KERNEL
287 #define IPV6_ADDR_SCOPE_NODELOCAL 0x01
288 #define IPV6_ADDR_SCOPE_INTFACELOCAL 0x01
289 #define IPV6_ADDR_SCOPE_LINKLOCAL 0x02
290 #define IPV6_ADDR_SCOPE_SITELOCAL 0x05
291 #define IPV6_ADDR_SCOPE_ORGLOCAL 0x08
292 #define IPV6_ADDR_SCOPE_GLOBAL 0x0e
293 #else
294 #define __IPV6_ADDR_SCOPE_NODELOCAL 0x01
295 #define __IPV6_ADDR_SCOPE_INTFACELOCAL 0x01
296 #define __IPV6_ADDR_SCOPE_LINKLOCAL 0x02
297 #define __IPV6_ADDR_SCOPE_SITELOCAL 0x05
298 #define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08
299 #define __IPV6_ADDR_SCOPE_GLOBAL 0x0e
300 #endif
301
302
303
304
305
306 #define IN6_IS_ADDR_LINKLOCAL(a) \
307 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
308 #define IN6_IS_ADDR_SITELOCAL(a) \
309 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
310
311
312
313
314 #define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff)
315
316 #ifdef _KERNEL
317 #define IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f)
318 #else
319 #define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f)
320 #endif
321
322
323
324
325 #ifdef _KERNEL
326 #define IN6_IS_ADDR_MC_NODELOCAL(a) \
327 (IN6_IS_ADDR_MULTICAST(a) && \
328 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL))
329 #define IN6_IS_ADDR_MC_INTFACELOCAL(a) \
330 (IN6_IS_ADDR_MULTICAST(a) && \
331 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_INTFACELOCAL))
332 #define IN6_IS_ADDR_MC_LINKLOCAL(a) \
333 (IN6_IS_ADDR_MULTICAST(a) && \
334 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL))
335 #define IN6_IS_ADDR_MC_SITELOCAL(a) \
336 (IN6_IS_ADDR_MULTICAST(a) && \
337 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL))
338 #define IN6_IS_ADDR_MC_ORGLOCAL(a) \
339 (IN6_IS_ADDR_MULTICAST(a) && \
340 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL))
341 #define IN6_IS_ADDR_MC_GLOBAL(a) \
342 (IN6_IS_ADDR_MULTICAST(a) && \
343 (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL))
344 #else
345 #define IN6_IS_ADDR_MC_NODELOCAL(a) \
346 (IN6_IS_ADDR_MULTICAST(a) && \
347 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL))
348 #define IN6_IS_ADDR_MC_INTFACELOCAL(a) \
349 (IN6_IS_ADDR_MULTICAST(a) && \
350 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_INTFACELOCAL))
351 #define IN6_IS_ADDR_MC_LINKLOCAL(a) \
352 (IN6_IS_ADDR_MULTICAST(a) && \
353 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL))
354 #define IN6_IS_ADDR_MC_SITELOCAL(a) \
355 (IN6_IS_ADDR_MULTICAST(a) && \
356 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL))
357 #define IN6_IS_ADDR_MC_ORGLOCAL(a) \
358 (IN6_IS_ADDR_MULTICAST(a) && \
359 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL))
360 #define IN6_IS_ADDR_MC_GLOBAL(a) \
361 (IN6_IS_ADDR_MULTICAST(a) && \
362 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL))
363 #endif
364
365 #ifdef _KERNEL
366
367
368
369 #define IN6_IS_SCOPE_LINKLOCAL(a) \
370 ((IN6_IS_ADDR_LINKLOCAL(a)) || \
371 (IN6_IS_ADDR_MC_LINKLOCAL(a)))
372 #define IN6_IS_SCOPE_EMBED(a) \
373 ((IN6_IS_ADDR_LINKLOCAL(a)) || \
374 (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \
375 (IN6_IS_ADDR_MC_INTFACELOCAL(a)))
376
377 #define IFA6_IS_DEPRECATED(a) \
378 ((a)->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME && \
379 (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
380 (a)->ia6_lifetime.ia6t_pltime)
381 #define IFA6_IS_INVALID(a) \
382 ((a)->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME && \
383 (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
384 (a)->ia6_lifetime.ia6t_vltime)
385 #endif
386
387
388
389
390 #if __BSD_VISIBLE
391 struct route_in6 {
392 struct rtentry *ro_rt;
393 struct sockaddr_in6 ro_dst;
394 };
395 #endif
396
397
398
399
400
401 #define IPV6_OPTIONS 1
402
403 #define IPV6_SOCKOPT_RESERVED1 3
404 #define IPV6_UNICAST_HOPS 4
405 #if 0
406 #define IPV6_RECVOPTS 5
407 #define IPV6_RECVRETOPTS 6
408 #define IPV6_RECVDSTADDR 7
409 #define IPV6_RETOPTS 8
410 #endif
411 #define IPV6_MULTICAST_IF 9
412 #define IPV6_MULTICAST_HOPS 10
413 #define IPV6_MULTICAST_LOOP 11
414 #define IPV6_JOIN_GROUP 12
415 #define IPV6_LEAVE_GROUP 13
416 #define IPV6_PORTRANGE 14
417 #define ICMP6_FILTER 18
418
419
420 #ifdef _KERNEL
421 #define IPV6_2292PKTINFO 19
422 #define IPV6_2292HOPLIMIT 20
423 #define IPV6_2292NEXTHOP 21
424 #define IPV6_2292HOPOPTS 22
425 #define IPV6_2292DSTOPTS 23
426 #define IPV6_2292RTHDR 24
427 #define IPV6_2292PKTOPTIONS 25
428 #endif
429
430 #define IPV6_CHECKSUM 26
431 #define IPV6_V6ONLY 27
432
433 #if 0
434 #define IPV6_IPSEC_POLICY 28
435 #endif
436 #define IPV6_FAITH 29
437
438
439
440
441 #define IPV6_RTHDRDSTOPTS 35
442
443 #define IPV6_RECVPKTINFO 36
444 #define IPV6_RECVHOPLIMIT 37
445 #define IPV6_RECVRTHDR 38
446 #define IPV6_RECVHOPOPTS 39
447 #define IPV6_RECVDSTOPTS 40
448 #ifdef _KERNEL
449 #define IPV6_RECVRTHDRDSTOPTS 41
450 #endif
451
452 #define IPV6_USE_MIN_MTU 42
453 #define IPV6_RECVPATHMTU 43
454
455 #define IPV6_PATHMTU 44
456
457
458
459
460
461 #define IPV6_PKTINFO 46
462 #define IPV6_HOPLIMIT 47
463 #define IPV6_NEXTHOP 48
464 #define IPV6_HOPOPTS 49
465 #define IPV6_DSTOPTS 50
466 #define IPV6_RTHDR 51
467
468
469 #define IPV6_AUTH_LEVEL 53
470 #define IPV6_ESP_TRANS_LEVEL 54
471 #define IPV6_ESP_NETWORK_LEVEL 55
472 #define IPSEC6_OUTSA 56
473 #define IPV6_RECVTCLASS 57
474
475 #define IPV6_AUTOFLOWLABEL 59
476 #define IPV6_IPCOMP_LEVEL 60
477
478 #define IPV6_TCLASS 61
479 #define IPV6_DONTFRAG 62
480
481
482
483 #define IPV6_RTHDR_LOOSE 0
484 #define IPV6_RTHDR_STRICT 1
485 #define IPV6_RTHDR_TYPE_0 0
486
487
488
489
490 #define IPV6_DEFAULT_MULTICAST_HOPS 1
491 #define IPV6_DEFAULT_MULTICAST_LOOP 1
492
493
494
495
496 struct ipv6_mreq {
497 struct in6_addr ipv6mr_multiaddr;
498 unsigned int ipv6mr_interface;
499 };
500
501
502
503
504 struct in6_pktinfo {
505 struct in6_addr ipi6_addr;
506 unsigned int ipi6_ifindex;
507 };
508
509
510
511
512 struct ip6_mtuinfo {
513 struct sockaddr_in6 ip6m_addr;
514 u_int32_t ip6m_mtu;
515 };
516
517
518
519
520
521 #define IPV6_PORTRANGE_DEFAULT 0
522 #define IPV6_PORTRANGE_HIGH 1
523 #define IPV6_PORTRANGE_LOW 2
524
525 #if __BSD_VISIBLE
526
527
528
529
530
531
532 #define IPV6PROTO_MAXID (IPPROTO_PIM + 1)
533
534 #define CTL_IPV6PROTO_NAMES { \
535 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
536 { 0, 0 }, \
537 { "tcp6", CTLTYPE_NODE }, \
538 { 0, 0 }, \
539 { 0, 0 }, \
540 { 0, 0 }, \
541 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
542 { 0, 0 }, \
543 { 0, 0 }, \
544 { "udp6", CTLTYPE_NODE }, \
545 { 0, 0 }, \
546 { 0, 0 }, \
547 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
548 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
549 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
550 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
551 { 0, 0 }, \
552 { "ip6", CTLTYPE_NODE }, \
553 { 0, 0 }, \
554 { 0, 0 }, \
555 { 0, 0 }, \
556 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
557 { 0, 0 }, \
558 { "ipsec6", CTLTYPE_NODE }, \
559 { 0, 0 }, \
560 { 0, 0 }, \
561 { 0, 0 }, \
562 { 0, 0 }, \
563 { 0, 0 }, \
564 { 0, 0 }, \
565 { "icmp6", CTLTYPE_NODE }, \
566 { 0, 0 }, \
567 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
568 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
569 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
570 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
571 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
572 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
573 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
574 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
575 { 0, 0 }, \
576 { 0, 0 }, \
577 { 0, 0 }, \
578 { "pim6", CTLTYPE_NODE }, \
579 }
580
581
582
583
584 #define IPV6CTL_FORWARDING 1
585 #define IPV6CTL_SENDREDIRECTS 2
586 #define IPV6CTL_DEFHLIM 3
587 #ifdef notyet
588 #define IPV6CTL_DEFMTU 4
589 #endif
590 #define IPV6CTL_FORWSRCRT 5
591 #define IPV6CTL_STATS 6
592 #define IPV6CTL_MRTSTATS 7
593 #define IPV6CTL_MRTPROTO 8
594 #define IPV6CTL_MAXFRAGPACKETS 9
595 #define IPV6CTL_SOURCECHECK 10
596 #define IPV6CTL_SOURCECHECK_LOGINT 11
597 #define IPV6CTL_ACCEPT_RTADV 12
598 #define IPV6CTL_KEEPFAITH 13
599 #define IPV6CTL_LOG_INTERVAL 14
600 #define IPV6CTL_HDRNESTLIMIT 15
601 #define IPV6CTL_DAD_COUNT 16
602 #define IPV6CTL_AUTO_FLOWLABEL 17
603 #define IPV6CTL_DEFMCASTHLIM 18
604 #ifdef notdef
605 #define IPV6CTL_GIF_HLIM 19
606 #endif
607 #define IPV6CTL_KAME_VERSION 20
608 #define IPV6CTL_USE_DEPRECATED 21
609 #define IPV6CTL_RR_PRUNE 22
610
611 #define IPV6CTL_V6ONLY 24
612
613 #define IPV6CTL_MAXFRAGS 41
614 #define IPV6CTL_MFORWARDING 42
615 #define IPV6CTL_MULTIPATH 43
616 #define IPV6CTL_MCAST_PMTU 44
617 #define IPV6CTL_MAXID 45
618
619
620
621 #define IPV6CTL_NAMES { \
622 { 0, 0 }, \
623 { "forwarding", CTLTYPE_INT }, \
624 { "redirect", CTLTYPE_INT }, \
625 { "hlim", CTLTYPE_INT }, \
626 { "mtu", CTLTYPE_INT }, \
627 { "forwsrcrt", CTLTYPE_INT }, \
628 { 0, 0 }, \
629 { 0, 0 }, \
630 { "mrtproto", CTLTYPE_INT }, \
631 { "maxfragpackets", CTLTYPE_INT }, \
632 { "sourcecheck", CTLTYPE_INT }, \
633 { "sourcecheck_logint", CTLTYPE_INT }, \
634 { "accept_rtadv", CTLTYPE_INT }, \
635 { "keepfaith", CTLTYPE_INT }, \
636 { "log_interval", CTLTYPE_INT }, \
637 { "hdrnestlimit", CTLTYPE_INT }, \
638 { "dad_count", CTLTYPE_INT }, \
639 { "auto_flowlabel", CTLTYPE_INT }, \
640 { "defmcasthlim", CTLTYPE_INT }, \
641 { 0, 0 }, \
642 { "kame_version", CTLTYPE_STRING }, \
643 { "use_deprecated", CTLTYPE_INT }, \
644 { "rr_prune", CTLTYPE_INT }, \
645 { 0, 0 }, \
646 { "v6only", CTLTYPE_INT }, \
647 { 0, 0 }, \
648 { 0, 0 }, \
649 { 0, 0 }, \
650 { 0, 0 }, \
651 { 0, 0 }, \
652 { 0, 0 }, \
653 { 0, 0 }, \
654 { 0, 0 }, \
655 { 0, 0 }, \
656 { 0, 0 }, \
657 { 0, 0 }, \
658 { 0, 0 }, \
659 { 0, 0 }, \
660 { 0, 0 }, \
661 { 0, 0 }, \
662 { 0, 0 }, \
663 { "maxfrags", CTLTYPE_INT }, \
664 { "mforwarding", CTLTYPE_INT }, \
665 { "multipath", CTLTYPE_INT }, \
666 { "multicast_mtudisc", CTLTYPE_INT }, \
667 }
668
669 #define IPV6CTL_VARS { \
670 NULL, \
671 &ip6_forwarding, \
672 &ip6_sendredirects, \
673 &ip6_defhlim, \
674 NULL, \
675 NULL, \
676 NULL, \
677 NULL, \
678 NULL, \
679 &ip6_maxfragpackets, \
680 NULL, \
681 NULL, \
682 &ip6_accept_rtadv, \
683 &ip6_keepfaith, \
684 &ip6_log_interval, \
685 &ip6_hdrnestlimit, \
686 &ip6_dad_count, \
687 &ip6_auto_flowlabel, \
688 &ip6_defmcasthlim, \
689 NULL, \
690 NULL, \
691 &ip6_use_deprecated, \
692 &ip6_rr_prune, \
693 NULL, \
694 NULL, \
695 NULL, \
696 NULL, \
697 NULL, \
698 NULL, \
699 NULL, \
700 NULL, \
701 NULL, \
702 NULL, \
703 NULL, \
704 NULL, \
705 NULL, \
706 NULL, \
707 NULL, \
708 NULL, \
709 NULL, \
710 NULL, \
711 &ip6_maxfrags, \
712 &ip6_mforwarding, \
713 &ip6_multipath, \
714 &ip6_mcast_pmtu, \
715 }
716
717 #endif
718
719 #ifdef _KERNEL
720 struct cmsghdr;
721
722 int in6_cksum(struct mbuf *, u_int8_t, u_int32_t, u_int32_t);
723 int in6_localaddr(struct in6_addr *);
724 int in6_addrscope(struct in6_addr *);
725 struct in6_ifaddr *in6_ifawithscope(struct ifnet *, struct in6_addr *);
726 struct in6_ifaddr *in6_ifawithifp(struct ifnet *, struct in6_addr *);
727 extern void in6_if_up(struct ifnet *);
728
729 #define satosin6(sa) ((struct sockaddr_in6 *)(sa))
730 #define sin6tosa(sin6) ((struct sockaddr *)(sin6))
731 #define ifatoia6(ifa) ((struct in6_ifaddr *)(ifa))
732 #endif
733
734 __BEGIN_DECLS
735 struct cmsghdr;
736
737 extern int inet6_option_space(int);
738 extern int inet6_option_init(void *, struct cmsghdr **, int);
739 extern int inet6_option_append(struct cmsghdr *, const u_int8_t *,
740 int, int);
741 extern u_int8_t *inet6_option_alloc(struct cmsghdr *, int, int, int);
742 extern int inet6_option_next(const struct cmsghdr *, u_int8_t **);
743 extern int inet6_option_find(const struct cmsghdr *, u_int8_t **, int);
744
745 extern size_t inet6_rthdr_space(int, int);
746 extern struct cmsghdr *inet6_rthdr_init(void *, int);
747 extern int inet6_rthdr_add(struct cmsghdr *, const struct in6_addr *,
748 unsigned int);
749 extern int inet6_rthdr_lasthop(struct cmsghdr *, unsigned int);
750 #if 0
751 extern int inet6_rthdr_reverse(const struct cmsghdr *, struct cmsghdr *);
752 #endif
753 extern int inet6_rthdr_segments(const struct cmsghdr *);
754 extern struct in6_addr *inet6_rthdr_getaddr(struct cmsghdr *, int);
755 extern int inet6_rthdr_getflags(const struct cmsghdr *, int);
756
757 extern int inet6_opt_init(void *, socklen_t);
758 extern int inet6_opt_append(void *, socklen_t, int, u_int8_t,
759 socklen_t, u_int8_t, void **);
760 extern int inet6_opt_finish(void *, socklen_t, int);
761 extern int inet6_opt_set_val(void *, int, void *, socklen_t);
762
763 extern int inet6_opt_next(void *, socklen_t, int, u_int8_t *,
764 socklen_t *, void **);
765 extern int inet6_opt_find(void *, socklen_t, int, u_int8_t,
766 socklen_t *, void **);
767 extern int inet6_opt_get_val(void *, int, void *, socklen_t);
768
769 extern socklen_t inet6_rth_space(int, int);
770 extern void *inet6_rth_init(void *, socklen_t, int, int);
771 extern int inet6_rth_add(void *, const struct in6_addr *);
772 extern int inet6_rth_reverse(const void *, void *);
773 extern int inet6_rth_segments(const void *);
774 extern struct in6_addr *inet6_rth_getaddr(const void *, int);
775 __END_DECLS
776
777 #endif