]> git.proxmox.com Git - rustc.git/blob - src/vendor/winapi/src/shared/mstcpip.rs
New upstream version 1.24.1+dfsg1
[rustc.git] / src / vendor / winapi / src / shared / mstcpip.rs
1 // Copyright © 2015-2017 winapi-rs developers
2 // Licensed under the Apache License, Version 2.0
3 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
4 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
5 // All files in the project carrying such notice may not be copied, modified, or distributed
6 // except according to those terms
7 //! This module contains Microsoft-specific extensions to the core Winsock definitions.
8 use ctypes::wchar_t;
9 use shared::basetsd::{UINT32, UINT64, ULONG64};
10 use shared::guiddef::GUID;
11 use shared::in6addr::IN6_ADDR;
12 use shared::inaddr::IN_ADDR;
13 use shared::minwindef::{DWORD, PULONG, PUSHORT, UCHAR, ULONG, USHORT};
14 use shared::ws2def::{
15 INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, IOC_IN, IOC_INOUT, IOC_OUT, IOC_VENDOR, SOCKADDR_IN,
16 SOCKADDR_STORAGE,
17 };
18 use um::winnt::{BOOLEAN, LONG, LPCWSTR, PCSTR, PCWSTR, PSTR, PWSTR};
19 DEFINE_GUID!{SOCKET_DEFAULT2_QM_POLICY,
20 0xaec2ef9c, 0x3a4d, 0x4d3e, 0x88, 0x42, 0x23, 0x99, 0x42, 0xe3, 0x9a, 0x47}
21 DEFINE_GUID!{REAL_TIME_NOTIFICATION_CAPABILITY,
22 0x6b59819a, 0x5cae, 0x492d, 0xa9, 0x01, 0x2a, 0x3c, 0x2c, 0x50, 0x16, 0x4f}
23 DEFINE_GUID!{REAL_TIME_NOTIFICATION_CAPABILITY_EX,
24 0x6843da03, 0x154a, 0x4616, 0xa5, 0x08, 0x44, 0x37, 0x12, 0x95, 0xf9, 0x6b}
25 DEFINE_GUID!{ASSOCIATE_NAMERES_CONTEXT,
26 0x59a38b67, 0xd4fe, 0x46e1, 0xba, 0x3c, 0x87, 0xea, 0x74, 0xca, 0x30, 0x49}
27 ENUM!{enum TCPSTATE {
28 TCPSTATE_CLOSED,
29 TCPSTATE_LISTEN,
30 TCPSTATE_SYN_SENT,
31 TCPSTATE_SYN_RCVD,
32 TCPSTATE_ESTABLISHED,
33 TCPSTATE_FIN_WAIT_1,
34 TCPSTATE_FIN_WAIT_2,
35 TCPSTATE_CLOSE_WAIT,
36 TCPSTATE_CLOSING,
37 TCPSTATE_LAST_ACK,
38 TCPSTATE_TIME_WAIT,
39 TCPSTATE_MAX,
40 }}
41 STRUCT!{struct TRANSPORT_SETTING_ID {
42 Guid: GUID,
43 }}
44 pub type PTRANSPORT_SETTING_ID = *mut TRANSPORT_SETTING_ID;
45 STRUCT!{struct tcp_keepalive {
46 onoff: ULONG,
47 keepalivetime: ULONG,
48 keepaliveinterval: ULONG,
49 }}
50 ENUM!{enum CONTROL_CHANNEL_TRIGGER_STATUS {
51 CONTROL_CHANNEL_TRIGGER_STATUS_INVALID = 0,
52 CONTROL_CHANNEL_TRIGGER_STATUS_SOFTWARE_SLOT_ALLOCATED = 1,
53 CONTROL_CHANNEL_TRIGGER_STATUS_HARDWARE_SLOT_ALLOCATED = 2,
54 CONTROL_CHANNEL_TRIGGER_STATUS_POLICY_ERROR = 3,
55 CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR = 4,
56 CONTROL_CHANNEL_TRIGGER_STATUS_TRANSPORT_DISCONNECTED = 5,
57 CONTROL_CHANNEL_TRIGGER_STATUS_SERVICE_UNAVAILABLE = 6,
58 }}
59 pub type PCONTROL_CHANNEL_TRIGGER_STATUS = *mut CONTROL_CHANNEL_TRIGGER_STATUS;
60 pub const CONTROL_CHANNEL_TRIGGER_STATUS_MAX: u32 = CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR;
61 STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_INPUT {
62 TransportSettingId: TRANSPORT_SETTING_ID,
63 BrokerEventGuid: GUID,
64 }}
65 pub type PREAL_TIME_NOTIFICATION_SETTING_INPUT = *mut REAL_TIME_NOTIFICATION_SETTING_INPUT;
66 STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_INPUT_EX {
67 TransportSettingId: TRANSPORT_SETTING_ID,
68 BrokerEventGuid: GUID,
69 Unmark: BOOLEAN,
70 }}
71 pub type PREAL_TIME_NOTIFICATION_SETTING_INPUT_EX = *mut REAL_TIME_NOTIFICATION_SETTING_INPUT_EX;
72 STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_OUTPUT {
73 ChannelStatus: CONTROL_CHANNEL_TRIGGER_STATUS,
74 }}
75 pub type PREAL_TIME_NOTIFICATION_SETTING_OUTPUT = *mut REAL_TIME_NOTIFICATION_SETTING_OUTPUT;
76 STRUCT!{struct ASSOCIATE_NAMERES_CONTEXT_INPUT {
77 TransportSettingId: TRANSPORT_SETTING_ID,
78 Handle: UINT64,
79 }}
80 pub type PASSOCIATE_NAMERES_CONTEXT_INPUT = *mut ASSOCIATE_NAMERES_CONTEXT_INPUT;
81 macro_rules! _WSAIOR { ($x:expr, $y:expr) => { IOC_OUT | $x | $y } }
82 macro_rules! _WSAIOW { ($x:expr, $y:expr) => { IOC_IN | $x | $y } }
83 macro_rules! _WSAIORW { ($x:expr, $y:expr) => { IOC_INOUT | $x | $y } }
84 pub const SIO_RCVALL: DWORD = _WSAIOW!(IOC_VENDOR,1);
85 pub const SIO_RCVALL_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,2);
86 pub const SIO_RCVALL_IGMPMCAST: DWORD = _WSAIOW!(IOC_VENDOR,3);
87 pub const SIO_KEEPALIVE_VALS: DWORD = _WSAIOW!(IOC_VENDOR,4);
88 pub const SIO_ABSORB_RTRALERT: DWORD = _WSAIOW!(IOC_VENDOR,5);
89 pub const SIO_UCAST_IF: DWORD = _WSAIOW!(IOC_VENDOR,6);
90 pub const SIO_LIMIT_BROADCASTS: DWORD = _WSAIOW!(IOC_VENDOR,7);
91 pub const SIO_INDEX_BIND: DWORD = _WSAIOW!(IOC_VENDOR,8);
92 pub const SIO_INDEX_MCASTIF: DWORD = _WSAIOW!(IOC_VENDOR,9);
93 pub const SIO_INDEX_ADD_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,10);
94 pub const SIO_INDEX_DEL_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,11);
95 pub const SIO_RCVALL_MCAST_IF: DWORD = _WSAIOW!(IOC_VENDOR,13);
96 pub const SIO_RCVALL_IF: DWORD = _WSAIOW!(IOC_VENDOR,14);
97 pub const SIO_LOOPBACK_FAST_PATH: DWORD = _WSAIOW!(IOC_VENDOR,16);
98 pub const SIO_TCP_INITIAL_RTO: DWORD = _WSAIOW!(IOC_VENDOR,17);
99 pub const SIO_APPLY_TRANSPORT_SETTING: DWORD = _WSAIOW!(IOC_VENDOR,19);
100 pub const SIO_QUERY_TRANSPORT_SETTING: DWORD = _WSAIOW!(IOC_VENDOR,20);
101 pub const SIO_TCP_SET_ICW: DWORD = _WSAIOW!(IOC_VENDOR,22);
102 pub const SIO_TCP_SET_ACK_FREQUENCY: DWORD = _WSAIOW!(IOC_VENDOR,23);
103 pub const SIO_TCP_INFO: DWORD = _WSAIORW!(IOC_VENDOR,39);
104 ENUM!{enum RCVALL_VALUE {
105 RCVALL_OFF = 0,
106 RCVALL_ON = 1,
107 RCVALL_SOCKETLEVELONLY = 2,
108 RCVALL_IPLEVEL = 3,
109 }}
110 pub type PRCVALL_VALUE = *mut RCVALL_VALUE;
111 STRUCT!{struct RCVALL_IF {
112 Mode: RCVALL_VALUE,
113 Interface: ULONG,
114 }}
115 pub type PRCVALL_IF = *mut RCVALL_IF;
116 pub const TCP_INITIAL_RTO_UNSPECIFIED_RTT: USHORT = -1i16 as u16;
117 pub const TCP_INITIAL_RTO_UNSPECIFIED_MAX_SYN_RETRANSMISSIONS: UCHAR = -1i8 as u8;
118 pub const TCP_INITIAL_RTO_DEFAULT_RTT: USHORT = 0;
119 pub const TCP_INITIAL_RTO_DEFAULT_MAX_SYN_RETRANSMISSIONS: UCHAR = 0;
120 STRUCT!{struct TCP_INITIAL_RTO_PARAMETERS {
121 Rtt: USHORT,
122 MaxSynRetransmissions: UCHAR,
123 }}
124 pub type PTCP_INITIAL_RTO_PARAMETERS = *mut TCP_INITIAL_RTO_PARAMETERS;
125 ENUM!{enum TCP_ICW_LEVEL {
126 TCP_ICW_LEVEL_DEFAULT = 0,
127 TCP_ICW_LEVEL_HIGH = 1,
128 TCP_ICW_LEVEL_VERY_HIGH = 2,
129 TCP_ICW_LEVEL_AGGRESSIVE = 3,
130 TCP_ICW_LEVEL_EXPERIMENTAL = 4,
131 TCP_ICW_LEVEL_COMPAT = 254,
132 TCP_ICW_LEVEL_MAX = 255,
133 }}
134 pub type PTCP_ICW_LEVEL = *mut TCP_ICW_LEVEL;
135 STRUCT!{struct TCP_ICW_PARAMETERS {
136 Level: TCP_ICW_LEVEL,
137 }}
138 pub type PTCP_ICW_PARAMETERS = *mut TCP_ICW_PARAMETERS;
139 STRUCT!{struct TCP_ACK_FREQUENCY_PARAMETERS {
140 TcpDelayedAckFrequency: UCHAR,
141 }}
142 pub type PTCP_ACK_FREQUENCY_PARAMETERS = *mut TCP_ACK_FREQUENCY_PARAMETERS;
143 STRUCT!{struct TCP_INFO_v0 {
144 State: TCPSTATE,
145 Mss: ULONG,
146 ConnectionTimeMs: ULONG64,
147 TimestampsEnabled: BOOLEAN,
148 RttUs: ULONG,
149 MinRttUs: ULONG,
150 BytesInFlight: ULONG,
151 Cwnd: ULONG,
152 SndWnd: ULONG,
153 RcvWnd: ULONG,
154 RcvBuf: ULONG,
155 BytesOut: ULONG64,
156 BytesIn: ULONG64,
157 BytesReordered: ULONG,
158 BytesRetrans: ULONG,
159 FastRetrans: ULONG,
160 DupAcksIn: ULONG,
161 TimeoutEpisodes: ULONG,
162 SynRetrans: UCHAR,
163 }}
164 pub type PTCP_INFO_v0 = *mut TCP_INFO_v0;
165 pub const SIO_ACQUIRE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 100);
166 pub const SIO_RELEASE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 101);
167 pub const SIO_ASSOCIATE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 102);
168 STRUCT!{struct INET_PORT_RANGE {
169 StartPort: USHORT,
170 NumberOfPorts: USHORT,
171 }}
172 pub type PINET_PORT_RANGE = *mut INET_PORT_RANGE;
173 pub type INET_PORT_RESERVATION = INET_PORT_RANGE;
174 pub type PINET_PORT_RESERVATION = *mut INET_PORT_RANGE;
175 STRUCT!{struct INET_PORT_RESERVATION_TOKEN {
176 Token: ULONG64,
177 }}
178 pub type PINET_PORT_RESERVATION_TOKEN = *mut INET_PORT_RESERVATION_TOKEN;
179 STRUCT!{struct INET_PORT_RESERVATION_INSTANCE {
180 Reservation: INET_PORT_RESERVATION,
181 Token: INET_PORT_RESERVATION_TOKEN,
182 }}
183 pub type PINET_PORT_RESERVATION_INSTANCE = *mut INET_PORT_RESERVATION_INSTANCE;
184 STRUCT!{struct INET_PORT_RESERVATION_INFORMATION {
185 OwningPid: ULONG,
186 }}
187 pub type PINET_PORT_RESERVATION_INFORMATION = *mut INET_PORT_RESERVATION_INFORMATION;
188 pub const SIO_SET_SECURITY: DWORD = _WSAIOW!(IOC_VENDOR, 200);
189 pub const SIO_QUERY_SECURITY: DWORD = _WSAIORW!(IOC_VENDOR, 201);
190 pub const SIO_SET_PEER_TARGET_NAME: DWORD = _WSAIOW!(IOC_VENDOR, 202);
191 pub const SIO_DELETE_PEER_TARGET_NAME: DWORD = _WSAIOW!(IOC_VENDOR, 203);
192 pub const SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS: DWORD = _WSAIOW!(IOC_VENDOR, 220);
193 pub const SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT: DWORD = _WSAIOW!(IOC_VENDOR, 221);
194 pub const SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS: DWORD = _WSAIOW!(IOC_VENDOR, 222);
195 pub const SIO_SOCKET_USAGE_NOTIFICATION: DWORD = _WSAIOW!(IOC_VENDOR, 204);
196 ENUM!{enum SOCKET_USAGE_TYPE {
197 SYSTEM_CRITICAL_SOCKET = 1,
198 }}
199 ENUM!{enum SOCKET_SECURITY_PROTOCOL {
200 SOCKET_SECURITY_PROTOCOL_DEFAULT,
201 SOCKET_SECURITY_PROTOCOL_IPSEC,
202 SOCKET_SECURITY_PROTOCOL_IPSEC2,
203 SOCKET_SECURITY_PROTOCOL_INVALID,
204 }}
205 STRUCT!{struct SOCKET_SECURITY_SETTINGS {
206 SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
207 SecurityFlags: ULONG,
208 }}
209 pub const SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION: ULONG = 0x1;
210 pub const SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION: ULONG = 0x2;
211 pub const SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED: ULONG = 0x4;
212 pub const SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT: ULONG = 0x8;
213 STRUCT!{struct SOCKET_SECURITY_SETTINGS_IPSEC {
214 SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
215 SecurityFlags: ULONG,
216 IpsecFlags: ULONG,
217 AuthipMMPolicyKey: GUID,
218 AuthipQMPolicyKey: GUID,
219 Reserved: GUID,
220 Reserved2: UINT64,
221 UserNameStringLen: ULONG,
222 DomainNameStringLen: ULONG,
223 PasswordStringLen: ULONG,
224 AllStrings: [wchar_t; 0],
225 }}
226 STRUCT!{struct SOCKET_PEER_TARGET_NAME {
227 SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
228 PeerAddress: SOCKADDR_STORAGE,
229 PeerTargetNameStringLen: ULONG,
230 AllStrings: [wchar_t; 0],
231 }}
232 STRUCT!{struct SOCKET_SECURITY_QUERY_TEMPLATE {
233 SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
234 PeerAddress: SOCKADDR_STORAGE,
235 PeerTokenAccessMask: ULONG,
236 }}
237 pub const SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE: ULONG = 0x1;
238 pub const SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID: ULONG = 0x1;
239 pub const SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID: ULONG = 0x2;
240 STRUCT!{struct SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2 {
241 SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
242 PeerAddress: SOCKADDR_STORAGE,
243 PeerTokenAccessMask: ULONG,
244 Flags: ULONG,
245 FieldMask: ULONG,
246 }}
247 pub const SOCKET_INFO_CONNECTION_SECURED: ULONG = 0x1;
248 pub const SOCKET_INFO_CONNECTION_ENCRYPTED: ULONG = 0x2;
249 pub const SOCKET_INFO_CONNECTION_IMPERSONATED: ULONG = 0x4;
250 STRUCT!{struct SOCKET_SECURITY_QUERY_INFO {
251 SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
252 Flags: ULONG,
253 PeerApplicationAccessTokenHandle: UINT64,
254 PeerMachineAccessTokenHandle: UINT64,
255 }}
256 STRUCT!{struct SOCKET_SECURITY_QUERY_INFO_IPSEC2 {
257 SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
258 Flags: ULONG,
259 PeerApplicationAccessTokenHandle: UINT64,
260 PeerMachineAccessTokenHandle: UINT64,
261 MmSaId: UINT64,
262 QmSaId: UINT64,
263 NegotiationWinerr: UINT32,
264 SaLookupContext: GUID,
265 }}
266 pub const SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE: DWORD = _WSAIOR!(IOC_VENDOR, 205);
267 pub const SIO_QUERY_RSS_SCALABILITY_INFO: DWORD = _WSAIOR!(IOC_VENDOR, 210);
268 STRUCT!{struct RSS_SCALABILITY_INFO {
269 RssEnabled: BOOLEAN,
270 }}
271 pub type PRSS_SCALABILITY_INFO = *mut RSS_SCALABILITY_INFO;
272 #[inline]
273 pub fn IN4_CLASSA(i: LONG) -> bool {
274 (i & 0x80) == 0
275 }
276 #[inline]
277 pub fn IN4_CLASSB(i: LONG) -> bool {
278 (i & 0xc0) == 0x80
279 }
280 #[inline]
281 pub fn IN4_CLASSC(i: LONG) -> bool {
282 (i & 0xe0) == 0xc0
283 }
284 #[inline]
285 pub fn IN4_CLASSD(i: LONG) -> bool {
286 (i & 0xf0) == 0xe0
287 }
288 #[inline]
289 pub fn IN4_MULTICAST(i: LONG) -> bool {
290 IN4_CLASSD(i)
291 }
292 pub const IN4ADDR_ANY: ULONG = INADDR_ANY;
293 pub const IN4ADDR_LOOPBACK: ULONG = 0x0100007f;
294 pub const IN4ADDR_BROADCAST: ULONG = INADDR_BROADCAST;
295 pub const IN4ADDR_NONE: ULONG = INADDR_NONE;
296 pub const IN4ADDR_LOOPBACKPREFIX_LENGTH: usize = 8;
297 pub const IN4ADDR_LINKLOCALPREFIX_LENGTH: usize = 16;
298 pub const IN4ADDR_MULTICASTPREFIX_LENGTH: usize = 4;
299 #[inline]
300 pub fn IN4_ADDR_EQUAL(a: &IN_ADDR, b: &IN_ADDR) -> bool {
301 unsafe { *a.S_un.S_addr() == *b.S_un.S_addr() }
302 }
303 #[inline]
304 pub fn IN4_UNALIGNED_ADDR_EQUAL(a: &IN_ADDR, b: &IN_ADDR) -> bool {
305 unsafe { *a.S_un.S_addr() == *b.S_un.S_addr() }
306 }
307 #[inline]
308 pub fn IN4_IS_ADDR_UNSPECIFIED(a: &IN_ADDR) -> bool {
309 unsafe { *a.S_un.S_addr() == IN4ADDR_ANY }
310 }
311 #[inline]
312 pub fn IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(a: &IN_ADDR) -> bool {
313 unsafe { *a.S_un.S_addr() == IN4ADDR_ANY }
314 }
315 #[inline]
316 pub fn IN4_IS_ADDR_LOOPBACK(a: &IN_ADDR) -> bool {
317 unsafe { a.S_un.S_un_b().s_b1 == 0x7f }
318 }
319 #[inline]
320 pub fn IN4_IS_UNALIGNED_ADDR_LOOPBACK(a: &IN_ADDR) -> bool {
321 unsafe { a.S_un.S_un_b().s_b1 == 0x7f }
322 }
323 #[inline]
324 pub fn IN4_IS_ADDR_BROADCAST(a: &IN_ADDR) -> bool {
325 unsafe { *a.S_un.S_addr() == IN4ADDR_BROADCAST }
326 }
327 #[inline]
328 pub fn IN4_IS_UNALIGNED_ADDR_BROADCAST(a: &IN_ADDR) -> bool {
329 unsafe { *a.S_un.S_addr() == IN4ADDR_BROADCAST }
330 }
331 #[inline]
332 pub fn IN4_IS_ADDR_MULTICAST(a: &IN_ADDR) -> bool {
333 IN4_MULTICAST(unsafe { *a.S_un.S_addr() as LONG })
334 }
335 #[inline]
336 pub fn IN4_IS_UNALIGNED_ADDR_MULTICAST(a: &IN_ADDR) -> bool {
337 IN4_MULTICAST(unsafe { *a.S_un.S_addr() as LONG })
338 }
339 #[inline]
340 pub fn IN4_IS_ADDR_LINKLOCAL(a: &IN_ADDR) -> bool {
341 unsafe { (*a.S_un.S_addr() & 0xffff) == 0xfea9 }
342 }
343 #[inline]
344 pub fn IN4_IS_UNALIGNED_ADDR_LINKLOCAL(a: &IN_ADDR) -> bool {
345 unsafe { (*a.S_un.S_addr() & 0xffff) == 0xfea9 }
346 }
347 #[inline]
348 pub fn IN4_IS_ADDR_SITELOCAL(_: &IN_ADDR) -> bool {
349 false
350 }
351 #[inline]
352 pub fn IN4_IS_UNALIGNED_ADDR_SITELOCAL(_: &IN_ADDR) -> bool {
353 false
354 }
355 #[inline]
356 pub fn IN4_IS_ADDR_RFC1918(a: &IN_ADDR) -> bool {
357 let s_addr = unsafe { *a.S_un.S_addr() };
358 ((s_addr & 0x00ff) == 0x0a) || ((s_addr & 0xf0ff) == 0x10ac) || ((s_addr & 0xffff) == 0xa8c0)
359 }
360 #[inline]
361 pub fn IN4_IS_UNALIGNED_ADDR_RFC1918(a: &IN_ADDR) -> bool {
362 IN4_IS_ADDR_RFC1918(a)
363 }
364 #[inline]
365 pub fn IN4_IS_ADDR_MC_LINKLOCAL(a: &IN_ADDR) -> bool {
366 unsafe { (*a.S_un.S_addr() & 0xffffff) == 0xe0 }
367 }
368 #[inline]
369 pub fn IN4_IS_ADDR_MC_ADMINLOCAL(a: &IN_ADDR) -> bool {
370 unsafe { (*a.S_un.S_addr() & 0xffff) == 0xffef }
371 }
372 #[inline]
373 pub fn IN4_IS_ADDR_MC_SITELOCAL(a: &IN_ADDR) -> bool {
374 let first = unsafe { (*a.S_un.S_addr() & 0xff) == 0xef };
375 first && !IN4_IS_ADDR_MC_ADMINLOCAL(a)
376 }
377 #[inline]
378 pub fn IN4ADDR_ISANY(a: &SOCKADDR_IN) -> bool {
379 IN4_IS_ADDR_UNSPECIFIED(&a.sin_addr)
380 }
381 #[inline]
382 pub fn IN4ADDR_ISLOOPBACK(a: &SOCKADDR_IN) -> bool {
383 IN4_IS_ADDR_LOOPBACK(&a.sin_addr)
384 }
385 extern "system" {
386 pub fn RtlIpv4AddressToStringA(
387 Addr: *const IN_ADDR,
388 S: PSTR,
389 ) -> PSTR;
390 pub fn RtlIpv4AddressToStringExA(
391 Address: *const IN_ADDR,
392 Port: USHORT,
393 AddressString: PSTR,
394 AddressStringLength: PULONG,
395 ) -> LONG;
396 pub fn RtlIpv4AddressToStringW(
397 Addr: *const IN_ADDR,
398 S: PWSTR,
399 ) -> PWSTR;
400 pub fn RtlIpv4AddressToStringExW(
401 Address: *const IN_ADDR,
402 Port: USHORT,
403 AddressString: PWSTR,
404 AddressStringLength: PULONG,
405 ) -> LONG;
406 pub fn RtlIpv4StringToAddressA(
407 S: PCSTR,
408 Strict: BOOLEAN,
409 Terminator: *mut PCSTR,
410 Addr: *mut IN_ADDR,
411 ) -> LONG;
412 pub fn RtlIpv4StringToAddressExA(
413 AddressString: PCSTR,
414 Strict: BOOLEAN,
415 Address: *mut IN_ADDR,
416 Port: PUSHORT,
417 ) -> LONG;
418 pub fn RtlIpv4StringToAddressW(
419 S: PCWSTR,
420 Strict: BOOLEAN,
421 Terminator: *mut LPCWSTR,
422 Addr: *mut IN_ADDR,
423 ) -> LONG;
424 pub fn RtlIpv4StringToAddressExW(
425 AddressString: PCWSTR,
426 Strict: BOOLEAN,
427 Address: *mut IN_ADDR,
428 Port: PUSHORT,
429 ) -> LONG;
430 pub fn RtlIpv6AddressToStringA(
431 Addr: *const IN6_ADDR,
432 S: PSTR,
433 ) -> PSTR;
434 pub fn RtlIpv6AddressToStringExA(
435 Address: *const IN6_ADDR,
436 ScopeId: ULONG,
437 Port: USHORT,
438 AddressString: PSTR,
439 AddressStringLength: PULONG,
440 ) -> LONG;
441 pub fn RtlIpv6AddressToStringW(
442 Addr: *const IN6_ADDR,
443 S: PWSTR,
444 ) -> PWSTR;
445 pub fn RtlIpv6AddressToStringExW(
446 Address: *const IN6_ADDR,
447 ScopeId: ULONG,
448 Port: USHORT,
449 AddressString: PWSTR,
450 AddressStringLength: PULONG,
451 ) -> LONG;
452 pub fn RtlIpv6StringToAddressA(
453 S: PCSTR,
454 Terminator: *mut PCSTR,
455 Addr: *mut IN6_ADDR,
456 ) -> LONG;
457 pub fn RtlIpv6StringToAddressExA(
458 AddressString: PCSTR,
459 Address: *mut IN6_ADDR,
460 ScopeId: PULONG,
461 Port: PUSHORT,
462 ) -> LONG;
463 pub fn RtlIpv6StringToAddressW(
464 S: PCWSTR,
465 Terminator: *mut PCWSTR,
466 Addr: *mut IN6_ADDR,
467 ) -> LONG;
468 pub fn RtlIpv6StringToAddressExW(
469 AddressString: PCWSTR,
470 Address: *mut IN6_ADDR,
471 ScopeId: PULONG,
472 Port: PUSHORT,
473 ) -> LONG;
474 }
475 DECLARE_HANDLE!(DL_EUI48, _DL_EUI48);
476 pub type PDL_EUI48 = *mut DL_EUI48;
477 extern "system" {
478 pub fn RtlEthernetAddressToStringA(
479 Addr: *const DL_EUI48,
480 S: PSTR,
481 ) -> PSTR;
482 pub fn RtlEthernetAddressToStringW(
483 Addr: *const DL_EUI48,
484 S: PWSTR,
485 ) -> PWSTR;
486 pub fn RtlEthernetStringToAddressA(
487 S: PCSTR,
488 Terminator: *mut PCSTR,
489 Addr: *mut DL_EUI48,
490 ) -> LONG;
491 pub fn RtlEthernetStringToAddressW(
492 S: PCWSTR,
493 Terminator: *mut LPCWSTR,
494 Addr: *mut DL_EUI48,
495 ) -> LONG;
496 }