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: #endif
228:
229: 230: 231: 232: 233: 234:
235: #ifdef _KERNEL
236: #define IN6_ARE_ADDR_EQUAL(a, b) \
237: (bcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
238: #else
239: #if __BSD_VISIBLE
240: #define IN6_ARE_ADDR_EQUAL(a, b) \
241: (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
242: #endif
243: #endif
244:
245: 246: 247:
248: #define IN6_IS_ADDR_UNSPECIFIED(a) \
249: ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
250: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
251: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
252: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == 0))
253:
254: 255: 256:
257: #define IN6_IS_ADDR_LOOPBACK(a) \
258: ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
259: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
260: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
261: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == ntohl(1)))
262:
263: 264: 265:
266: #define IN6_IS_ADDR_V4COMPAT(a) \
267: ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
268: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
269: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
270: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != 0) && \
271: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != ntohl(1)))
272:
273: 274: 275:
276: #define IN6_IS_ADDR_V4MAPPED(a) \
277: ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
278: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
279: (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff)))
280:
281: 282: 283:
284:
285: #ifdef _KERNEL
286: #define IPV6_ADDR_SCOPE_NODELOCAL 0x01
287: #define IPV6_ADDR_SCOPE_INTFACELOCAL 0x01
288: #define IPV6_ADDR_SCOPE_LINKLOCAL 0x02
289: #define IPV6_ADDR_SCOPE_SITELOCAL 0x05
290: #define IPV6_ADDR_SCOPE_ORGLOCAL 0x08
291: #define IPV6_ADDR_SCOPE_GLOBAL 0x0e
292: #else
293: #define __IPV6_ADDR_SCOPE_NODELOCAL 0x01
294: #define __IPV6_ADDR_SCOPE_INTFACELOCAL 0x01
295: #define __IPV6_ADDR_SCOPE_LINKLOCAL 0x02
296: #define __IPV6_ADDR_SCOPE_SITELOCAL 0x05
297: #define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08
298: #define __IPV6_ADDR_SCOPE_GLOBAL 0x0e
299: #endif
300:
301: 302: 303: 304:
305: #define IN6_IS_ADDR_LINKLOCAL(a) \
306: (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
307: #define IN6_IS_ADDR_SITELOCAL(a) \
308: (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
309:
310: 311: 312:
313: #define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff)
314:
315: #ifdef _KERNEL
316: #define IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f)
317: #else
318: #define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f)
319: #endif
320:
321: 322: 323:
324: #ifdef _KERNEL
325: #define IN6_IS_ADDR_MC_NODELOCAL(a) \
326: (IN6_IS_ADDR_MULTICAST(a) && \
327: (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL))
328: #define IN6_IS_ADDR_MC_INTFACELOCAL(a) \
329: (IN6_IS_ADDR_MULTICAST(a) && \
330: (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_INTFACELOCAL))
331: #define IN6_IS_ADDR_MC_LINKLOCAL(a) \
332: (IN6_IS_ADDR_MULTICAST(a) && \
333: (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL))
334: #define IN6_IS_ADDR_MC_SITELOCAL(a) \
335: (IN6_IS_ADDR_MULTICAST(a) && \
336: (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL))
337: #define IN6_IS_ADDR_MC_ORGLOCAL(a) \
338: (IN6_IS_ADDR_MULTICAST(a) && \
339: (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL))
340: #define IN6_IS_ADDR_MC_GLOBAL(a) \
341: (IN6_IS_ADDR_MULTICAST(a) && \
342: (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL))
343: #else
344: #define IN6_IS_ADDR_MC_NODELOCAL(a) \
345: (IN6_IS_ADDR_MULTICAST(a) && \
346: (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL))
347: #define IN6_IS_ADDR_MC_INTFACELOCAL(a) \
348: (IN6_IS_ADDR_MULTICAST(a) && \
349: (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_INTFACELOCAL))
350: #define IN6_IS_ADDR_MC_LINKLOCAL(a) \
351: (IN6_IS_ADDR_MULTICAST(a) && \
352: (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL))
353: #define IN6_IS_ADDR_MC_SITELOCAL(a) \
354: (IN6_IS_ADDR_MULTICAST(a) && \
355: (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL))
356: #define IN6_IS_ADDR_MC_ORGLOCAL(a) \
357: (IN6_IS_ADDR_MULTICAST(a) && \
358: (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL))
359: #define IN6_IS_ADDR_MC_GLOBAL(a) \
360: (IN6_IS_ADDR_MULTICAST(a) && \
361: (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL))
362: #endif
363:
364: #ifdef _KERNEL
365: 366: 367:
368: #define IN6_IS_SCOPE_LINKLOCAL(a) \
369: ((IN6_IS_ADDR_LINKLOCAL(a)) || \
370: (IN6_IS_ADDR_MC_LINKLOCAL(a)))
371: #define IN6_IS_SCOPE_EMBED(a) \
372: ((IN6_IS_ADDR_LINKLOCAL(a)) || \
373: (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \
374: (IN6_IS_ADDR_MC_INTFACELOCAL(a)))
375:
376: #define IFA6_IS_DEPRECATED(a) \
377: ((a)->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME && \
378: (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
379: (a)->ia6_lifetime.ia6t_pltime)
380: #define IFA6_IS_INVALID(a) \
381: ((a)->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME && \
382: (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
383: (a)->ia6_lifetime.ia6t_vltime)
384: #endif
385:
386: 387: 388:
389: #if __BSD_VISIBLE
390: struct route_in6 {
391: struct rtentry *ro_rt;
392: u_long ro_tableid;
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: #define IPV6_PIPEX 63
481:
482: #define IPV6_RTABLE 0x1021
483:
484:
485:
486: #define IPV6_RTHDR_LOOSE 0
487: #define IPV6_RTHDR_STRICT 1
488: #define IPV6_RTHDR_TYPE_0 0
489:
490: 491: 492:
493: #define IPV6_DEFAULT_MULTICAST_HOPS 1
494: #define IPV6_DEFAULT_MULTICAST_LOOP 1
495:
496: 497: 498:
499: struct ipv6_mreq {
500: struct in6_addr ipv6mr_multiaddr;
501: unsigned int ipv6mr_interface;
502: };
503:
504: 505: 506:
507: struct in6_pktinfo {
508: struct in6_addr ipi6_addr;
509: unsigned int ipi6_ifindex;
510: };
511:
512: 513: 514:
515: struct ip6_mtuinfo {
516: struct sockaddr_in6 ip6m_addr;
517: u_int32_t ip6m_mtu;
518: };
519:
520: 521: 522: 523:
524: #define IPV6_PORTRANGE_DEFAULT 0
525: #define IPV6_PORTRANGE_HIGH 1
526: #define IPV6_PORTRANGE_LOW 2
527:
528: #if __BSD_VISIBLE
529: 530: 531: 532: 533: 534:
535: #define IPV6PROTO_MAXID (IPPROTO_DIVERT + 1)
536:
537: #define CTL_IPV6PROTO_NAMES { \
538: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
539: { 0, 0 }, \
540: { "tcp6", CTLTYPE_NODE }, \
541: { 0, 0 }, \
542: { 0, 0 }, \
543: { 0, 0 }, \
544: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
545: { 0, 0 }, \
546: { 0, 0 }, \
547: { "udp6", CTLTYPE_NODE }, \
548: { 0, 0 }, \
549: { 0, 0 }, \
550: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
551: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
552: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
553: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
554: { 0, 0 }, \
555: { "ip6", CTLTYPE_NODE }, \
556: { 0, 0 }, \
557: { 0, 0 }, \
558: { 0, 0 }, \
559: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
560: { 0, 0 }, \
561: { "ipsec6", CTLTYPE_NODE }, \
562: { 0, 0 }, \
563: { 0, 0 }, \
564: { 0, 0 }, \
565: { 0, 0 }, \
566: { 0, 0 }, \
567: { 0, 0 }, \
568: { "icmp6", CTLTYPE_NODE }, \
569: { 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 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
576: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
577: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
578: { 0, 0 }, \
579: { 0, 0 }, \
580: { 0, 0 }, \
581: { "pim6", CTLTYPE_NODE }, \
582: { 0, 0 }, \
583: { 0, 0 }, \
584: { 0, 0 }, \
585: { 0, 0 }, \
586: { 0, 0 }, \
587: { 0, 0 }, \
588: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
589: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
590: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
591: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
592: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
593: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
594: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
595: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
596: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
597: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
598: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
599: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
600: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
601: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
602: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
603: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
604: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
605: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
606: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
607: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
608: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
609: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
610: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
611: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
612: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
613: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
614: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
615: { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
616: { 0, 0 }, \
617: { 0, 0 }, \
618: { 0, 0 }, \
619: { 0, 0 }, \
620: { 0, 0 }, \
621: { 0, 0 }, \
622: { 0, 0 }, \
623: { 0, 0 }, \
624: { "divert", CTLTYPE_NODE }, \
625: }
626:
627: 628: 629:
630: #define IPV6CTL_FORWARDING 1
631: #define IPV6CTL_SENDREDIRECTS 2
632: #define IPV6CTL_DEFHLIM 3
633: #ifdef notyet
634: #define IPV6CTL_DEFMTU 4
635: #endif
636: #define IPV6CTL_FORWSRCRT 5
637: #define IPV6CTL_STATS 6
638: #define IPV6CTL_MRTSTATS 7
639: #define IPV6CTL_MRTPROTO 8
640: #define IPV6CTL_MAXFRAGPACKETS 9
641: #define IPV6CTL_SOURCECHECK 10
642: #define IPV6CTL_SOURCECHECK_LOGINT 11
643: #define IPV6CTL_ACCEPT_RTADV 12
644: #define IPV6CTL_KEEPFAITH 13
645: #define IPV6CTL_LOG_INTERVAL 14
646: #define IPV6CTL_HDRNESTLIMIT 15
647: #define IPV6CTL_DAD_COUNT 16
648: #define IPV6CTL_AUTO_FLOWLABEL 17
649: #define IPV6CTL_DEFMCASTHLIM 18
650: #ifdef notdef
651: #define IPV6CTL_GIF_HLIM 19
652: #endif
653: #define IPV6CTL_KAME_VERSION 20
654: #define IPV6CTL_USE_DEPRECATED 21
655: #define IPV6CTL_RR_PRUNE 22
656:
657: #define IPV6CTL_V6ONLY 24
658:
659: #define IPV6CTL_MAXFRAGS 41
660: #define IPV6CTL_MFORWARDING 42
661: #define IPV6CTL_MULTIPATH 43
662: #define IPV6CTL_MCAST_PMTU 44
663: #define IPV6CTL_NEIGHBORGCTHRESH 45
664: #define IPV6CTL_MAXIFPREFIXES 46
665: #define IPV6CTL_MAXIFDEFROUTERS 47
666: #define IPV6CTL_MAXDYNROUTES 48
667: #define IPV6CTL_DAD_PENDING 49
668: #define IPV6CTL_MAXID 50
669:
670:
671:
672:
673: #define IPV6CTL_NAMES { \
674: { 0, 0 }, \
675: { "forwarding", CTLTYPE_INT }, \
676: { "redirect", CTLTYPE_INT }, \
677: { "hlim", CTLTYPE_INT }, \
678: { "mtu", CTLTYPE_INT }, \
679: { "forwsrcrt", CTLTYPE_INT }, \
680: { 0, 0 }, \
681: { 0, 0 }, \
682: { "mrtproto", CTLTYPE_INT }, \
683: { "maxfragpackets", CTLTYPE_INT }, \
684: { "sourcecheck", CTLTYPE_INT }, \
685: { "sourcecheck_logint", CTLTYPE_INT }, \
686: { "accept_rtadv", CTLTYPE_INT }, \
687: { "keepfaith", CTLTYPE_INT }, \
688: { "log_interval", CTLTYPE_INT }, \
689: { "hdrnestlimit", CTLTYPE_INT }, \
690: { "dad_count", CTLTYPE_INT }, \
691: { "auto_flowlabel", CTLTYPE_INT }, \
692: { "defmcasthlim", CTLTYPE_INT }, \
693: { 0, 0 }, \
694: { "kame_version", CTLTYPE_STRING }, \
695: { "use_deprecated", CTLTYPE_INT }, \
696: { "rr_prune", CTLTYPE_INT }, \
697: { 0, 0 }, \
698: { "v6only", CTLTYPE_INT }, \
699: { 0, 0 }, \
700: { 0, 0 }, \
701: { 0, 0 }, \
702: { 0, 0 }, \
703: { 0, 0 }, \
704: { 0, 0 }, \
705: { 0, 0 }, \
706: { 0, 0 }, \
707: { 0, 0 }, \
708: { 0, 0 }, \
709: { 0, 0 }, \
710: { 0, 0 }, \
711: { 0, 0 }, \
712: { 0, 0 }, \
713: { 0, 0 }, \
714: { 0, 0 }, \
715: { "maxfrags", CTLTYPE_INT }, \
716: { "mforwarding", CTLTYPE_INT }, \
717: { "multipath", CTLTYPE_INT }, \
718: { "multicast_mtudisc", CTLTYPE_INT }, \
719: { "neighborgcthresh", CTLTYPE_INT }, \
720: { "maxifprefixes", CTLTYPE_INT }, \
721: { "maxifdefrouters", CTLTYPE_INT }, \
722: { "maxdynroutes", CTLTYPE_INT }, \
723: { "dad_pending", CTLTYPE_INT }, \
724: }
725:
726: #define IPV6CTL_VARS { \
727: NULL, \
728: &ip6_forwarding, \
729: &ip6_sendredirects, \
730: &ip6_defhlim, \
731: NULL, \
732: NULL, \
733: NULL, \
734: NULL, \
735: NULL, \
736: &ip6_maxfragpackets, \
737: NULL, \
738: NULL, \
739: &ip6_accept_rtadv, \
740: &ip6_keepfaith, \
741: &ip6_log_interval, \
742: &ip6_hdrnestlimit, \
743: &ip6_dad_count, \
744: &ip6_auto_flowlabel, \
745: &ip6_defmcasthlim, \
746: NULL, \
747: NULL, \
748: &ip6_use_deprecated, \
749: &ip6_rr_prune, \
750: NULL, \
751: NULL, \
752: NULL, \
753: NULL, \
754: NULL, \
755: NULL, \
756: NULL, \
757: NULL, \
758: NULL, \
759: NULL, \
760: NULL, \
761: NULL, \
762: NULL, \
763: NULL, \
764: NULL, \
765: NULL, \
766: NULL, \
767: NULL, \
768: &ip6_maxfrags, \
769: &ip6_mforwarding, \
770: &ip6_multipath, \
771: &ip6_mcast_pmtu, \
772: &ip6_neighborgcthresh, \
773: &ip6_maxifprefixes, \
774: &ip6_maxifdefrouters, \
775: &ip6_maxdynroutes, \
776: NULL, \
777: }
778:
779: #endif
780:
781: #ifdef _KERNEL
782: struct cmsghdr;
783:
784: int in6_cksum(struct mbuf *, u_int8_t, u_int32_t, u_int32_t);
785: int in6_localaddr(struct in6_addr *);
786: int in6_addrscope(struct in6_addr *);
787: struct in6_ifaddr *in6_ifawithscope(struct ifnet *, struct in6_addr *, u_int);
788: extern void in6_if_up(struct ifnet *);
789: void in6_get_rand_ifid(struct ifnet *, struct in6_addr *);
790: int in6_mask2len(struct in6_addr *, u_char *);
791:
792: #define satosin6(sa) ((struct sockaddr_in6 *)(sa))
793: #define sin6tosa(sin6) ((struct sockaddr *)(sin6))
794: #define ifatoia6(ifa) ((struct in6_ifaddr *)(ifa))
795: #endif
796:
797: __BEGIN_DECLS
798: struct cmsghdr;
799:
800: extern int inet6_option_space(int);
801: extern int inet6_option_init(void *, struct cmsghdr **, int);
802: extern int inet6_option_append(struct cmsghdr *, const u_int8_t *,
803: int, int);
804: extern u_int8_t *inet6_option_alloc(struct cmsghdr *, int, int, int);
805: extern int inet6_option_next(const struct cmsghdr *, u_int8_t **);
806: extern int inet6_option_find(const struct cmsghdr *, u_int8_t **, int);
807:
808: extern size_t inet6_rthdr_space(int, int);
809: extern struct cmsghdr *inet6_rthdr_init(void *, int);
810: extern int inet6_rthdr_add(struct cmsghdr *, const struct in6_addr *,
811: unsigned int);
812: extern int inet6_rthdr_lasthop(struct cmsghdr *, unsigned int);
813: #if 0
814: extern int inet6_rthdr_reverse(const struct cmsghdr *, struct cmsghdr *);
815: #endif
816: extern int inet6_rthdr_segments(const struct cmsghdr *);
817: extern struct in6_addr *inet6_rthdr_getaddr(struct cmsghdr *, int);
818: extern int inet6_rthdr_getflags(const struct cmsghdr *, int);
819:
820: extern int inet6_opt_init(void *, socklen_t);
821: extern int inet6_opt_append(void *, socklen_t, int, u_int8_t,
822: socklen_t, u_int8_t, void **);
823: extern int inet6_opt_finish(void *, socklen_t, int);
824: extern int inet6_opt_set_val(void *, int, void *, socklen_t);
825:
826: extern int inet6_opt_next(void *, socklen_t, int, u_int8_t *,
827: socklen_t *, void **);
828: extern int inet6_opt_find(void *, socklen_t, int, u_int8_t,
829: socklen_t *, void **);
830: extern int inet6_opt_get_val(void *, int, void *, socklen_t);
831:
832: extern socklen_t inet6_rth_space(int, int);
833: extern void *inet6_rth_init(void *, socklen_t, int, int);
834: extern int inet6_rth_add(void *, const struct in6_addr *);
835: extern int inet6_rth_reverse(const void *, void *);
836: extern int inet6_rth_segments(const void *);
837: extern struct in6_addr *inet6_rth_getaddr(const void *, int);
838: __END_DECLS
839:
840: #endif