[MC] Add messages 4400-4440 to netmsg.dll.
[reactos.git] / sdk / include / psdk / mstcpip.h
1 #pragma once
2
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6
7 #ifndef ASSERT
8 #define MSTCPIP_ASSERT_UNDEFINED
9 #define ASSERT(exp) ((VOID) 0)
10 #endif
11
12 #ifdef _MSC_VER
13 #define MSTCPIP_INLINE __inline
14 #else
15 #define MSTCPIP_INLINE static inline
16 #endif
17
18 #include <nldef.h>
19
20 struct tcp_keepalive {
21 ULONG onoff;
22 ULONG keepalivetime;
23 ULONG keepaliveinterval;
24 };
25
26 #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
27 #define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2)
28 #define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3)
29 #define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)
30 #define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5)
31 #define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6)
32 #define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7)
33 #define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8)
34 #define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9)
35 #define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10)
36 #define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11)
37 #define SIO_RCVALL_MCAST_IF _WSAIOW(IOC_VENDOR,13)
38 #define SIO_RCVALL_IF _WSAIOW(IOC_VENDOR,14)
39
40 typedef enum {
41 RCVALL_OFF = 0,
42 RCVALL_ON = 1,
43 RCVALL_SOCKETLEVELONLY = 2,
44 RCVALL_IPLEVEL = 3,
45 } RCVALL_VALUE, *PRCVALL_VALUE;
46
47 #define RCVALL_MAX RCVALL_IPLEVEL
48
49 typedef struct {
50 RCVALL_VALUE Mode;
51 ULONG Interface;
52 } RCVALL_IF, *PRCVALL_IF;
53
54 #if (NTDDI_VERSION >= NTDDI_WIN7)
55 DEFINE_GUID(SOCKET_DEFAULT2_QM_POLICY, 0xaec2ef9c, 0x3a4d, 0x4d3e, 0x88, 0x42, 0x23, 0x99, 0x42, 0xe3, 0x9a, 0x47);
56 #endif
57
58 #define SIO_ACQUIRE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 100)
59 #define SIO_RELEASE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 101)
60 #define SIO_ASSOCIATE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 102)
61
62 typedef struct _INET_PORT_RANGE {
63 USHORT StartPort;
64 USHORT NumberOfPorts;
65 } INET_PORT_RANGE, *PINET_PORT_RANGE;
66 typedef struct _INET_PORT_RANGE INET_PORT_RESERVATION, *PINET_PORT_RESERVATION;
67
68 typedef struct {
69 ULONG64 Token;
70 } INET_PORT_RESERVATION_TOKEN, *PINET_PORT_RESERVATION_TOKEN;
71
72 #define INVALID_PORT_RESERVATION_TOKEN ((ULONG64)0)
73
74 typedef struct {
75 #ifdef __cplusplus
76 INET_PORT_RESERVATION Reservation;
77 INET_PORT_RESERVATION_TOKEN Token;
78 #else
79 INET_PORT_RESERVATION;
80 INET_PORT_RESERVATION_TOKEN;
81 #endif
82 } INET_PORT_RESERVATION_INSTANCE, *PINET_PORT_RESERVATION_INSTANCE;
83
84 typedef struct {
85 ULONG AssignmentCount;
86 ULONG OwningPid;
87 } INET_PORT_RESERVATION_INFORMATION, *PINET_PORT_RESERVATION_INFORMATION;
88
89 #ifdef _WS2DEF_
90
91 #if (NTDDI_VERSION >= NTDDI_VISTA)
92
93 #define _SECURE_SOCKET_TYPES_DEFINED_
94
95 #define SIO_SET_SECURITY _WSAIOW(IOC_VENDOR, 200)
96 #define SIO_QUERY_SECURITY _WSAIORW(IOC_VENDOR, 201)
97 #define SIO_SET_PEER_TARGET_NAME _WSAIOW(IOC_VENDOR, 202)
98 #define SIO_DELETE_PEER_TARGET_NAME _WSAIOW(IOC_VENDOR, 203)
99
100 #define SIO_SOCKET_USAGE_NOTIFICATION _WSAIOW(IOC_VENDOR, 204)
101
102 typedef enum _SOCKET_USAGE_TYPE {
103 SYSTEM_CRITICAL_SOCKET = 1
104 }SOCKET_USAGE_TYPE;
105
106 typedef enum _SOCKET_SECURITY_PROTOCOL {
107 SOCKET_SECURITY_PROTOCOL_DEFAULT,
108 SOCKET_SECURITY_PROTOCOL_IPSEC,
109 #if (NTDDI_VERSION >= NTDDI_WIN7)
110 SOCKET_SECURITY_PROTOCOL_IPSEC2,
111 #endif
112 SOCKET_SECURITY_PROTOCOL_INVALID
113 } SOCKET_SECURITY_PROTOCOL;
114
115 #define SOCKET_SETTINGS_GUARANTEE_ENCRYPTION 0x1
116 #define SOCKET_SETTINGS_ALLOW_INSECURE 0x2
117
118 typedef struct _SOCKET_SECURITY_SETTINGS {
119 SOCKET_SECURITY_PROTOCOL SecurityProtocol;
120 ULONG SecurityFlags;
121 } SOCKET_SECURITY_SETTINGS;
122
123 #define SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION 0x1
124
125 #if (NTDDI_VERSION >= NTDDI_WIN7)
126
127 #define SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION 0x2
128 #define SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED 0x4
129 #define SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT 0x8
130
131 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
132
133 typedef struct _SOCKET_SECURITY_SETTINGS_IPSEC {
134 SOCKET_SECURITY_PROTOCOL SecurityProtocol;
135 ULONG SecurityFlags;
136 ULONG IpsecFlags;
137 GUID AuthipMMPolicyKey;
138 GUID AuthipQMPolicyKey;
139 GUID Reserved;
140 UINT64 Reserved2;
141 ULONG UserNameStringLen;
142 ULONG DomainNameStringLen;
143 ULONG PasswordStringLen;
144 wchar_t AllStrings[0];
145 } SOCKET_SECURITY_SETTINGS_IPSEC;
146
147 typedef struct _SOCKET_PEER_TARGET_NAME {
148 SOCKET_SECURITY_PROTOCOL SecurityProtocol;
149 SOCKADDR_STORAGE PeerAddress;
150 ULONG PeerTargetNameStringLen;
151 wchar_t AllStrings[0];
152 } SOCKET_PEER_TARGET_NAME;
153
154 typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE {
155 SOCKET_SECURITY_PROTOCOL SecurityProtocol;
156 SOCKADDR_STORAGE PeerAddress;
157 ULONG PeerTokenAccessMask;
158 } SOCKET_SECURITY_QUERY_TEMPLATE;
159
160 #if (NTDDI_VERSION >= NTDDI_WIN7)
161
162 #define SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE 0x1
163
164 #define SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID 0x1
165 #define SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID 0x2
166
167 typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2 {
168 SOCKET_SECURITY_PROTOCOL SecurityProtocol;
169 SOCKADDR_STORAGE PeerAddress;
170 ULONG PeerTokenAccessMask;
171 ULONG Flags;
172 ULONG FieldMask;
173 } SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2;
174
175 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
176
177 #define SOCKET_INFO_CONNECTION_SECURED 0x1
178 #define SOCKET_INFO_CONNECTION_ENCRYPTED 0x2
179 #define SOCKET_INFO_CONNECTION_IMPERSONATED 0x4
180
181 typedef struct _SOCKET_SECURITY_QUERY_INFO {
182 SOCKET_SECURITY_PROTOCOL SecurityProtocol;
183 ULONG Flags;
184 UINT64 PeerApplicationAccessTokenHandle;
185 UINT64 PeerMachineAccessTokenHandle;
186 } SOCKET_SECURITY_QUERY_INFO;
187
188 #if (NTDDI_VERSION >= NTDDI_WIN7)
189 typedef struct _SOCKET_SECURITY_QUERY_INFO_IPSEC2 {
190 SOCKET_SECURITY_PROTOCOL SecurityProtocol;
191 ULONG Flags;
192 UINT64 PeerApplicationAccessTokenHandle;
193 UINT64 PeerMachineAccessTokenHandle;
194 UINT64 MmSaId;
195 UINT64 QmSaId;
196 UINT32 NegotiationWinerr;
197 GUID SaLookupContext;
198 } SOCKET_SECURITY_QUERY_INFO_IPSEC2;
199 #endif
200
201 #define SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE _WSAIOR(IOC_VENDOR, 205)
202 #define SIO_QUERY_RSS_SCALABILITY_INFO _WSAIOR(IOC_VENDOR, 210)
203
204 typedef struct _RSS_SCALABILITY_INFO {
205 BOOLEAN RssEnabled;
206 } RSS_SCALABILITY_INFO, *PRSS_SCALABILITY_INFO;
207
208 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
209
210 #define IN4_CLASSA(i) (((LONG)(i) & 0x00000080) == 0)
211 #define IN4_CLASSB(i) (((LONG)(i) & 0x000000c0) == 0x00000080)
212 #define IN4_CLASSC(i) (((LONG)(i) & 0x000000e0) == 0x000000c0)
213 #define IN4_CLASSD(i) (((LONG)(i) & 0x000000f0) == 0x000000e0)
214 #define IN4_MULTICAST(i) IN4_CLASSD(i)
215
216 #define IN4ADDR_ANY INADDR_ANY
217 #define IN4ADDR_LOOPBACK 0x0100007f
218 #define IN4ADDR_BROADCAST INADDR_BROADCAST
219 #define IN4ADDR_NONE INADDR_NONE
220 #define IN4ADDR_ANY_INIT { 0 }
221 #define IN4ADDR_LOOPBACK_INIT { 0x7f, 0, 0, 1 }
222 #define IN4ADDR_BROADCAST_INIT { 0xff, 0xff, 0xff, 0xff }
223 #define IN4ADDR_ALLNODESONLINK_INIT { 0xe0, 0, 0, 1 }
224 #define IN4ADDR_ALLROUTERSONLINK_INIT { 0xe0, 0, 0, 2 }
225 #define IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT { 0xe0, 0, 0, 0x16 }
226 #define IN4ADDR_ALLTEREDONODESONLINK_INIT { 0xe0, 0, 0, 0xfd }
227 #define IN4ADDR_LINKLOCALPREFIX_INIT { 0xa9, 0xfe, }
228 #define IN4ADDR_MULTICASTPREFIX_INIT { 0xe0, }
229
230 #define IN4ADDR_LOOPBACKPREFIX_LENGTH 8
231 #define IN4ADDR_LINKLOCALPREFIX_LENGTH 16
232 #define IN4ADDR_MULTICASTPREFIX_LENGTH 4
233
234 #if (NTDDI_VERSION >= NTDDI_WIN2KSP1)
235
236 MSTCPIP_INLINE
237 BOOLEAN
238 IN4_ADDR_EQUAL(
239 _In_ CONST IN_ADDR *a,
240 _In_ CONST IN_ADDR *b)
241 {
242 return (BOOLEAN)(a->s_addr == b->s_addr);
243 }
244
245 MSTCPIP_INLINE
246 BOOLEAN
247 IN4_UNALIGNED_ADDR_EQUAL(
248 _In_ CONST IN_ADDR UNALIGNED *a,
249 _In_ CONST IN_ADDR UNALIGNED *b)
250 {
251 return (BOOLEAN)(a->s_addr == b->s_addr);
252 }
253
254 MSTCPIP_INLINE
255 BOOLEAN
256 IN4_IS_ADDR_UNSPECIFIED(
257 _In_ CONST IN_ADDR *a)
258 {
259 return (BOOLEAN)(a->s_addr == IN4ADDR_ANY);
260 }
261
262 MSTCPIP_INLINE
263 BOOLEAN
264 IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(
265 _In_ CONST IN_ADDR UNALIGNED *a)
266 {
267 return (BOOLEAN)(a->s_addr == IN4ADDR_ANY);
268 }
269
270 MSTCPIP_INLINE
271 BOOLEAN
272 IN4_IS_ADDR_LOOPBACK(
273 _In_ CONST IN_ADDR *a)
274 {
275 return (BOOLEAN)(*((PUCHAR) a) == 0x7f);
276 }
277
278 MSTCPIP_INLINE
279 BOOLEAN
280 IN4_IS_UNALIGNED_ADDR_LOOPBACK(
281 _In_ CONST IN_ADDR UNALIGNED *a)
282 {
283 return (BOOLEAN)(*((PUCHAR) a) == 0x7f);
284 }
285
286 MSTCPIP_INLINE
287 BOOLEAN
288 IN4_IS_ADDR_BROADCAST(
289 _In_ CONST IN_ADDR *a)
290 {
291 return (BOOLEAN)(a->s_addr == IN4ADDR_BROADCAST);
292 }
293
294 MSTCPIP_INLINE
295 BOOLEAN
296 IN4_IS_UNALIGNED_ADDR_BROADCAST(
297 _In_ CONST IN_ADDR UNALIGNED *a)
298 {
299 return (BOOLEAN)(a->s_addr == IN4ADDR_BROADCAST);
300 }
301
302 MSTCPIP_INLINE
303 BOOLEAN
304 IN4_IS_ADDR_MULTICAST(
305 _In_ CONST IN_ADDR *a)
306 {
307 return (BOOLEAN)IN4_MULTICAST(a->s_addr);
308 }
309
310 MSTCPIP_INLINE
311 BOOLEAN
312 IN4_IS_UNALIGNED_ADDR_MULTICAST(
313 _In_ CONST IN_ADDR UNALIGNED *a)
314 {
315 return (BOOLEAN)IN4_MULTICAST(a->s_addr);
316 }
317
318 MSTCPIP_INLINE
319 BOOLEAN
320 IN4_IS_ADDR_LINKLOCAL(
321 _In_ CONST IN_ADDR *a)
322 {
323 return (BOOLEAN)((a->s_addr & 0xffff) == 0xfea9);
324 }
325
326 MSTCPIP_INLINE
327 BOOLEAN
328 IN4_IS_UNALIGNED_ADDR_LINKLOCAL(
329 _In_ CONST IN_ADDR UNALIGNED *a)
330 {
331 return (BOOLEAN)((a->s_addr & 0xffff) == 0xfea9); // 169.254/16
332 }
333
334 MSTCPIP_INLINE
335 BOOLEAN
336 IN4_IS_ADDR_SITELOCAL(
337 _In_ CONST IN_ADDR *a)
338 {
339 UNREFERENCED_PARAMETER(a);
340 return FALSE;
341 }
342 #define IN4_IS_UNALIGNED_ADDR_SITELOCAL IN4_IS_ADDR_SITELOCAL
343
344 MSTCPIP_INLINE
345 BOOLEAN
346 IN4_IS_ADDR_RFC1918(
347 _In_ CONST IN_ADDR *a)
348 {
349 return (BOOLEAN)(((a->s_addr & 0x00ff) == 0x0a) ||
350 ((a->s_addr & 0xf0ff) == 0x10ac) ||
351 ((a->s_addr & 0xffff) == 0xa8c0));
352 }
353
354 MSTCPIP_INLINE
355 BOOLEAN
356 IN4_IS_UNALIGNED_ADDR_RFC1918(
357 _In_ CONST IN_ADDR UNALIGNED *a)
358 {
359 IN_ADDR Ipv4Address = *a;
360 return IN4_IS_ADDR_RFC1918(&Ipv4Address);
361 }
362
363 MSTCPIP_INLINE
364 BOOLEAN
365 IN4_IS_ADDR_MC_LINKLOCAL(
366 _In_ CONST IN_ADDR *a)
367 {
368 return (BOOLEAN)((a->s_addr & 0xffffff) == 0xe0);
369 }
370
371 MSTCPIP_INLINE
372 BOOLEAN
373 IN4_IS_ADDR_MC_ADMINLOCAL(
374 _In_ CONST IN_ADDR *a)
375 {
376 return (BOOLEAN)((a->s_addr & 0xffff) == 0xffef);
377 }
378
379 MSTCPIP_INLINE
380 BOOLEAN
381 IN4_IS_ADDR_MC_SITELOCAL(
382 _In_ CONST IN_ADDR *a)
383 {
384 return (BOOLEAN)((a->s_addr & 0xff) == 0xef) &&
385 !IN4_IS_ADDR_MC_ADMINLOCAL(a);
386 }
387
388 MSTCPIP_INLINE
389 VOID
390 IN4ADDR_SETSOCKADDR(
391 _Out_ PSOCKADDR_IN a,
392 _In_ CONST IN_ADDR *addr,
393 _In_ USHORT port)
394 {
395 a->sin_family = AF_INET;
396 a->sin_port = port;
397 a->sin_addr = *addr;
398 memset(a->sin_zero, 0, sizeof(a->sin_zero));
399 }
400
401 MSTCPIP_INLINE
402 VOID
403 IN4ADDR_SETANY(
404 _Out_ PSOCKADDR_IN a)
405 {
406 a->sin_family = AF_INET;
407 a->sin_port = 0;
408 a->sin_addr.s_addr = IN4ADDR_ANY;
409 memset(a->sin_zero, 0, sizeof(a->sin_zero));
410 }
411
412 MSTCPIP_INLINE
413 VOID
414 IN4ADDR_SETLOOPBACK(
415 _Out_ PSOCKADDR_IN a)
416 {
417 a->sin_family = AF_INET;
418 a->sin_port = 0;
419 a->sin_addr.s_addr = IN4ADDR_LOOPBACK;
420 memset(a->sin_zero, 0, sizeof(a->sin_zero));
421 }
422
423 MSTCPIP_INLINE
424 BOOLEAN
425 IN4ADDR_ISANY(
426 _In_ CONST SOCKADDR_IN *a)
427 {
428 ASSERT(a->sin_family == AF_INET);
429 return IN4_IS_ADDR_UNSPECIFIED(&a->sin_addr);
430 }
431
432 MSTCPIP_INLINE
433 BOOLEAN
434 IN4ADDR_ISLOOPBACK(
435 _In_ CONST SOCKADDR_IN *a)
436 {
437 ASSERT(a->sin_family == AF_INET);
438 return IN4_IS_ADDR_LOOPBACK(&a->sin_addr);
439 }
440
441 MSTCPIP_INLINE
442 SCOPE_ID
443 IN4ADDR_SCOPE_ID(
444 _In_ CONST SOCKADDR_IN *a)
445 {
446 SCOPE_ID UnspecifiedScopeId = {{{0}}};
447 UNREFERENCED_PARAMETER(a);
448 return UnspecifiedScopeId;
449 }
450
451 MSTCPIP_INLINE
452 BOOLEAN
453 IN4ADDR_ISEQUAL(
454 _In_ CONST SOCKADDR_IN *a,
455 _In_ CONST SOCKADDR_IN *b)
456 {
457 ASSERT(a->sin_family == AF_INET);
458 return (BOOLEAN)(IN4ADDR_SCOPE_ID(a).Value == IN4ADDR_SCOPE_ID(b).Value &&
459 IN4_ADDR_EQUAL(&a->sin_addr, &b->sin_addr));
460 }
461
462 MSTCPIP_INLINE
463 BOOLEAN
464 IN4ADDR_ISUNSPECIFIED(
465 _In_ CONST SOCKADDR_IN *a)
466 {
467 ASSERT(a->sin_family == AF_INET);
468 return (BOOLEAN)(IN4ADDR_SCOPE_ID(a).Value == 0 &&
469 IN4_IS_ADDR_UNSPECIFIED(&a->sin_addr));
470 }
471
472 #define INET_IS_ALIGNED(Pointer, Type) \
473 (((ULONG_PTR)Pointer & (TYPE_ALIGNMENT(Type)-1)) == 0)
474
475 MSTCPIP_INLINE
476 SCOPE_LEVEL
477 Ipv4UnicastAddressScope(
478 _In_ CONST UCHAR *Address)
479 {
480 IN_ADDR Ipv4Address;
481
482 if (!INET_IS_ALIGNED(Address, IN_ADDR)) {
483 Ipv4Address = *(CONST IN_ADDR UNALIGNED *)Address;
484 Address = (CONST UCHAR *) &Ipv4Address;
485 }
486 if (IN4_IS_ADDR_LINKLOCAL((PIN_ADDR) Address) ||
487 IN4_IS_ADDR_LOOPBACK((PIN_ADDR) Address)) {
488 return ScopeLevelLink;
489 }
490 return ScopeLevelGlobal;
491 }
492
493 MSTCPIP_INLINE
494 SCOPE_LEVEL
495 Ipv4MulticastAddressScope(
496 _In_ CONST UCHAR *Address)
497 {
498 IN_ADDR Ipv4Address;
499
500 if (!INET_IS_ALIGNED(Address, IN_ADDR)) {
501 Ipv4Address = *(CONST IN_ADDR UNALIGNED *)Address;
502 Address = (CONST UCHAR *) &Ipv4Address;
503 }
504 if (IN4_IS_ADDR_MC_LINKLOCAL((PIN_ADDR) Address)) {
505 return ScopeLevelLink;
506 } else if (IN4_IS_ADDR_MC_ADMINLOCAL((PIN_ADDR) Address)) {
507 return ScopeLevelAdmin;
508 } else if (IN4_IS_ADDR_MC_SITELOCAL((PIN_ADDR) Address)) {
509 return ScopeLevelSite;
510 } else {
511 return ScopeLevelGlobal;
512 }
513 }
514
515 MSTCPIP_INLINE
516 SCOPE_LEVEL
517 Ipv4AddressScope(
518 _In_ CONST UCHAR *Address)
519 {
520 CONST IN_ADDR Ipv4Address = *(CONST IN_ADDR UNALIGNED *)Address;
521
522 if (IN4_IS_ADDR_BROADCAST(&Ipv4Address)) {
523 return ScopeLevelLink;
524 } else if (IN4_IS_ADDR_MULTICAST(&Ipv4Address)) {
525 return Ipv4MulticastAddressScope((UCHAR *) &Ipv4Address);
526 } else {
527 return Ipv4UnicastAddressScope((UCHAR *) &Ipv4Address);
528 }
529 }
530
531 MSTCPIP_INLINE
532 NL_ADDRESS_TYPE
533 Ipv4AddressType(
534 _In_ CONST UCHAR *Address)
535 {
536 IN_ADDR Ipv4Address = *(CONST IN_ADDR UNALIGNED *) Address;
537
538 if (IN4_IS_ADDR_MULTICAST(&Ipv4Address)) {
539 return NlatMulticast;
540 }
541 if (IN4_IS_ADDR_BROADCAST(&Ipv4Address)) {
542 return NlatBroadcast;
543 }
544 if (IN4_IS_ADDR_UNSPECIFIED(&Ipv4Address)) {
545 return NlatUnspecified;
546 }
547 if (((Ipv4Address.s_addr & 0x000000ff) == 0) ||
548 ((Ipv4Address.s_addr & 0x000000f0) == 240)) {
549 return NlatInvalid;
550 }
551 return NlatUnicast;
552 }
553
554 MSTCPIP_INLINE
555 VOID
556 IN4_UNCANONICALIZE_SCOPE_ID(
557 _In_ CONST IN_ADDR *Address,
558 _Inout_ SCOPE_ID *ScopeId)
559 {
560 SCOPE_LEVEL ScopeLevel = Ipv4AddressScope((CONST UCHAR *)Address);
561
562 if ((IN4_IS_ADDR_LOOPBACK(Address)) || (ScopeLevel == ScopeLevelGlobal)) {
563 ScopeId->Value = 0;
564 }
565 if ((SCOPE_LEVEL)ScopeId->Level == ScopeLevel) {
566 ScopeId->Level = 0;
567 }
568 }
569
570 MSTCPIP_INLINE
571 BOOLEAN
572 IN4_IS_ADDR_6TO4ELIGIBLE(
573 _In_ CONST IN_ADDR *a)
574 {
575 return (BOOLEAN)((Ipv4AddressType((CONST UCHAR *) a) == NlatUnicast) &&
576 !(IN4_IS_ADDR_LOOPBACK(a) ||
577 IN4_IS_ADDR_LINKLOCAL(a) ||
578 IN4_IS_ADDR_SITELOCAL(a) ||
579 IN4_IS_ADDR_RFC1918(a)));
580 }
581
582 MSTCPIP_INLINE
583 BOOLEAN
584 IN4_IS_UNALIGNED_ADDR_6TO4ELIGIBLE(
585 _In_ CONST IN_ADDR UNALIGNED *a)
586 {
587 IN_ADDR Ipv4Address = *a;
588 return IN4_IS_ADDR_6TO4ELIGIBLE(&Ipv4Address);
589 }
590
591 #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP1) */
592
593 #endif /* _WS2DEF_ */
594
595 #ifdef _WS2IPDEF_
596
597 MSTCPIP_INLINE
598 BOOLEAN
599 IN6_PREFIX_EQUAL(
600 _In_ CONST IN6_ADDR *a,
601 _In_ CONST IN6_ADDR *b,
602 _In_ UINT8 len)
603 {
604 UINT8 Bytes = len / 8;
605 UINT8 Bits = len % 8;
606 UINT8 Mask = 0xff << (8 - Bits);
607
608 ASSERT(len <= (sizeof(IN6_ADDR) * 8));
609 return (BOOLEAN) (((memcmp(a, b, Bytes)) == 0) && ((Bits == 0) ||
610 ((a->s6_bytes[Bytes] | Mask) == (b->s6_bytes[Bytes] | Mask))));
611 }
612
613 MSTCPIP_INLINE
614 BOOLEAN
615 IN6_IS_ADDR_ALLNODESONNODE(
616 _In_ CONST IN6_ADDR *a)
617 {
618 return IN6_ADDR_EQUAL(a, &in6addr_allnodesonnode);
619 }
620
621 MSTCPIP_INLINE
622 BOOLEAN
623 IN6_IS_ADDR_ALLNODESONLINK(
624 _In_ CONST IN6_ADDR *a)
625 {
626 return IN6_ADDR_EQUAL(a, &in6addr_allnodesonlink);
627 }
628
629 MSTCPIP_INLINE
630 BOOLEAN
631 IN6_IS_ADDR_ALLROUTERSONLINK(
632 _In_ CONST IN6_ADDR *a)
633 {
634 return IN6_ADDR_EQUAL(a, &in6addr_allroutersonlink);
635 }
636
637 MSTCPIP_INLINE
638 BOOLEAN
639 IN6_IS_ADDR_SOLICITEDNODE(
640 _In_ CONST IN6_ADDR *a)
641 {
642 return IN6_PREFIX_EQUAL(a, &in6addr_solicitednodemulticastprefix,
643 IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH);
644 }
645
646 MSTCPIP_INLINE
647 BOOLEAN
648 IN6_IS_ADDR_ISATAP(
649 _In_ CONST IN6_ADDR *a)
650 {
651 return (BOOLEAN)(((a->s6_words[4] & 0xfffd) == 0x0000) &&
652 (a->s6_words[5] == 0xfe5e));
653 }
654
655 MSTCPIP_INLINE
656 BOOLEAN
657 IN6_IS_ADDR_6TO4(
658 _In_ CONST IN6_ADDR *a)
659 {
660 C_ASSERT(IN6ADDR_6TO4PREFIX_LENGTH == RTL_BITS_OF(USHORT));
661 return (BOOLEAN)(a->s6_words[0] == in6addr_6to4prefix.s6_words[0]);
662 }
663
664 MSTCPIP_INLINE
665 BOOLEAN
666 IN6_IS_ADDR_TEREDO(
667 _In_ CONST IN6_ADDR *a)
668 {
669 C_ASSERT(IN6ADDR_TEREDOPREFIX_LENGTH == 2 * RTL_BITS_OF(USHORT));
670 return (BOOLEAN)
671 (((a->s6_words[0] == in6addr_teredoprefix.s6_words[0]) &&
672 (a->s6_words[1] == in6addr_teredoprefix.s6_words[1])) ||
673 ((a->s6_words[0] == in6addr_teredoprefix_old.s6_words[0]) &&
674 (a->s6_words[1] == in6addr_teredoprefix_old.s6_words[1])));
675 }
676
677 MSTCPIP_INLINE
678 BOOLEAN
679 IN6ADDR_ISV4MAPPED(
680 _In_ CONST SOCKADDR_IN6 *a)
681 {
682 ASSERT(a->sin6_family == AF_INET6);
683 return IN6_IS_ADDR_V4MAPPED(&a->sin6_addr);
684 }
685
686 MSTCPIP_INLINE
687 BOOLEAN
688 IN6ADDR_ISISATAP(
689 _In_ CONST SOCKADDR_IN6 *a)
690 {
691 ASSERT(a->sin6_family == AF_INET6);
692 return IN6_IS_ADDR_ISATAP(&a->sin6_addr);
693 }
694
695 MSTCPIP_INLINE
696 BOOLEAN
697 IN6ADDR_IS6TO4(
698 _In_ CONST SOCKADDR_IN6 *a)
699 {
700 ASSERT(a->sin6_family == AF_INET6);
701 return IN6_IS_ADDR_6TO4(&a->sin6_addr);
702 }
703
704 MSTCPIP_INLINE
705 BOOLEAN
706 IN6ADDR_ISTEREDO(
707 _In_ CONST SOCKADDR_IN6 *a)
708 {
709 ASSERT(a->sin6_family == AF_INET6);
710 return IN6_IS_ADDR_TEREDO(&a->sin6_addr);
711 }
712
713 MSTCPIP_INLINE
714 CONST UCHAR*
715 IN6_GET_ADDR_V4MAPPED(
716 _In_ CONST IN6_ADDR *Ipv6Address)
717 {
718 return (CONST UCHAR *) (Ipv6Address->s6_words + 6);
719 }
720
721 MSTCPIP_INLINE
722 CONST UCHAR*
723 IN6_GET_ADDR_V4COMPAT(
724 _In_ CONST IN6_ADDR *Ipv6Address)
725 {
726 return (CONST UCHAR *) (Ipv6Address->s6_words + 6);
727 }
728
729 MSTCPIP_INLINE
730 CONST UCHAR*
731 IN6_EXTRACT_V4ADDR_FROM_ISATAP(
732 _In_ CONST IN6_ADDR *Ipv6Address)
733 {
734 return (CONST UCHAR *) (Ipv6Address->s6_words + 6);
735 }
736
737 MSTCPIP_INLINE
738 CONST UCHAR*
739 IN6_EXTRACT_V4ADDR_FROM_6TO4(
740 _In_ CONST IN6_ADDR *Ipv6Address)
741 {
742 return (CONST UCHAR *) (Ipv6Address->s6_words + 1);
743 }
744
745 MSTCPIP_INLINE
746 VOID
747 IN6_SET_ADDR_V4MAPPED(
748 _Out_ PIN6_ADDR a6,
749 _In_ CONST IN_ADDR* a4)
750 {
751 *a6 = in6addr_v4mappedprefix;
752 a6->s6_bytes[12] = ((CONST UCHAR *) a4)[0];
753 a6->s6_bytes[13] = ((CONST UCHAR *) a4)[1];
754 a6->s6_bytes[14] = ((CONST UCHAR *) a4)[2];
755 a6->s6_bytes[15] = ((CONST UCHAR *) a4)[3];
756 }
757
758 MSTCPIP_INLINE
759 VOID
760 IN6_SET_ADDR_V4COMPAT(
761 _Out_ PIN6_ADDR a6,
762 _In_ CONST IN_ADDR* a4)
763 {
764 *a6 = in6addr_any;
765 a6->s6_bytes[12] = ((CONST UCHAR *) a4)[0];
766 a6->s6_bytes[13] = ((CONST UCHAR *) a4)[1];
767 a6->s6_bytes[14] = ((CONST UCHAR *) a4)[2];
768 a6->s6_bytes[15] = ((CONST UCHAR *) a4)[3];
769 }
770
771 MSTCPIP_INLINE
772 VOID
773 IN6_SET_ADDR_SOLICITEDNODE(
774 _Out_ PIN6_ADDR Multicast,
775 _In_ CONST IN6_ADDR *Unicast)
776 {
777 *Multicast = in6addr_solicitednodemulticastprefix;
778 Multicast->s6_bytes[13] = Unicast->s6_bytes[13];
779 Multicast->s6_bytes[14] = Unicast->s6_bytes[14];
780 Multicast->s6_bytes[15] = Unicast->s6_bytes[15];
781 }
782
783 MSTCPIP_INLINE
784 VOID
785 IN6_SET_ISATAP_IDENTIFIER(
786 _Inout_ IN6_ADDR *Ipv6Address,
787 _In_ CONST IN_ADDR *Ipv4Address)
788 {
789 if (IN4_IS_ADDR_6TO4ELIGIBLE(Ipv4Address)) {
790 Ipv6Address->s6_words[4] = 0x0002;
791 } else {
792 Ipv6Address->s6_words[4] = 0x0000;
793 }
794 Ipv6Address->s6_words[5] = 0xFE5E;
795 *((UNALIGNED IN_ADDR *) (Ipv6Address->s6_words + 6)) = *Ipv4Address;
796 }
797
798 MSTCPIP_INLINE
799 VOID
800 IN6_SET_6TO4_PREFIX(
801 _Inout_ IN6_ADDR *Ipv6Address,
802 _In_ CONST IN_ADDR *Ipv4Address)
803 {
804 Ipv6Address->s6_words[0] = 0x0220;
805 *((UNALIGNED IN_ADDR *) (Ipv6Address->s6_words + 1)) = *Ipv4Address;
806 Ipv6Address->s6_words[3] = 0x0000;
807 }
808
809 MSTCPIP_INLINE
810 SCOPE_LEVEL
811 Ipv6UnicastAddressScope(
812 _In_ CONST UCHAR *Address)
813 {
814 IN6_ADDR Ipv6Address;
815
816 if (!INET_IS_ALIGNED(Address, IN6_ADDR)) {
817 Ipv6Address = *(CONST IN6_ADDR UNALIGNED *)Address;
818 Address = (CONST UCHAR *) &Ipv6Address;
819 }
820 if (IN6_IS_ADDR_LINKLOCAL((PIN6_ADDR) Address) ||
821 IN6_IS_ADDR_LOOPBACK((PIN6_ADDR) Address)) {
822 return ScopeLevelLink;
823 } else if (IN6_IS_ADDR_SITELOCAL((PIN6_ADDR) Address)) {
824 return ScopeLevelSite;
825 } else {
826 return ScopeLevelGlobal;
827 }
828 }
829
830 MSTCPIP_INLINE
831 SCOPE_LEVEL
832 IN6_MULTICAST_SCOPE(
833 _In_ CONST UCHAR *Address)
834 {
835 PIN6_ADDR Ipv6Address = (PIN6_ADDR) Address;
836 return (SCOPE_LEVEL)(Ipv6Address->s6_bytes[1] & 0xf);
837 }
838
839 MSTCPIP_INLINE
840 SCOPE_LEVEL
841 Ipv6AddressScope(
842 _In_ CONST UCHAR *Address)
843 {
844 if (IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR *) Address)) {
845 return IN6_MULTICAST_SCOPE(Address);
846 } else {
847 return Ipv6UnicastAddressScope(Address);
848 }
849 }
850
851 MSTCPIP_INLINE
852 NL_ADDRESS_TYPE
853 Ipv6AddressType(
854 _In_ CONST UCHAR *Address)
855 {
856 CONST IN6_ADDR *Ipv6Address = (CONST IN6_ADDR *) Address;
857 CONST UCHAR *Ipv4Address;
858
859 if (IN6_IS_ADDR_MULTICAST(Ipv6Address)) {
860 return NlatMulticast;
861 }
862 if (IN6_IS_ADDR_UNSPECIFIED(Ipv6Address)) {
863 return NlatUnspecified;
864 }
865 if (IN6_IS_ADDR_ISATAP(Ipv6Address) || IN6_IS_ADDR_V4COMPAT(Ipv6Address) ||
866 IN6_IS_ADDR_V4MAPPED(Ipv6Address) || IN6_IS_ADDR_V4TRANSLATED(Ipv6Address)) {
867 Ipv4Address = IN6_EXTRACT_V4ADDR_FROM_ISATAP(Ipv6Address);
868 } else if (IN6_IS_ADDR_6TO4(Ipv6Address)) {
869 Ipv4Address = IN6_EXTRACT_V4ADDR_FROM_6TO4(Ipv6Address);
870 } else {
871 return NlatUnicast;
872 }
873 if (Ipv4AddressType(Ipv4Address) != NlatUnicast) {
874 return NlatInvalid;
875 }
876 return NlatUnicast;
877 }
878
879 MSTCPIP_INLINE
880 VOID
881 IN6_UNCANONICALIZE_SCOPE_ID(
882 _In_ CONST IN6_ADDR *Address,
883 _Inout_ SCOPE_ID *ScopeId)
884 {
885 SCOPE_LEVEL ScopeLevel = Ipv6AddressScope((CONST UCHAR *)Address);
886
887 if ((IN6_IS_ADDR_LOOPBACK(Address)) || (ScopeLevel == ScopeLevelGlobal)) {
888 ScopeId->Value = 0;
889 }
890 if ((SCOPE_LEVEL)ScopeId->Level == ScopeLevel) {
891 ScopeId->Level = 0;
892 }
893 }
894
895 #if (NTDDI_VERSION >= NTDDI_VISTA)
896
897 MSTCPIP_INLINE
898 VOID
899 IN6ADDR_SETSOCKADDR(
900 _Out_ PSOCKADDR_IN6 a,
901 _In_ CONST IN6_ADDR *addr,
902 _In_ SCOPE_ID scope,
903 _In_ USHORT port)
904 {
905 a->sin6_family = AF_INET6;
906 a->sin6_port = port;
907 a->sin6_flowinfo = 0;
908 RtlCopyMemory(&a->sin6_addr, addr, sizeof(IN6_ADDR));
909 a->sin6_scope_struct = scope;
910 IN6_UNCANONICALIZE_SCOPE_ID(&a->sin6_addr, &a->sin6_scope_struct);
911 }
912
913 MSTCPIP_INLINE
914 VOID
915 IN6ADDR_SETV4MAPPED(
916 _Out_ PSOCKADDR_IN6 a6,
917 _In_ CONST IN_ADDR* a4,
918 _In_ SCOPE_ID scope,
919 _In_ USHORT port)
920 {
921 a6->sin6_family = AF_INET6;
922 a6->sin6_port = port;
923 a6->sin6_flowinfo = 0;
924 IN6_SET_ADDR_V4MAPPED(&a6->sin6_addr, a4);
925 a6->sin6_scope_struct = scope;
926 IN4_UNCANONICALIZE_SCOPE_ID(a4, &a6->sin6_scope_struct);
927 }
928
929 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
930
931 MSTCPIP_INLINE
932 BOOLEAN
933 INET_ADDR_EQUAL(
934 _In_ ADDRESS_FAMILY af,
935 _In_ CONST VOID* a,
936 _In_ CONST VOID* b)
937 {
938 if (af == AF_INET6) {
939 return IN6_ADDR_EQUAL((CONST IN6_ADDR*)a, (CONST IN6_ADDR*)b);
940 } else {
941 ASSERT(af == AF_INET);
942 return IN4_ADDR_EQUAL((CONST IN_ADDR*)a, (CONST IN_ADDR*)b);
943 }
944 }
945
946 MSTCPIP_INLINE
947 BOOLEAN
948 INET_UNALIGNED_ADDR_EQUAL(
949 _In_ ADDRESS_FAMILY af,
950 _In_ CONST VOID* a,
951 _In_ CONST VOID* b)
952 {
953 if (af == AF_INET6) {
954 return IN6_ADDR_EQUAL((CONST IN6_ADDR*)a, (CONST IN6_ADDR*)b);
955 } else {
956 ASSERT(af == AF_INET);
957 return IN4_UNALIGNED_ADDR_EQUAL((CONST IN_ADDR*)a, (CONST IN_ADDR*)b);
958 }
959 }
960
961 MSTCPIP_INLINE
962 BOOLEAN
963 INET_IS_ADDR_UNSPECIFIED(
964 _In_ ADDRESS_FAMILY af,
965 _In_ CONST VOID* a)
966 {
967 if (af == AF_INET6) {
968 return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR*)a);
969 } else {
970 ASSERT(af == AF_INET);
971 return IN4_IS_ADDR_UNSPECIFIED((CONST IN_ADDR*)a);
972 }
973 }
974
975 MSTCPIP_INLINE
976 BOOLEAN
977 INET_IS_UNALIGNED_ADDR_UNSPECIFIED(
978 _In_ ADDRESS_FAMILY af,
979 _In_ CONST VOID* a)
980 {
981 if (af == AF_INET6) {
982 return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR*)a);
983 } else {
984 ASSERT(af == AF_INET);
985 return IN4_IS_UNALIGNED_ADDR_UNSPECIFIED((CONST IN_ADDR UNALIGNED*)a);
986 }
987 }
988
989 MSTCPIP_INLINE
990 BOOLEAN
991 INET_IS_ADDR_LOOPBACK(
992 _In_ ADDRESS_FAMILY af,
993 _In_ CONST VOID* a)
994 {
995 if (af == AF_INET6) {
996 return IN6_IS_ADDR_LOOPBACK((CONST IN6_ADDR*)a);
997 } else {
998 ASSERT(af == AF_INET);
999 return IN4_IS_ADDR_LOOPBACK((CONST IN_ADDR*)a);
1000 }
1001 }
1002
1003 MSTCPIP_INLINE
1004 BOOLEAN
1005 INET_IS_ADDR_BROADCAST(
1006 _In_ ADDRESS_FAMILY af,
1007 _In_ CONST VOID* a)
1008 {
1009 if (af == AF_INET6) {
1010 return FALSE;
1011 } else {
1012 ASSERT(af == AF_INET);
1013 return IN4_IS_ADDR_BROADCAST((CONST IN_ADDR*)a);
1014 }
1015 }
1016
1017 MSTCPIP_INLINE
1018 BOOLEAN
1019 INET_IS_ADDR_MULTICAST(
1020 _In_ ADDRESS_FAMILY af,
1021 _In_ CONST VOID* a)
1022 {
1023 if (af == AF_INET6) {
1024 return IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR*)a);
1025 } else {
1026 ASSERT(af == AF_INET);
1027 return IN4_IS_ADDR_MULTICAST((CONST IN_ADDR*)a);
1028 }
1029 }
1030
1031 MSTCPIP_INLINE
1032 CONST UCHAR*
1033 INET_ADDR_UNSPECIFIED(
1034 _In_ ADDRESS_FAMILY af)
1035 {
1036 if (af == AF_INET6) {
1037 return (CONST UCHAR*)&in6addr_any;
1038 } else {
1039 ASSERT(af == AF_INET);
1040 return (CONST UCHAR*)&in4addr_any;
1041 }
1042 }
1043
1044 MSTCPIP_INLINE
1045 VOID
1046 INET_SET_ADDRESS(
1047 _In_ ADDRESS_FAMILY Family,
1048 _Out_ PUCHAR Address,
1049 _In_ CONST UCHAR *Value)
1050 {
1051 if (Family == AF_INET6) {
1052 *((PIN6_ADDR)Address) = *((PIN6_ADDR)Value);
1053 } else {
1054 ASSERT(Family == AF_INET);
1055 *((PIN_ADDR)Address) = *((PIN_ADDR)Value);
1056 }
1057 }
1058
1059 MSTCPIP_INLINE
1060 SIZE_T
1061 INET_ADDR_LENGTH(
1062 _In_ ADDRESS_FAMILY af)
1063 {
1064 if (af == AF_INET6) {
1065 return sizeof(IN6_ADDR);
1066 } else {
1067 ASSERT(af == AF_INET);
1068 return sizeof(IN_ADDR);
1069 }
1070 }
1071
1072 MSTCPIP_INLINE
1073 SIZE_T
1074 INET_SOCKADDR_LENGTH(
1075 _In_ ADDRESS_FAMILY af)
1076 {
1077 if (af == AF_INET6) {
1078 return sizeof(SOCKADDR_IN6);
1079 } else {
1080 ASSERT(af == AF_INET);
1081 return sizeof(SOCKADDR_IN);
1082 }
1083 }
1084
1085 #if (NTDDI_VERSION >= NTDDI_VISTA)
1086 MSTCPIP_INLINE
1087 VOID
1088 INETADDR_SETSOCKADDR(
1089 _In_ ADDRESS_FAMILY af,
1090 _Out_ PSOCKADDR a,
1091 _In_ CONST VOID* addr,
1092 _In_ SCOPE_ID scope,
1093 _In_ USHORT port)
1094 {
1095 if (af == AF_INET6) {
1096 IN6ADDR_SETSOCKADDR((PSOCKADDR_IN6) a, (CONST IN6_ADDR *) addr, scope, port);
1097 } else {
1098 CONST IN_ADDR addr4 = *((IN_ADDR UNALIGNED *) addr);
1099 ASSERT(af == AF_INET);
1100 IN4ADDR_SETSOCKADDR((PSOCKADDR_IN) a, (CONST IN_ADDR *) &addr4, port);
1101 }
1102 }
1103 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1104
1105 MSTCPIP_INLINE
1106 VOID
1107 INETADDR_SETANY(
1108 _Inout_ PSOCKADDR a)
1109 {
1110 if (a->sa_family == AF_INET6) {
1111 IN6ADDR_SETANY((PSOCKADDR_IN6)a);
1112 } else {
1113 ASSERT(a->sa_family == AF_INET);
1114 IN4ADDR_SETANY((PSOCKADDR_IN)a);
1115 }
1116 }
1117
1118 MSTCPIP_INLINE
1119 VOID
1120 INETADDR_SETLOOPBACK(
1121 _Inout_ PSOCKADDR a)
1122 {
1123 if (a->sa_family == AF_INET6) {
1124 IN6ADDR_SETLOOPBACK((PSOCKADDR_IN6)a);
1125 } else {
1126 ASSERT(a->sa_family == AF_INET);
1127 IN4ADDR_SETLOOPBACK((PSOCKADDR_IN)a);
1128 }
1129 }
1130
1131 MSTCPIP_INLINE
1132 BOOLEAN
1133 INETADDR_ISANY(
1134 _In_ CONST SOCKADDR *a)
1135 {
1136 if (a->sa_family == AF_INET6) {
1137 return IN6ADDR_ISANY((CONST SOCKADDR_IN6*)a);
1138 } else {
1139 ASSERT(a->sa_family == AF_INET);
1140 return IN4ADDR_ISANY((CONST SOCKADDR_IN*)a);
1141 }
1142 }
1143
1144 MSTCPIP_INLINE
1145 BOOLEAN
1146 INETADDR_ISLOOPBACK(
1147 _In_ CONST SOCKADDR *a)
1148 {
1149 if (a->sa_family == AF_INET6) {
1150 return IN6ADDR_ISLOOPBACK((CONST SOCKADDR_IN6*)a);
1151 } else {
1152 ASSERT(a->sa_family == AF_INET);
1153 return IN4ADDR_ISLOOPBACK((CONST SOCKADDR_IN*)a);
1154 }
1155 }
1156
1157 MSTCPIP_INLINE
1158 BOOLEAN
1159 INETADDR_ISV4MAPPED(
1160 _In_ CONST SOCKADDR *a)
1161 {
1162 if (a->sa_family == AF_INET6) {
1163 return IN6ADDR_ISV4MAPPED((CONST SOCKADDR_IN6*)a);
1164 } else {
1165 return FALSE;
1166 }
1167 }
1168
1169 MSTCPIP_INLINE
1170 BOOLEAN
1171 NL_ADDR_EQUAL(
1172 _In_ ADDRESS_FAMILY af,
1173 _In_ SCOPE_ID sa,
1174 _In_ CONST UCHAR* aa,
1175 _In_ SCOPE_ID sb,
1176 _In_ CONST UCHAR* ab)
1177 {
1178 return (BOOLEAN)((sa.Value == sb.Value) && INET_ADDR_EQUAL(af, aa, ab));
1179 }
1180
1181 MSTCPIP_INLINE
1182 BOOLEAN
1183 NL_IS_ADDR_UNSPECIFIED(
1184 _In_ ADDRESS_FAMILY af,
1185 _In_ SCOPE_ID s,
1186 _In_ CONST UCHAR* a)
1187 {
1188 return (BOOLEAN)((s.Value == 0) && INET_IS_ADDR_UNSPECIFIED(af, a));
1189 }
1190
1191 MSTCPIP_INLINE
1192 BOOLEAN
1193 INETADDR_ISEQUAL(
1194 _In_ CONST SOCKADDR *a,
1195 _In_ CONST SOCKADDR *b)
1196 {
1197 if (a->sa_family == AF_INET6) {
1198 return (BOOLEAN) (b->sa_family == AF_INET6 &&
1199 IN6ADDR_ISEQUAL((CONST SOCKADDR_IN6*)a, (CONST SOCKADDR_IN6*)b));
1200 } else {
1201 ASSERT(a->sa_family == AF_INET);
1202 return (BOOLEAN) (b->sa_family == AF_INET &&
1203 IN4ADDR_ISEQUAL((CONST SOCKADDR_IN*)a, (CONST SOCKADDR_IN*)b));
1204 }
1205 }
1206
1207 MSTCPIP_INLINE
1208 BOOLEAN
1209 INETADDR_ISUNSPECIFIED(
1210 _In_ CONST SOCKADDR *a)
1211 {
1212 if (a->sa_family == AF_INET6) {
1213 return IN6ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN6*)a);
1214 } else {
1215 ASSERT(a->sa_family == AF_INET);
1216 return IN4ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN*)a);
1217 }
1218 }
1219
1220 #if (NTDDI_VERSION >= NTDDI_VISTA)
1221 MSTCPIP_INLINE
1222 SCOPE_ID
1223 INETADDR_SCOPE_ID(
1224 _In_ CONST SOCKADDR *a)
1225 {
1226 if (a->sa_family == AF_INET6) {
1227 return ((CONST SOCKADDR_IN6*)a)->sin6_scope_struct;
1228 } else {
1229 ASSERT(a->sa_family == AF_INET);
1230 return IN4ADDR_SCOPE_ID((CONST SOCKADDR_IN*)a);
1231 }
1232 }
1233 #endif
1234
1235 MSTCPIP_INLINE
1236 USHORT
1237 INETADDR_PORT(
1238 _In_ CONST SOCKADDR *a)
1239 {
1240 if (a->sa_family == AF_INET6) {
1241 return ((CONST SOCKADDR_IN6*)a)->sin6_port;
1242 } else {
1243 ASSERT(a->sa_family == AF_INET);
1244 return ((CONST SOCKADDR_IN*)a)->sin_port;
1245 }
1246 }
1247
1248 MSTCPIP_INLINE
1249 PUCHAR
1250 INETADDR_ADDRESS(
1251 _In_ CONST SOCKADDR* a)
1252 {
1253 if (a->sa_family == AF_INET6) {
1254 return (PUCHAR)&((PSOCKADDR_IN6)a)->sin6_addr;
1255 } else {
1256 ASSERT(a->sa_family == AF_INET);
1257 return (PUCHAR)&((PSOCKADDR_IN)a)->sin_addr;
1258 }
1259 }
1260
1261 MSTCPIP_INLINE
1262 VOID
1263 INETADDR_SET_PORT(
1264 _Inout_ PSOCKADDR a,
1265 _In_ USHORT Port)
1266 {
1267 SS_PORT(a) = Port;
1268 }
1269
1270 MSTCPIP_INLINE
1271 VOID
1272 INETADDR_SET_ADDRESS(
1273 _Inout_ PSOCKADDR a,
1274 _In_ CONST UCHAR *Address)
1275 {
1276 if (a->sa_family == AF_INET6) {
1277 ((PSOCKADDR_IN6)a)->sin6_addr = *((CONST IN6_ADDR*)Address);
1278 } else {
1279 ASSERT(a->sa_family == AF_INET);
1280 ((PSOCKADDR_IN)a)->sin_addr = *((CONST IN_ADDR*)Address);
1281 }
1282 }
1283
1284 MSTCPIP_INLINE
1285 VOID
1286 INET_UNCANONICALIZE_SCOPE_ID(
1287 _In_ ADDRESS_FAMILY AddressFamily,
1288 _In_ CONST UCHAR *Address,
1289 _Inout_ SCOPE_ID *ScopeId)
1290 {
1291 if (AddressFamily == AF_INET6) {
1292 IN6_UNCANONICALIZE_SCOPE_ID((CONST IN6_ADDR*) Address, ScopeId);
1293 } else {
1294 IN4_UNCANONICALIZE_SCOPE_ID((CONST IN_ADDR*) Address, ScopeId);
1295 }
1296 }
1297
1298 #endif /* _WS2IPDEF_ */
1299
1300 #ifndef __IP2STRING__
1301 #define __IP2STRING__
1302
1303 #if (NTDDI_VERSION >= NTDDI_VISTA)
1304
1305 #ifdef _WS2DEF_
1306
1307 NTSYSAPI
1308 PSTR
1309 NTAPI
1310 RtlIpv4AddressToStringA(
1311 _In_ const struct in_addr *Addr,
1312 _Out_writes_(16) PSTR S);
1313
1314 NTSYSAPI
1315 LONG
1316 NTAPI
1317 RtlIpv4AddressToStringExA(
1318 _In_ const struct in_addr *Address,
1319 _In_ USHORT Port,
1320 _Out_writes_to_(*AddressStringLength, *AddressStringLength) PSTR AddressString,
1321 _Inout_ PULONG AddressStringLength);
1322
1323 NTSYSAPI
1324 PWSTR
1325 NTAPI
1326 RtlIpv4AddressToStringW(
1327 _In_ const struct in_addr *Addr,
1328 _Out_writes_(16) PWSTR S);
1329
1330 NTSYSAPI
1331 LONG
1332 NTAPI
1333 RtlIpv4AddressToStringExW(
1334 _In_ const struct in_addr *Address,
1335 _In_ USHORT Port,
1336 _Out_writes_to_(*AddressStringLength, *AddressStringLength) PWSTR AddressString,
1337 _Inout_ PULONG AddressStringLength);
1338
1339 NTSYSAPI
1340 LONG
1341 NTAPI
1342 RtlIpv4StringToAddressA(
1343 _In_ PCSTR String,
1344 _In_ BOOLEAN Strict,
1345 _Out_ PCSTR *Terminator,
1346 _Out_ struct in_addr *Addr);
1347
1348 NTSYSAPI
1349 LONG
1350 NTAPI
1351 RtlIpv4StringToAddressExA(
1352 _In_ PCSTR AddressString,
1353 _In_ BOOLEAN Strict,
1354 _Out_ struct in_addr *Address,
1355 _Out_ PUSHORT Port);
1356
1357 NTSYSAPI
1358 LONG
1359 NTAPI
1360 RtlIpv4StringToAddressW(
1361 _In_ PCWSTR String,
1362 _In_ BOOLEAN Strict,
1363 _Out_ PCWSTR *Terminator,
1364 _Out_ struct in_addr *Addr);
1365
1366 NTSYSAPI
1367 LONG
1368 NTAPI
1369 RtlIpv4StringToAddressExW(
1370 _In_ PCWSTR AddressString,
1371 _In_ BOOLEAN Strict,
1372 _Out_ struct in_addr *Address,
1373 _Out_ PUSHORT Port);
1374
1375 #ifdef UNICODE
1376 #define RtlIpv4AddressToString RtlIpv4AddressToStringW
1377 #define RtlIpv4StringToAddress RtlIpv4StringToAddressW
1378 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExW
1379 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExW
1380 #else
1381 #define RtlIpv4AddressToString RtlIpv4AddressToStringA
1382 #define RtlIpv4StringToAddress RtlIpv4StringToAddressA
1383 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExA
1384 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExA
1385 #endif
1386
1387 #endif /* _WS2DEF_ */
1388
1389 #ifdef _WS2IPDEF_
1390
1391 NTSYSAPI
1392 PSTR
1393 NTAPI
1394 RtlIpv6AddressToStringA(
1395 _In_ const struct in6_addr *Addr,
1396 _Out_writes_(46) PSTR S);
1397
1398 NTSYSAPI
1399 LONG
1400 NTAPI
1401 RtlIpv6AddressToStringExA(
1402 _In_ const struct in6_addr *Address,
1403 _In_ ULONG ScopeId,
1404 _In_ USHORT Port,
1405 _Out_writes_to_(*AddressStringLength, *AddressStringLength) PSTR AddressString,
1406 _Inout_ PULONG AddressStringLength);
1407
1408 NTSYSAPI
1409 PWSTR
1410 NTAPI
1411 RtlIpv6AddressToStringW(
1412 _In_ const struct in6_addr *Addr,
1413 _Out_writes_(46) PWSTR S);
1414
1415 NTSYSAPI
1416 LONG
1417 NTAPI
1418 RtlIpv6AddressToStringExW(
1419 _In_ const struct in6_addr *Address,
1420 _In_ ULONG ScopeId,
1421 _In_ USHORT Port,
1422 _Out_writes_to_(*AddressStringLength, *AddressStringLength) PWSTR AddressString,
1423 _Inout_ PULONG AddressStringLength);
1424
1425 NTSYSAPI
1426 LONG
1427 NTAPI
1428 RtlIpv6StringToAddressA(
1429 _In_ PCSTR S,
1430 _Out_ PCSTR *Terminator,
1431 _Out_ struct in6_addr *Addr);
1432
1433 NTSYSAPI
1434 LONG
1435 NTAPI
1436 RtlIpv6StringToAddressExA(
1437 _In_ PCSTR AddressString,
1438 _Out_ struct in6_addr *Address,
1439 _Out_ PULONG ScopeId,
1440 _Out_ PUSHORT Port);
1441
1442 NTSYSAPI
1443 LONG
1444 NTAPI
1445 RtlIpv6StringToAddressW(
1446 _In_ PCWSTR S,
1447 _Out_ PCWSTR *Terminator,
1448 _Out_ struct in6_addr *Addr);
1449
1450 NTSYSAPI
1451 LONG
1452 NTAPI
1453 RtlIpv6StringToAddressExW(
1454 _In_ PCWSTR AddressString,
1455 _Out_ struct in6_addr *Address,
1456 _Out_ PULONG ScopeId,
1457 _Out_ PUSHORT Port);
1458
1459 #ifdef UNICODE
1460 #define RtlIpv6AddressToString RtlIpv6AddressToStringW
1461 #define RtlIpv6StringToAddress RtlIpv6StringToAddressW
1462 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExW
1463 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExW
1464 #else
1465 #define RtlIpv6AddressToString RtlIpv6AddressToStringA
1466 #define RtlIpv6StringToAddress RtlIpv6StringToAddressA
1467 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExA
1468 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExA
1469 #endif
1470
1471 #endif /* __WS2IPDEF__ */
1472
1473 #ifdef _WS2DEF_
1474
1475 union _DL_EUI48;
1476 typedef union _DL_EUI48 DL_EUI48, *PDL_EUI48;
1477
1478 NTSYSAPI
1479 PSTR
1480 NTAPI
1481 RtlEthernetAddressToStringA(
1482 _In_ const DL_EUI48 *Addr,
1483 _Out_writes_(18) PSTR S);
1484
1485 NTSYSAPI
1486 PWSTR
1487 NTAPI
1488 RtlEthernetAddressToStringW(
1489 _In_ const DL_EUI48 *Addr,
1490 _Out_writes_(18) PWSTR S);
1491
1492 NTSYSAPI
1493 LONG
1494 NTAPI
1495 RtlEthernetStringToAddressA(
1496 _In_ PCSTR S,
1497 _Out_ PCSTR *Terminator,
1498 _Out_ DL_EUI48 *Addr);
1499
1500 NTSYSAPI
1501 LONG
1502 NTAPI
1503 RtlEthernetStringToAddressW(
1504 _In_ PCWSTR S,
1505 _Out_ LPCWSTR *Terminator,
1506 _Out_ DL_EUI48 *Addr);
1507
1508 #ifdef UNICODE
1509 #define RtlEthernetAddressToString RtlEthernetAddressToStringW
1510 #define RtlEthernetStringToAddress RtlEthernetStringToAddressW
1511 #else
1512 #define RtlEthernetAddressToString RtlEthernetAddressToStringA
1513 #define RtlEthernetStringToAddress RtlEthernetStringToAddressA
1514 #endif
1515
1516 #endif /* _WS2DEF_ */
1517
1518 #endif /* (NTDDI >= NTDDI_VISTA) */
1519
1520 #endif /* __IP2STRING__ */
1521
1522 #ifdef __cplusplus
1523 }
1524 #endif