1 //Written in the D programming language
2 
3 /++
4     D header file for Darwin's extensions to POSIX's netinet/in.h.
5 
6     Copyright: Copyright 2017 -
7     License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
8     Authors:   $(HTTP jmdavisprog.com, Jonathan M Davis)
9  +/
10 module core.sys.darwin.netinet.in_;
11 
12 import core.sys.darwin.sys.cdefs;
13 
14 public import core.sys.posix.netinet.in_;
15 
16 version (OSX)
17     version = Darwin;
18 else version (iOS)
19     version = Darwin;
20 else version (TVOS)
21     version = Darwin;
22 else version (WatchOS)
23     version = Darwin;
24 
25 version (Darwin):
26 extern(C) nothrow @nogc:
27 
28 enum IPPROTO_IP = 0;
29 static if (_DARWIN_C_SOURCE)
30     enum IPPROTO_HOPOPTS = 0;
31 enum IPPROTO_ICMP = 1;
32 static if (_DARWIN_C_SOURCE)
33 {
34     enum IPPROTO_IGMP = 2;
35     enum IPPROTO_GGP  = 3;
36     enum IPPROTO_IPV4 = 4;
37     enum IPPROTO_IPIP = IPPROTO_IPV4;
38 }
39 enum IPPROTO_TCP = 6;
40 static if (_DARWIN_C_SOURCE)
41 {
42     enum IPPROTO_ST     = 7;
43     enum IPPROTO_EGP    = 8;
44     enum IPPROTO_PIGP   = 9;
45     enum IPPROTO_RCCMON = 10;
46     enum IPPROTO_NVPII  = 11;
47     enum IPPROTO_PUP    = 12;
48     enum IPPROTO_ARGUS  = 13;
49     enum IPPROTO_EMCON  = 14;
50     enum IPPROTO_XNET   = 15;
51     enum IPPROTO_CHAOS  = 16;
52 }
53 enum IPPROTO_UDP = 17;
54 static if (_DARWIN_C_SOURCE)
55 {
56     enum IPPROTO_MUX    = 18;
57     enum IPPROTO_MEAS   = 19;
58     enum IPPROTO_HMP    = 20;
59     enum IPPROTO_PRM    = 21;
60     enum IPPROTO_IDP    = 22;
61     enum IPPROTO_TRUNK1 = 23;
62     enum IPPROTO_TRUNK2 = 24;
63     enum IPPROTO_LEAF1  = 25;
64     enum IPPROTO_LEAF2  = 26;
65     enum IPPROTO_RDP    = 27;
66     enum IPPROTO_IRTP   = 28;
67     enum IPPROTO_TP     = 29;
68     enum IPPROTO_BLT    = 30;
69     enum IPPROTO_NSP    = 31;
70     enum IPPROTO_INP    = 32;
71     enum IPPROTO_SEP    = 33;
72     enum IPPROTO_3PC    = 34;
73     enum IPPROTO_IDPR   = 35;
74     enum IPPROTO_XTP    = 36;
75     enum IPPROTO_DDP    = 37;
76     enum IPPROTO_CMTP   = 38;
77     enum IPPROTO_TPXX   = 39;
78     enum IPPROTO_IL     = 40;
79 }
80 enum IPPROTO_IPV6 = 41;
81 static if (_DARWIN_C_SOURCE)
82 {
83     enum IPPROTO_SDRP      = 42;
84     enum IPPROTO_ROUTING   = 43;
85     enum IPPROTO_FRAGMENT  = 44;
86     enum IPPROTO_IDRP      = 45;
87     enum IPPROTO_RSVP      = 46;
88     enum IPPROTO_GRE       = 47;
89     enum IPPROTO_MHRP      = 48;
90     enum IPPROTO_BHA       = 49;
91     enum IPPROTO_ESP       = 50;
92     enum IPPROTO_AH        = 51;
93     enum IPPROTO_INLSP     = 52;
94     enum IPPROTO_SWIPE     = 53;
95     enum IPPROTO_NHRP      = 54;
96     enum IPPROTO_ICMPV6    = 58;
97     enum IPPROTO_NONE      = 59;
98     enum IPPROTO_DSTOPTS   = 60;
99     enum IPPROTO_AHIP      = 61;
100     enum IPPROTO_CFTP      = 62;
101     enum IPPROTO_HELLO     = 63;
102     enum IPPROTO_SATEXPAK  = 64;
103     enum IPPROTO_KRYPTOLAN = 65;
104     enum IPPROTO_RVD       = 66;
105     enum IPPROTO_IPPC      = 67;
106     enum IPPROTO_ADFS      = 68;
107     enum IPPROTO_SATMON    = 69;
108     enum IPPROTO_VISA      = 70;
109     enum IPPROTO_IPCV      = 71;
110     enum IPPROTO_CPNX      = 72;
111     enum IPPROTO_CPHB      = 73;
112     enum IPPROTO_WSN       = 74;
113     enum IPPROTO_PVP       = 75;
114     enum IPPROTO_BRSATMON  = 76;
115     enum IPPROTO_ND        = 77;
116     enum IPPROTO_WBMON     = 78;
117     enum IPPROTO_WBEXPAK   = 79;
118     enum IPPROTO_EON       = 80;
119     enum IPPROTO_VMTP      = 81;
120     enum IPPROTO_SVMTP     = 82;
121     enum IPPROTO_VINES     = 83;
122     enum IPPROTO_TTP       = 84;
123     enum IPPROTO_IGP       = 85;
124     enum IPPROTO_DGP       = 86;
125     enum IPPROTO_TCF       = 87;
126     enum IPPROTO_IGRP      = 88;
127     enum IPPROTO_OSPFIGP   = 89;
128     enum IPPROTO_SRPC      = 90;
129     enum IPPROTO_LARP      = 91;
130     enum IPPROTO_MTP       = 92;
131     enum IPPROTO_AX25      = 93;
132     enum IPPROTO_IPEIP     = 94;
133     enum IPPROTO_MICP      = 95;
134     enum IPPROTO_SCCSP     = 96;
135     enum IPPROTO_ETHERIP   = 97;
136     enum IPPROTO_ENCAP     = 98;
137     enum IPPROTO_APES      = 99;
138     enum IPPROTO_GMTP      = 100;
139     enum IPPROTO_PIM       = 103;
140     enum IPPROTO_IPCOMP    = 108;
141     enum IPPROTO_PGM       = 113;
142     enum IPPROTO_SCTP      = 132;
143     enum IPPROTO_DIVERT    = 254;
144 }
145 enum IPPROTO_RAW = 255;
146 
147 static if (_DARWIN_C_SOURCE)
148 {
149     enum IPPROTO_MAX  = 256;
150     enum IPPROTO_DONE = 257;
151 }
152 
153 static if (_DARWIN_C_SOURCE)
154 {
155     enum IPPORT_RESERVED = 1024;
156     enum IPPORT_USERRESERVED = 5000;
157 
158     enum IPPORT_HIFIRSTAUTO = 49152;
159     enum IPPORT_HILASTAUTO  = 65535;
160 
161     enum IPPORT_RESERVEDSTART = 600;
162 }
163 
164 static if (_DARWIN_C_SOURCE)
165 {
IN_CLASSA(in_addr_t i)166     extern(D) bool IN_CLASSA(in_addr_t i) pure @safe { return (i & 0x80000000) == 0; }
167     enum IN_CLASSA_NET    = 0xff000000;
168     enum IN_CLASSA_NSHIFT = 24;
169     enum IN_CLASSA_HOST   = 0x00ffffff;
170     enum IN_CLASSA_MAX    = 128;
171 
IN_CLASSB(in_addr_t i)172     extern(D) bool IN_CLASSB(in_addr_t i) pure @safe { return (i & 0xc0000000) == 0x80000000; }
173     enum IN_CLASSB_NET    = 0xffff0000;
174     enum IN_CLASSB_NSHIFT = 16;
175     enum IN_CLASSB_HOST   = 0x0000ffff;
176     enum IN_CLASSB_MAX    = 65536;
177 
IN_CLASSC(in_addr_t i)178     extern(D) bool IN_CLASSC(in_addr_t i) pure @safe { return (i & 0xe0000000) == 0xc0000000; }
179     enum IN_CLASSC_NET    = 0xffffff00;
180     enum IN_CLASSC_NSHIFT = 8;
181     enum IN_CLASSC_HOST   = 0x000000ff;
182 
IN_CLASSD(in_addr_t i)183     extern(D) bool IN_CLASSD(in_addr_t i) pure @safe { return (i & 0xf0000000) == 0xe0000000; }
184     enum IN_CLASSD_NET    = 0xf0000000;
185     enum IN_CLASSD_NSHIFT = 28;
186     enum IN_CLASSD_HOST   = 0x0fffffff;
IN_MULTICAST(in_addr_t i)187     extern(D) bool IN_MULTICAST(in_addr_t i) pure @safe { return IN_CLASSD(i); }
188 
189     // The fact that these are identical looks suspicious (they're not quite
190     // identical on Linux). However, this _is_ how they're defined in FreeBSD
191     // and on OS X. So, while it _might_ be a bug, if it is, it's an upstream
192     // one, and we're compatible with it.
IN_EXPERIMENTAL(in_addr_t i)193     extern(D) bool IN_EXPERIMENTAL(in_addr_t i) pure @safe { return (i & 0xf0000000) == 0xf0000000; }
IN_BADCLASS(in_addr_t i)194     extern(D) bool IN_BADCLASS(in_addr_t i) pure @safe { return (i & 0xf0000000) == 0xf0000000; }
195 
196     enum INADDR_UNSPEC_GROUP    = 0xe0000000;
197     enum INADDR_ALLHOSTS_GROUP  = 0xe0000001;
198     enum INADDR_ALLRTRS_GROUP   = 0xe0000002;
199     enum INADDR_ALLRPTS_GROUP   = 0xe0000016;
200     enum INADDR_CARP_GROUP      = 0xe0000012;
201     enum INADDR_PFSYNC_GROUP    = 0xe00000f0;
202     enum INADDR_ALLMDNS_GROUP   = 0xe00000fb;
203     enum INADDR_MAX_LOCAL_GROUP = 0xe00000ff;
204 
205     enum IN_LINKLOCALNETNUM = 0xA9FE0000;
IN_LINKLOCAL(in_addr_t i)206     extern(D) bool IN_LINKLOCAL(in_addr_t i) pure @safe { return (i & IN_CLASSB_NET) == IN_LINKLOCALNETNUM; }
IN_LOOPBACK(in_addr_t i)207     extern(D) bool IN_LOOPBACK(in_addr_t i) pure @safe { return (i & 0xff000000) == 0x7f000000; }
IN_ZERONET(in_addr_t i)208     extern(D) bool IN_ZERONET(in_addr_t i) pure @safe { return (i & 0xff000000) == 0; }
209 
IN_PRIVATE(in_addr_t i)210     extern(D) bool IN_PRIVATE(in_addr_t i) pure @safe
211     {
212         return (i & 0xff000000) == 0x0a000000 ||
213                (i & 0xfff00000) == 0xac100000 ||
214                (i & 0xffff0000) == 0xc0a80000;
215     }
216 
IN_LOCAL_GROUP(in_addr_t i)217     extern(D) bool IN_LOCAL_GROUP(in_addr_t i) pure @safe { return (i & 0xffffff00) == 0xe0000000; }
218 
IN_ANY_LOCAL(in_addr_t i)219     extern(D) bool IN_ANY_LOCAL(in_addr_t i) pure @safe { return IN_LINKLOCAL(i) || IN_LOCAL_GROUP(i); }
220 
221     enum IN_LOOPBACKNET = 127;
222 
223 
224     struct ip_opts
225     {
226         in_addr  ip_dst;
227         char[40] ip_opts = 0;
228     };
229 
230     enum IP_OPTIONS         = 1;
231     enum IP_HDRINCL         = 2;
232     enum IP_TOS             = 3;
233     enum IP_TTL             = 4;
234     enum IP_RECVOPTS        = 5;
235     enum IP_RECVRETOPTS     = 6;
236     enum IP_RECVDSTADDR     = 7;
237     enum IP_RETOPTS         = 8;
238     enum IP_MULTICAST_IF    = 9;
239     enum IP_MULTICAST_TTL   = 10;
240     enum IP_MULTICAST_LOOP  = 11;
241     enum IP_ADD_MEMBERSHIP  = 12;
242     enum IP_DROP_MEMBERSHIP = 13;
243     enum IP_MULTICAST_VIF   = 14;
244     enum IP_RSVP_ON         = 15;
245     enum IP_RSVP_OFF        = 16;
246     enum IP_RSVP_VIF_ON     = 17;
247     enum IP_RSVP_VIF_OFF    = 18;
248     enum IP_PORTRANGE       = 19;
249     enum IP_RECVIF          = 20;
250 
251     enum IP_IPSEC_POLICY = 21;
252     enum IP_STRIPHDR     = 23;
253     enum IP_RECVTTL      = 24;
254     enum IP_BOUND_IF     = 25;
255     enum IP_PKTINFO      = 26;
256     enum IP_RECVPKTINFO  = IP_PKTINFO;
257     enum IP_RECVTOS      = 27;
258 
259     enum IP_FW_ADD      = 40;
260     enum IP_FW_DEL      = 41;
261     enum IP_FW_FLUSH    = 42;
262     enum IP_FW_ZERO     = 43;
263     enum IP_FW_GET      = 44;
264     enum IP_FW_RESETLOG = 45;
265 
266     enum IP_OLD_FW_ADD      = 50;
267     enum IP_OLD_FW_DEL      = 51;
268     enum IP_OLD_FW_FLUSH    = 52;
269     enum IP_OLD_FW_ZERO     = 53;
270     enum IP_OLD_FW_GET      = 54;
271     enum IP_NAT__XXX        = 55;
272     enum IP_OLD_FW_RESETLOG = 56;
273 
274     enum IP_DUMMYNET_CONFIGURE = 60;
275     enum IP_DUMMYNET_DEL       = 61;
276     enum IP_DUMMYNET_FLUSH     = 62;
277     enum IP_DUMMYNET_GET       = 64;
278 
279     enum IP_TRAFFIC_MGT_BACKGROUND = 65;
280     enum IP_MULTICAST_IFINDEX      = 66;
281 
282     enum IP_ADD_SOURCE_MEMBERSHIP  = 70;
283     enum IP_DROP_SOURCE_MEMBERSHIP = 71;
284     enum IP_BLOCK_SOURCE           = 72;
285     enum IP_UNBLOCK_SOURCE         = 73;
286 
287     enum IP_MSFILTER = 74;
288 
289     enum MCAST_JOIN_GROUP         = 80;
290     enum MCAST_LEAVE_GROUP        = 81;
291     enum MCAST_JOIN_SOURCE_GROUP  = 82;
292     enum MCAST_LEAVE_SOURCE_GROUP = 83;
293     enum MCAST_BLOCK_SOURCE       = 84;
294     enum MCAST_UNBLOCK_SOURCE     = 85;
295 
296     enum IP_DEFAULT_MULTICAST_TTL  = 1;
297     enum IP_DEFAULT_MULTICAST_LOOP = 1;
298 
299     enum IP_MIN_MEMBERSHIPS = 31;
300     enum IP_MAX_MEMBERSHIPS = 4095;
301 
302     enum IP_MAX_GROUP_SRC_FILTER = 512;
303     enum IP_MAX_SOCK_SRC_FILTER  = 128;
304     enum IP_MAX_SOCK_MUTE_FILTER = 128;
305 
306     struct ip_mreq
307     {
308         in_addr imr_multiaddr;
309         in_addr imr_interface;
310     };
311 
312     struct ip_mreqn
313     {
314         in_addr imr_multiaddr;
315         in_addr imr_address;
316         int     imr_ifindex;
317     };
318 
319     struct ip_mreq_source
320     {
321         align(4):
322         in_addr imr_multiaddr;
323         in_addr imr_sourceaddr;
324         in_addr imr_interface;
325     };
326 
327     struct group_req
328     {
329         align(4):
330         uint             gr_interface;
331         sockaddr_storage gr_group;
332     };
333 
334     struct group_source_req
335     {
336         align(4):
337         uint             gsr_interface;
338         sockaddr_storage gsr_group;
339         sockaddr_storage gsr_source;
340     };
341 
342     int setipv4sourcefilter(int, in_addr, in_addr, uint, uint, in_addr*);
343     int getipv4sourcefilter(int, in_addr, in_addr, uint*, uint*, in_addr*);
344     int setsourcefilter(int, uint, sockaddr*, socklen_t, uint, uint, sockaddr_storage*);
345     int getsourcefilter(int, uint, sockaddr*, socklen_t, uint*, uint*, sockaddr_storage*);
346 
347     enum MCAST_UNDEFINED = 0;
348     enum MCAST_INCLUDE   = 1;
349     enum MCAST_EXCLUDE   = 2;
350 
351     enum IP_PORTRANGE_DEFAULT = 0;
352     enum IP_PORTRANGE_HIGH    = 1;
353     enum IP_PORTRANGE_LOW     = 2;
354 
355     struct in_pktinfo
356     {
357         uint     ipi_ifindex;
358         in_addr  ipi_spec_dst;
359         in_addr  ipi_addr;
360     };
361 
362     enum IPPROTO_MAXID = IPPROTO_AH + 1;
363 
364 
365     enum IPCTL_FORWARDING        = 1;
366     enum IPCTL_SENDREDIRECTS     = 2;
367     enum IPCTL_DEFTTL            = 3;
368     enum IPCTL_DEFMTU            = 4;
369     enum IPCTL_RTEXPIRE          = 5;
370     enum IPCTL_RTMINEXPIRE       = 6;
371     enum IPCTL_RTMAXCACHE        = 7;
372     enum IPCTL_SOURCEROUTE       = 8;
373     enum IPCTL_DIRECTEDBROADCAST = 9;
374     enum IPCTL_INTRQMAXLEN       = 10;
375     enum IPCTL_INTRQDROPS        = 11;
376     enum IPCTL_STATS             = 12;
377     enum IPCTL_ACCEPTSOURCEROUTE = 13;
378     enum IPCTL_FASTFORWARDING    = 14;
379     enum IPCTL_KEEPFAITH         = 15;
380     enum IPCTL_GIF_TTL           = 16;
381     enum IPCTL_MAXID             = 17;
382 
383     int bindresvport(int, sockaddr_in*);
384     int bindresvport_sa(int, sockaddr*);
385 }
386 
387 // =============================================================================
388 // What follows is from netinet6/in6.h, but since netinet6/in6.h specifically
389 // says that it should only be #included by #including netinet/in.h, it makes
390 // more sense to put them in here so that the way they're imported corresponds
391 // with the correct way of #including them in C/C++.
392 // =============================================================================
393 
394 static if (_DARWIN_C_SOURCE)
395 {
396     enum IPV6PORT_RESERVED    = 1024;
397     enum IPV6PORT_ANONMIN     = 49152;
398     enum IPV6PORT_ANONMAX     = 65535;
399     enum IPV6PORT_RESERVEDMIN = 600;
400     enum IPV6PORT_RESERVEDMAX = IPV6PORT_RESERVED - 1;
401 }
402 
403 
404 enum IN6ADDR_ANY_INIT = in6_addr.init;
405 enum IN6ADDR_LOOPBACK_INIT = in6_addr([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]);
407 
408 static if (_DARWIN_C_SOURCE)
409 {
410     enum IN6ADDR_NODELOCAL_ALLNODES_INIT = in6_addr([0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411                                                      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]);
412     enum IN6ADDR_INTFACELOCAL_ALLNODES_INIT = in6_addr([0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413                                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]);
414     enum IN6ADDR_LINKLOCAL_ALLNODES_INIT = in6_addr([0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415                                                      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]);
416     enum IN6ADDR_LINKLOCAL_ALLROUTERS_INIT = in6_addr([0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417                                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02]);
418     enum IN6ADDR_LINKLOCAL_ALLV2ROUTERS_INIT = in6_addr([0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419                                                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16]);
420     enum IN6ADDR_V4MAPPED_INIT = in6_addr([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
421                                            0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00]);
422 }
423 
424 __gshared const in6_addr in6addr_any;
425 __gshared const in6_addr in6addr_loopback;
426 static if (_DARWIN_C_SOURCE)
427 {
428     __gshared const in6_addr in6addr_nodelocal_allnodes;
429     __gshared const in6_addr in6addr_linklocal_allnodes;
430     __gshared const in6_addr in6addr_linklocal_allrouters;
431     __gshared const in6_addr in6addr_linklocal_allv2routers;
432 
IN6_ARE_ADDR_EQUAL(in6_addr * a,in6_addr * b)433     extern(D) bool IN6_ARE_ADDR_EQUAL(in6_addr* a, in6_addr* b) pure @safe { return *a == *b; }
434 }
435 
IN6_IS_ADDR_6TO4(in6_addr * x)436 extern(D) bool IN6_IS_ADDR_6TO4(in6_addr* x) pure @safe { return ntohs(x.s6_addr16[0]) == 0x2002; }
437 
438 enum __IPV6_ADDR_SCOPE_NODELOCAL    = 0x01;
439 enum __IPV6_ADDR_SCOPE_INTFACELOCAL = 0x01;
440 enum __IPV6_ADDR_SCOPE_LINKLOCAL    = 0x02;
441 enum __IPV6_ADDR_SCOPE_SITELOCAL    = 0x05;
442 enum __IPV6_ADDR_SCOPE_GLOBAL       = 0x0e;
443 
IN6_IS_ADDR_UNIQUE_LOCAL(in6_addr * a)444 extern(D) bool IN6_IS_ADDR_UNIQUE_LOCAL(in6_addr* a) pure @safe
445 {
446     return a.s6_addr[0] == 0xfc || a.s6_addr[0] == 0xfd;
447 }
448 
449 static if (_DARWIN_C_SOURCE)
450     enum IPV6_SOCKOPT_RESERVED1 = 3;
451 enum IPV6_UNICAST_HOPS   = 4;
452 enum IPV6_MULTICAST_IF   = 9;
453 enum IPV6_MULTICAST_HOPS = 10;
454 enum IPV6_MULTICAST_LOOP = 11;
455 enum IPV6_JOIN_GROUP     = 12;
456 enum IPV6_LEAVE_GROUP    = 13;
457 
458 static if (_DARWIN_C_SOURCE)
459 {
460     enum IPV6_PORTRANGE    = 14;
461     enum ICMP6_FILTER      = 18;
462 
463     enum IPV6_CHECKSUM = 26;
464 }
465 enum IPV6_V6ONLY = 27;
466 static if (_DARWIN_C_SOURCE)
467 {
468     enum IPV6_BINDV6ONLY = IPV6_V6ONLY;
469 
470     enum IPV6_IPSEC_POLICY = 28;
471 
472     enum IPV6_FW_ADD   = 30;
473     enum IPV6_FW_DEL   = 31;
474     enum IPV6_FW_FLUSH = 32;
475     enum IPV6_FW_ZERO  = 33;
476     enum IPV6_FW_GET   = 34;
477 
478     enum IPV6_RECVTCLASS = 35;
479     enum IPV6_TCLASS     = 36;
480 
481     enum IPV6_RTHDRDSTOPTS = 57;
482 
483     enum IPV6_RECVPKTINFO = 61;
484 
485     enum IPV6_RECVHOPLIMIT = 37;
486     enum IPV6_RECVRTHDR    = 38;
487     enum IPV6_RECVHOPOPTS  = 39;
488     enum IPV6_RECVDSTOPTS  = 40;
489 
490     enum IPV6_USE_MIN_MTU  = 42;
491     enum IPV6_RECVPATHMTU  = 43;
492 
493     enum IPV6_PATHMTU = 44;
494 
495     enum IPV6_PKTINFO  = 46;
496     enum IPV6_HOPLIMIT = 47;
497     enum IPV6_NEXTHOP  = 48;
498     enum IPV6_HOPOPTS  = 49;
499     enum IPV6_DSTOPTS  = 50;
500     enum IPV6_RTHDR    = 51;
501 
502     enum IPV6_AUTOFLOWLABEL = 59;
503 
504     enum IPV6_DONTFRAG = 62;
505 
506     enum IPV6_PREFER_TEMPADDR = 63;
507 
508     enum IPV6_BOUND_IF = 125;
509 
510     enum IPV6_RTHDR_LOOSE  = 0;
511     enum IPV6_RTHDR_STRICT = 1;
512     enum IPV6_RTHDR_TYPE_0 = 0;
513 
514     enum IPV6_DEFAULT_MULTICAST_HOPS = 1;
515     enum IPV6_DEFAULT_MULTICAST_LOOP = 1;
516 
517     enum IPV6_MIN_MEMBERSHIPS = 31;
518     enum IPV6_MAX_MEMBERSHIPS = 4095;
519 
520     enum IPV6_MAX_GROUP_SRC_FILTER = 512;
521     enum IPV6_MAX_SOCK_SRC_FILTER  = 128;
522 
523     struct in6_pktinfo
524     {
525         in6_addr ipi6_addr;
526         uint     ipi6_ifindex;
527     };
528 
529     struct ip6_mtuinfo
530     {
531         sockaddr_in6 ip6m_addr;
532         uint         ip6m_mtu;
533     };
534 
535     enum IPV6_PORTRANGE_DEFAULT = 0;
536     enum IPV6_PORTRANGE_HIGH    = 1;
537     enum IPV6_PORTRANGE_LOW     = 2;
538 
539     enum IPV6PROTO_MAXID = IPPROTO_PIM + 1;
540 
541     enum IPV6CTL_FORWARDING         = 1;
542     enum IPV6CTL_SENDREDIRECTS      = 2;
543     enum IPV6CTL_DEFHLIM            = 3;
544     enum IPV6CTL_DEFMTU             = 4;
545     enum IPV6CTL_FORWSRCRT          = 5;
546     enum IPV6CTL_STATS              = 6;
547     enum IPV6CTL_MRTSTATS           = 7;
548     enum IPV6CTL_MRTPROTO           = 8;
549     enum IPV6CTL_MAXFRAGPACKETS     = 9;
550     enum IPV6CTL_SOURCECHECK        = 10;
551     enum IPV6CTL_SOURCECHECK_LOGINT = 11;
552     enum IPV6CTL_ACCEPT_RTADV       = 12;
553 
554     enum IPV6CTL_LOG_INTERVAL   = 14;
555     enum IPV6CTL_HDRNESTLIMIT   = 15;
556     enum IPV6CTL_DAD_COUNT      = 16;
557     enum IPV6CTL_AUTO_FLOWLABEL = 17;
558     enum IPV6CTL_DEFMCASTHLIM   = 18;
559     enum IPV6CTL_GIF_HLIM       = 19;
560     enum IPV6CTL_KAME_VERSION   = 20;
561     enum IPV6CTL_USE_DEPRECATED = 21;
562     enum IPV6CTL_RR_PRUNE       = 22;
563     enum IPV6CTL_V6ONLY         = 24;
564     enum IPV6CTL_RTEXPIRE       = 25;
565     enum IPV6CTL_RTMINEXPIRE    = 26;
566     enum IPV6CTL_RTMAXCACHE     = 27;
567 
568     enum IPV6CTL_USETEMPADDR     = 32;
569     enum IPV6CTL_TEMPPLTIME      = 33;
570     enum IPV6CTL_TEMPVLTIME      = 34;
571     enum IPV6CTL_AUTO_LINKLOCAL  = 35;
572     enum IPV6CTL_RIP6STATS       = 36;
573     enum IPV6CTL_PREFER_TEMPADDR = 37;
574     enum IPV6CTL_ADDRCTLPOLICY   = 38;
575     enum IPV6CTL_USE_DEFAULTZONE = 39;
576 
577     enum IPV6CTL_MAXFRAGS   = 41;
578     enum IPV6CTL_MCAST_PMTU = 44;
579 
580     enum IPV6CTL_NEIGHBORGCTHRESH      = 46;
581     enum IPV6CTL_MAXIFPREFIXES         = 47;
582     enum IPV6CTL_MAXIFDEFROUTERS       = 48;
583     enum IPV6CTL_MAXDYNROUTES          = 49;
584     enum ICMPV6CTL_ND6_ONLINKNSRFC4861 = 50;
585 
586     enum IPV6CTL_MAXID = 51;
587 
588     size_t inet6_rthdr_space(int, int) @trusted;
589     cmsghdr* inet6_rthdr_init(void*, int);
590     int inet6_rthdr_add(cmsghdr*, const in6_addr*, uint);
591     int inet6_rthdr_lasthop(cmsghdr*, uint);
592     int inet6_rthdr_segments(const cmsghdr*);
593     in6_addr* inet6_rthdr_getaddr(cmsghdr*, int);
594     int inet6_rthdr_getflags(const cmsghdr*, int);
595 
596     int inet6_opt_init(void*, socklen_t);
597     int inet6_opt_append(void*, socklen_t, int, ubyte, socklen_t, ubyte, void**);
598     int inet6_opt_finish(void*, socklen_t, int);
599     int inet6_opt_set_val(void*, int, void*, socklen_t);
600 
601     int inet6_opt_next(void*, socklen_t, int, ubyte*, socklen_t*, void**);
602     int inet6_opt_find(void*, socklen_t, int, ubyte, socklen_t*, void**);
603     int inet6_opt_get_val(void*, int, void*, socklen_t);
604     socklen_t inet6_rth_space(int, int) @trusted;
605     void* inet6_rth_init(void*, socklen_t, int, int);
606     int inet6_rth_add(void*, const in6_addr*);
607     int inet6_rth_reverse(const void*, void*);
608     int inet6_rth_segments(const void*);
609     in6_addr* inet6_rth_getaddr(const void*, int);
610     void addrsel_policy_init();
611 }
612