1 //Written in the D programming language
2
3 /++
4 D header file for Linux'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.linux.netinet.in_;
11
12 import core.sys.posix.config;
13
14 public import core.sys.posix.netinet.in_;
15
16 version (CRuntime_Glibc) version = linux_libc;
17 else version (CRuntime_Musl) version = linux_libc;
18 else version (CRuntime_Bionic) version = linux_libc;
19 else version (CRuntime_UClibc) version = linux_libc;
20
21 version (CRuntime_Glibc) version = gnu_libc;
22 else version (CRuntime_UClibc) version = gnu_libc;
23
version(linux_libc)24 version (linux_libc)
25 {
26 extern(C) nothrow @nogc:
27
28 enum IPPROTO_IPIP = 4;
29 enum IPPROTO_EGP = 8;
30 enum IPPROTO_TP = 29;
31 enum IPPROTO_DCCP = 33;
32 enum IPPROTO_RSVP = 46;
33 enum IPPROTO_GRE = 47;
34 enum IPPROTO_ESP = 50;
35 enum IPPROTO_AH = 51;
36 enum IPPROTO_MTP = 92;
37 enum IPPROTO_BEETPH = 94;
38 enum IPPROTO_ENCAP = 98;
39 enum IPPROTO_PIM = 103;
40 enum IPPROTO_COMP = 108;
41 enum IPPROTO_SCTP = 132;
42 enum IPPROTO_UDPLITE = 136;
43 enum IPPROTO_MPLS = 137;
44
45 enum IPPROTO_HOPOPTS = 0;
46 enum IPPROTO_ROUTING = 43;
47 enum IPPROTO_FRAGMENT = 44;
48 enum IPPROTO_ICMPV6 = 58;
49 enum IPPROTO_NONE = 59;
50 enum IPPROTO_DSTOPTS = 60;
51 enum IPPROTO_MH = 135;
52
53 enum IPPORT_ECHO = 7;
54 enum IPPORT_DISCARD = 9;
55 enum IPPORT_SYSTAT = 11;
56 enum IPPORT_DAYTIME = 13;
57 enum IPPORT_NETSTAT = 15;
58 enum IPPORT_FTP = 21;
59 enum IPPORT_TELNET = 23;
60 enum IPPORT_SMTP = 25;
61 enum IPPORT_TIMESERVER = 37;
62 enum IPPORT_NAMESERVER = 42;
63 enum IPPORT_WHOIS = 43;
64 enum IPPORT_MTP = 57;
65
66 enum IPPORT_TFTP = 69;
67 enum IPPORT_RJE = 77;
68 enum IPPORT_FINGER = 79;
69 enum IPPORT_TTYLINK = 87;
70 enum IPPORT_SUPDUP = 95;
71
72 enum IPPORT_EXECSERVER = 512;
73 enum IPPORT_LOGINSERVER = 513;
74 enum IPPORT_CMDSERVER = 514;
75 enum IPPORT_EFSSERVER = 520;
76
77 enum IPPORT_BIFFUDP = 512;
78 enum IPPORT_WHOSERVER = 513;
79 enum IPPORT_ROUTESERVER = 520;
80
81 enum IPPORT_RESERVED = 1024;
82
83 enum IPPORT_USERRESERVED = 5000;
84
85 extern(D) bool IN_CLASSA(in_addr_t i) pure @safe { return (i & 0x80000000) == 0; }
86 enum IN_CLASSA_NET = 0xff000000;
87 enum IN_CLASSA_NSHIFT = 24;
88 enum IN_CLASSA_HOST = 0xffffffff & ~IN_CLASSA_NET;
89 enum IN_CLASSA_MAX = 128;
90
91 extern(D) bool IN_CLASSB(in_addr_t i) pure @safe { return (i & 0xc0000000) == 0x80000000; }
92 enum IN_CLASSB_NET = 0xffff0000;
93 enum IN_CLASSB_NSHIFT = 16;
94 enum IN_CLASSB_HOST = 0xffffffff & ~IN_CLASSB_NET;
95 enum IN_CLASSB_MAX = 65536;
96
97 extern(D) bool IN_CLASSC(in_addr_t i) pure @safe { return (i & 0xe0000000) == 0xc0000000; }
98 enum IN_CLASSC_NET = 0xffffff00;
99 enum IN_CLASSC_NSHIFT = 8;
100 enum IN_CLASSC_HOST = 0xffffffff & ~IN_CLASSC_NET;
101
102 extern(D) bool IN_CLASSD(in_addr_t i) pure @safe { return (i & 0xf0000000) == 0xe0000000; }
103 extern(D) bool IN_MULTICAST(in_addr_t i) { return IN_CLASSD(i); }
104
105 extern(D) bool IN_EXPERIMENTAL(in_addr_t i) pure @safe { return (i & 0xe0000000) == 0xe0000000; }
106 extern(D) bool IN_BADCLASS(in_addr_t i) pure @safe { return (i & 0xf0000000) == 0xf0000000; }
107
108 enum IN_LOOPBACKNET = 127;
109
110 enum INADDR_UNSPEC_GROUP = 0xe0000000;
111 enum INADDR_ALLHOSTS_GROUP = 0xe0000001;
112 enum INADDR_ALLRTRS_GROUP = 0xe0000002;
113 enum INADDR_MAX_LOCAL_GROUP = 0xe00000ff;
114
115 enum IN6ADDR_ANY_INIT = in6_addr.init;
116 enum IN6ADDR_LOOPBACK_INIT = in6_addr([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
117
118 version (gnu_libc) static if (__USE_MISC)
119 {
120 struct ip_mreq
121 {
122 in_addr imr_multiaddr;
123 in_addr imr_interface;
124 };
125
126 struct ip_mreq_source
127 {
128 in_addr imr_multiaddr;
129 in_addr imr_interface;
130 in_addr imr_sourceaddr;
131 };
132
133 struct group_req
134 {
135 uint gr_interface;
136 sockaddr_storage gr_group;
137 };
138
139 struct group_source_req
140 {
141 uint gsr_interface;
142 sockaddr_storage gsr_group;
143 sockaddr_storage gsr_source;
144 };
145
146 struct ip_msfilter
147 {
148 in_addr imsf_multiaddr;
149 in_addr imsf_interface;
150 uint imsf_fmode;
151 uint imsf_numsrc;
152 in_addr[1] imsf_slist;
153 };
154
155 extern(D) size_t IP_MSFILTER_SIZE(int numsrc)
156 {
157 return ip_msfilter.sizeof - in_addr.sizeof + numsrc * in_addr.sizeof;
158 }
159
160 struct group_filter
161 {
162 uint gf_interface;
163 sockaddr_storage gf_group;
164 uint gf_fmode;
165 uint gf_numsrc;
166 sockaddr_storage[1] gf_slist;
167 };
168
169 extern(D) size_t GROUP_FILTER_SIZE(int numsrc) pure @safe
170 {
171 return group_filter.sizeof - sockaddr_storage.sizeof + numsrc * sockaddr_storage.sizeof;
172 }
173 }
174
175 extern(D) bool IN6_ARE_ADDR_EQUAL(in6_addr* a, in6_addr* b) pure @safe { return *a == *b; }
176
177 version (gnu_libc) static if (__USE_MISC)
178 {
179 int bindresvport(int __sockfd, sockaddr_in* __sock_in);
180 int bindresvport6(int __sockfd, sockaddr_in6* _);
181 }
182
183 version (gnu_libc) static if (__USE_GNU)
184 {
185 struct in6_pktinfo
186 {
187 in6_addr ipi6_addr;
188 uint ipi6_ifindex;
189 };
190
191 struct ip6_mtuinfo
192 {
193 sockaddr_in6 ip6m_addr;
194 uint ip6m_mtu;
195 };
196
197 int inet6_opt_init(void* __extbuf, socklen_t __extlen);
198 int inet6_opt_append(void* __extbuf, socklen_t __extlen, int __offset,
199 ubyte __type, socklen_t __len, ubyte __align, void** __databufp);
200 int inet6_opt_finish(void* __extbuf, socklen_t __extlen, int __offset);
201 int inet6_opt_set_val(void* __databuf, int __offset, void* __val, socklen_t __vallen);
202 int inet6_opt_next(void* __extbuf, socklen_t __extlen, int __offset,
203 ubyte* __typep, socklen_t* __lenp, void** __databufp);
204 int inet6_opt_find(void* __extbuf, socklen_t __extlen, int __offset,
205 ubyte __type, socklen_t* __lenp, void** __databufp);
206 int inet6_opt_get_val(void* __databuf, int __offset, void* __val, socklen_t __vallen);
207
208 socklen_t inet6_rth_space(int __type, int __segments);
209 void* inet6_rth_init(void* __bp, socklen_t __bp_len, int __type, int __segments);
210 int inet6_rth_add(void* __bp, const in6_addr* __addr);
211 int inet6_rth_reverse(const void* __in, void* __out);
212 int inet6_rth_segments(const void* __bp);
213 in6_addr* inet6_rth_getaddr(const void* __bp, int __index);
214
215 int getipv4sourcefilter(int __s, in_addr __interface_addr, in_addr __group,
216 uint* __fmode, uint* __numsrc, in_addr* __slist);
217
218 int setipv4sourcefilter(int __s, in_addr __interface_addr, in_addr __group,
219 uint __fmode, uint __numsrc, const in_addr* __slist);
220
221
222 int getsourcefilter(int __s, uint __interface_addr, const sockaddr* __group,
223 socklen_t __grouplen, uint* __fmode, uint* __numsrc,
224 sockaddr_storage* __slist);
225
226 int setsourcefilter(int __s, uint __interface_addr, const sockaddr* __group,
227 socklen_t __grouplen, uint __fmode, uint __numsrc,
228 const sockaddr_storage* __slist);
229 }
230
231 // =============================================================================
232 // What follows is from bits/in.h, but since bits/in.h specifically says that it
233 // should only be #included by #including netinet/in.h, it makes more sense to
234 // put them in here so that the way they're imported corresponds with the
235 // correct way of #including them in C/C++.
236 // =============================================================================
237
238 enum IP_OPTIONS = 4;
239 enum IP_HDRINCL = 3;
240 enum IP_TOS = 1;
241 enum IP_TTL = 2;
242 enum IP_RECVOPTS = 6;
243
244 enum IP_RECVRETOPTS = IP_RETOPTS;
245 enum IP_RETOPTS = 7;
246 enum IP_MULTICAST_IF = 32;
247 enum IP_MULTICAST_TTL = 33;
248 enum IP_MULTICAST_LOOP = 34;
249 enum IP_ADD_MEMBERSHIP = 35;
250 enum IP_DROP_MEMBERSHIP = 36;
251 enum IP_UNBLOCK_SOURCE = 37;
252 enum IP_BLOCK_SOURCE = 38;
253 enum IP_ADD_SOURCE_MEMBERSHIP = 39;
254 enum IP_DROP_SOURCE_MEMBERSHIP = 40;
255 enum IP_MSFILTER = 41;
256
257 version (gnu_libc) static if (__USE_MISC)
258 {
259 enum MCAST_JOIN_GROUP = 42;
260 enum MCAST_BLOCK_SOURCE = 43;
261 enum MCAST_UNBLOCK_SOURCE = 44;
262 enum MCAST_LEAVE_GROUP = 45;
263 enum MCAST_JOIN_SOURCE_GROUP = 46;
264 enum MCAST_LEAVE_SOURCE_GROUP = 47;
265 enum MCAST_MSFILTER = 48;
266 enum IP_MULTICAST_ALL = 49;
267 enum IP_UNICAST_IF = 50;
268
269 enum MCAST_EXCLUDE = 0;
270 enum MCAST_INCLUDE = 1;
271 }
272
273 enum IP_ROUTER_ALERT = 5;
274 enum IP_PKTINFO = 8;
275 enum IP_PKTOPTIONS = 9;
276 enum IP_PMTUDISC = 10;
277 enum IP_MTU_DISCOVER = 10;
278 enum IP_RECVERR = 11;
279 enum IP_RECVTTL = 12;
280 enum IP_RECVTOS = 13;
281 enum IP_MTU = 14;
282 enum IP_FREEBIND = 15;
283 enum IP_IPSEC_POLICY = 16;
284 enum IP_XFRM_POLICY = 17;
285 enum IP_PASSSEC = 18;
286 enum IP_TRANSPARENT = 19;
287 enum IP_MULTICAST_ALL = 49;
288
289 enum IP_ORIGDSTADDR = 20;
290 enum IP_RECVORIGDSTADDR = IP_ORIGDSTADDR;
291
292 enum IP_MINTTL = 21;
293 enum IP_NODEFRAG = 22;
294 enum IP_CHECKSUM = 23;
295 enum IP_BIND_ADDRESS_NO_PORT = 24;
296
297 enum IP_PMTUDISC_DONT = 0;
298 enum IP_PMTUDISC_WANT = 1;
299 enum IP_PMTUDISC_DO = 2;
300 enum IP_PMTUDISC_PROBE = 3;
301 enum IP_PMTUDISC_INTERFACE = 4;
302 enum IP_PMTUDISC_OMIT = 5;
303
304 enum SOL_IP = 0;
305
306 enum IP_DEFAULT_MULTICAST_TTL = 1;
307 enum IP_DEFAULT_MULTICAST_LOOP = 1;
308 enum IP_MAX_MEMBERSHIPS = 20;
309
310 version (gnu_libc) static if (__USE_MISC)
311 {
312 struct ip_opts
313 {
314 in_addr ip_dst;
315 char[40] ip_opts = 0;
316 };
317
318 struct ip_mreqn
319 {
320 in_addr imr_multiaddr;
321 in_addr imr_address;
322 int imr_ifindex;
323 };
324
325 struct in_pktinfo
326 {
327 int ipi_ifindex;
328 in_addr ipi_spec_dst;
329 in_addr ipi_addr;
330 };
331 }
332
333 enum IPV6_ADDRFORM = 1;
334 enum IPV6_2292PKTINFO = 2;
335 enum IPV6_2292HOPOPTS = 3;
336 enum IPV6_2292DSTOPTS = 4;
337 enum IPV6_2292RTHDR = 5;
338 enum IPV6_2292PKTOPTIONS = 6;
339 enum IPV6_CHECKSUM = 7;
340 enum IPV6_2292HOPLIMIT = 8;
341
342 enum IPV6_NEXTHOP = 9;
343 enum IPV6_AUTHHDR = 10;
344 enum IPV6_UNICAST_HOPS = 16;
345 enum IPV6_MULTICAST_IF = 17;
346 enum IPV6_MULTICAST_HOPS = 18;
347 enum IPV6_MULTICAST_LOOP = 19;
348 enum IPV6_JOIN_GROUP = 20;
349 enum IPV6_LEAVE_GROUP = 21;
350 enum IPV6_ROUTER_ALERT = 22;
351 enum IPV6_MTU_DISCOVER = 23;
352 enum IPV6_MTU = 24;
353 enum IPV6_RECVERR = 25;
354 enum IPV6_V6ONLY = 26;
355 enum IPV6_JOIN_ANYCAST = 27;
356 enum IPV6_LEAVE_ANYCAST = 28;
357 enum IPV6_IPSEC_POLICY = 34;
358 enum IPV6_XFRM_POLICY = 35;
359 enum IPV6_HDRINCL = 36;
360
361 enum IPV6_RECVPKTINFO = 49;
362 enum IPV6_PKTINFO = 50;
363 enum IPV6_RECVHOPLIMIT = 51;
364 enum IPV6_HOPLIMIT = 52;
365 enum IPV6_RECVHOPOPTS = 53;
366 enum IPV6_HOPOPTS = 54;
367 enum IPV6_RTHDRDSTOPTS = 55;
368 enum IPV6_RECVRTHDR = 56;
369 enum IPV6_RTHDR = 57;
370 enum IPV6_RECVDSTOPTS = 58;
371 enum IPV6_DSTOPTS = 59;
372 enum IPV6_RECVPATHMTU = 60;
373 enum IPV6_PATHMTU = 61;
374 enum IPV6_DONTFRAG = 62;
375
376 enum IPV6_RECVTCLASS = 66;
377 enum IPV6_TCLASS = 67;
378
379 enum IPV6_PMTUDISC_DONT = 0;
380 enum IPV6_PMTUDISC_WANT = 1;
381 enum IPV6_PMTUDISC_DO = 2;
382 enum IPV6_PMTUDISC_PROBE = 3;
383 enum IPV6_PMTUDISC_INTERFACE = 4;
384 enum IPV6_PMTUDISC_OMIT = 5;
385
386 enum SOL_IPV6 = 41;
387 enum SOL_ICMPV6 = 58;
388
389 enum IPV6_RTHDR_LOOSE = 0;
390 enum IPV6_RTHDR_STRICT = 1;
391
392 enum IPV6_RTHDR_TYPE_0 = 0;
393 }
394