[PSDK]
[reactos.git] / reactos / 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 extern 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 IN 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 IN OUT 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 IN OUT 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 IN OUT 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 IN OUT 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 OUT 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 OUT 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(IN CONST SOCKADDR *a)
1160 {
1161 if (a->sa_family == AF_INET6) {
1162 return IN6ADDR_ISV4MAPPED((CONST SOCKADDR_IN6*)a);
1163 } else {
1164 return FALSE;
1165 }
1166 }
1167
1168 MSTCPIP_INLINE
1169 BOOLEAN
1170 NL_ADDR_EQUAL(
1171 IN ADDRESS_FAMILY af,
1172 IN SCOPE_ID sa,
1173 IN CONST UCHAR* aa,
1174 IN SCOPE_ID sb,
1175 IN CONST UCHAR* ab)
1176 {
1177 return (BOOLEAN)((sa.Value == sb.Value) && INET_ADDR_EQUAL(af, aa, ab));
1178 }
1179
1180 MSTCPIP_INLINE
1181 BOOLEAN
1182 NL_IS_ADDR_UNSPECIFIED(
1183 IN ADDRESS_FAMILY af,
1184 IN SCOPE_ID s,
1185 IN CONST UCHAR* a)
1186 {
1187 return (BOOLEAN)((s.Value == 0) && INET_IS_ADDR_UNSPECIFIED(af, a));
1188 }
1189
1190 MSTCPIP_INLINE
1191 BOOLEAN
1192 INETADDR_ISEQUAL(
1193 IN CONST SOCKADDR *a,
1194 IN CONST SOCKADDR *b)
1195 {
1196 if (a->sa_family == AF_INET6) {
1197 return (BOOLEAN) (b->sa_family == AF_INET6 &&
1198 IN6ADDR_ISEQUAL((CONST SOCKADDR_IN6*)a, (CONST SOCKADDR_IN6*)b));
1199 } else {
1200 ASSERT(a->sa_family == AF_INET);
1201 return (BOOLEAN) (b->sa_family == AF_INET &&
1202 IN4ADDR_ISEQUAL((CONST SOCKADDR_IN*)a, (CONST SOCKADDR_IN*)b));
1203 }
1204 }
1205
1206 MSTCPIP_INLINE
1207 BOOLEAN
1208 INETADDR_ISUNSPECIFIED(
1209 IN CONST SOCKADDR *a)
1210 {
1211 if (a->sa_family == AF_INET6) {
1212 return IN6ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN6*)a);
1213 } else {
1214 ASSERT(a->sa_family == AF_INET);
1215 return IN4ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN*)a);
1216 }
1217 }
1218
1219 #if (NTDDI_VERSION >= NTDDI_VISTA)
1220 MSTCPIP_INLINE
1221 SCOPE_ID
1222 INETADDR_SCOPE_ID(
1223 IN CONST SOCKADDR *a)
1224 {
1225 if (a->sa_family == AF_INET6) {
1226 return ((CONST SOCKADDR_IN6*)a)->sin6_scope_struct;
1227 } else {
1228 ASSERT(a->sa_family == AF_INET);
1229 return IN4ADDR_SCOPE_ID((CONST SOCKADDR_IN*)a);
1230 }
1231 }
1232 #endif
1233
1234 MSTCPIP_INLINE
1235 USHORT
1236 INETADDR_PORT(
1237 IN CONST SOCKADDR *a)
1238 {
1239 if (a->sa_family == AF_INET6) {
1240 return ((CONST SOCKADDR_IN6*)a)->sin6_port;
1241 } else {
1242 ASSERT(a->sa_family == AF_INET);
1243 return ((CONST SOCKADDR_IN*)a)->sin_port;
1244 }
1245 }
1246
1247 MSTCPIP_INLINE
1248 PUCHAR
1249 INETADDR_ADDRESS(
1250 IN CONST SOCKADDR* a)
1251 {
1252 if (a->sa_family == AF_INET6) {
1253 return (PUCHAR)&((PSOCKADDR_IN6)a)->sin6_addr;
1254 } else {
1255 ASSERT(a->sa_family == AF_INET);
1256 return (PUCHAR)&((PSOCKADDR_IN)a)->sin_addr;
1257 }
1258 }
1259
1260 MSTCPIP_INLINE
1261 VOID
1262 INETADDR_SET_PORT(
1263 IN OUT PSOCKADDR a,
1264 IN USHORT Port)
1265 {
1266 SS_PORT(a) = Port;
1267 }
1268
1269 MSTCPIP_INLINE
1270 VOID
1271 INETADDR_SET_ADDRESS(
1272 IN OUT PSOCKADDR a,
1273 IN CONST UCHAR *Address)
1274 {
1275 if (a->sa_family == AF_INET6) {
1276 ((PSOCKADDR_IN6)a)->sin6_addr = *((CONST IN6_ADDR*)Address);
1277 } else {
1278 ASSERT(a->sa_family == AF_INET);
1279 ((PSOCKADDR_IN)a)->sin_addr = *((CONST IN_ADDR*)Address);
1280 }
1281 }
1282
1283 MSTCPIP_INLINE
1284 VOID
1285 INET_UNCANONICALIZE_SCOPE_ID(
1286 IN ADDRESS_FAMILY AddressFamily,
1287 IN CONST UCHAR *Address,
1288 IN OUT SCOPE_ID *ScopeId)
1289 {
1290 if (AddressFamily == AF_INET6) {
1291 IN6_UNCANONICALIZE_SCOPE_ID((CONST IN6_ADDR*) Address, ScopeId);
1292 } else {
1293 IN4_UNCANONICALIZE_SCOPE_ID((CONST IN_ADDR*) Address, ScopeId);
1294 }
1295 }
1296
1297 #endif /* _WS2IPDEF_ */
1298
1299 #ifndef __IP2STRING__
1300 #define __IP2STRING__
1301
1302 #if (NTDDI_VERSION >= NTDDI_VISTA)
1303
1304 #ifdef _WS2DEF_
1305
1306 NTSYSAPI
1307 PSTR
1308 NTAPI
1309 RtlIpv4AddressToStringA(
1310 IN const struct in_addr *Addr,
1311 OUT PSTR S);
1312
1313 NTSYSAPI
1314 LONG
1315 NTAPI
1316 RtlIpv4AddressToStringExA(
1317 IN const struct in_addr *Address,
1318 IN USHORT Port,
1319 OUT PSTR AddressString,
1320 IN OUT PULONG AddressStringLength);
1321
1322 NTSYSAPI
1323 PWSTR
1324 NTAPI
1325 RtlIpv4AddressToStringW(
1326 IN const struct in_addr *Addr,
1327 OUT PWSTR S);
1328
1329 NTSYSAPI
1330 LONG
1331 NTAPI
1332 RtlIpv4AddressToStringExW(
1333 IN const struct in_addr *Address,
1334 IN USHORT Port,
1335 OUT PWSTR AddressString,
1336 IN OUT PULONG AddressStringLength);
1337
1338 NTSYSAPI
1339 LONG
1340 NTAPI
1341 RtlIpv4StringToAddressA(
1342 IN PCSTR S,
1343 IN BOOLEAN Strict,
1344 OUT PCSTR *Terminator,
1345 OUT struct in_addr *Addr);
1346
1347 NTSYSAPI
1348 LONG
1349 NTAPI
1350 RtlIpv4StringToAddressExA(
1351 IN PCSTR AddressString,
1352 IN BOOLEAN Strict,
1353 OUT struct in_addr *Address,
1354 OUT PUSHORT Port);
1355
1356 NTSYSAPI
1357 LONG
1358 NTAPI
1359 RtlIpv4StringToAddressW(
1360 IN PCWSTR S,
1361 IN BOOLEAN Strict,
1362 OUT LPCWSTR *Terminator,
1363 OUT struct in_addr *Addr);
1364
1365 NTSYSAPI
1366 LONG
1367 NTAPI
1368 RtlIpv4StringToAddressExW(
1369 IN PCWSTR AddressString,
1370 IN BOOLEAN Strict,
1371 OUT struct in_addr *Address,
1372 OUT PUSHORT Port);
1373
1374 #ifdef UNICODE
1375 #define RtlIpv4AddressToString RtlIpv4AddressToStringW
1376 #define RtlIpv4StringToAddress RtlIpv4StringToAddressW
1377 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExW
1378 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExW
1379 #else
1380 #define RtlIpv4AddressToString RtlIpv4AddressToStringA
1381 #define RtlIpv4StringToAddress RtlIpv4StringToAddressA
1382 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExA
1383 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExA
1384 #endif
1385
1386 #endif /* _WS2DEF_ */
1387
1388 #ifdef _WS2IPDEF_
1389
1390 NTSYSAPI
1391 PSTR
1392 NTAPI
1393 RtlIpv6AddressToStringA(
1394 IN const struct in6_addr *Addr,
1395 OUT PSTR S);
1396
1397 NTSYSAPI
1398 LONG
1399 NTAPI
1400 RtlIpv6AddressToStringExA(
1401 IN const struct in6_addr *Address,
1402 IN ULONG ScopeId,
1403 IN USHORT Port,
1404 OUT PSTR AddressString,
1405 IN OUT PULONG AddressStringLength);
1406
1407 NTSYSAPI
1408 PWSTR
1409 NTAPI
1410 RtlIpv6AddressToStringW(
1411 IN const struct in6_addr *Addr,
1412 OUT PWSTR S);
1413
1414 NTSYSAPI
1415 LONG
1416 NTAPI
1417 RtlIpv6AddressToStringExW(
1418 IN const struct in6_addr *Address,
1419 IN ULONG ScopeId,
1420 IN USHORT Port,
1421 OUT PWSTR AddressString,
1422 IN OUT PULONG AddressStringLength);
1423
1424 NTSYSAPI
1425 LONG
1426 NTAPI
1427 RtlIpv6StringToAddressA(
1428 IN PCSTR S,
1429 OUT PCSTR *Terminator,
1430 OUT struct in6_addr *Addr);
1431
1432 NTSYSAPI
1433 LONG
1434 NTAPI
1435 RtlIpv6StringToAddressExA(
1436 IN PCSTR AddressString,
1437 OUT struct in6_addr *Address,
1438 OUT PULONG ScopeId,
1439 OUT PUSHORT Port);
1440
1441 NTSYSAPI
1442 LONG
1443 NTAPI
1444 RtlIpv6StringToAddressW(
1445 IN PCWSTR S,
1446 OUT PCWSTR *Terminator,
1447 OUT struct in6_addr *Addr);
1448
1449 NTSYSAPI
1450 LONG
1451 NTAPI
1452 RtlIpv6StringToAddressExW(
1453 IN PCWSTR AddressString,
1454 OUT struct in6_addr *Address,
1455 OUT PULONG ScopeId,
1456 OUT PUSHORT Port);
1457
1458 #ifdef UNICODE
1459 #define RtlIpv6AddressToString RtlIpv6AddressToStringW
1460 #define RtlIpv6StringToAddress RtlIpv6StringToAddressW
1461 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExW
1462 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExW
1463 #else
1464 #define RtlIpv6AddressToString RtlIpv6AddressToStringA
1465 #define RtlIpv6StringToAddress RtlIpv6StringToAddressA
1466 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExA
1467 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExA
1468 #endif
1469
1470 #endif /* __WS2IPDEF__ */
1471
1472 #ifdef _WS2DEF_
1473
1474 union _DL_EUI48;
1475 typedef union _DL_EUI48 DL_EUI48, *PDL_EUI48;
1476
1477 NTSYSAPI
1478 PSTR
1479 NTAPI
1480 RtlEthernetAddressToStringA(
1481 IN const DL_EUI48 *Addr,
1482 OUT PSTR S);
1483
1484 NTSYSAPI
1485 PWSTR
1486 NTAPI
1487 RtlEthernetAddressToStringW(
1488 IN const DL_EUI48 *Addr,
1489 OUT PWSTR S);
1490
1491 NTSYSAPI
1492 LONG
1493 NTAPI
1494 RtlEthernetStringToAddressA(
1495 IN PCSTR S,
1496 OUT PCSTR *Terminator,
1497 OUT DL_EUI48 *Addr);
1498
1499 NTSYSAPI
1500 LONG
1501 NTAPI
1502 RtlEthernetStringToAddressW(
1503 IN PCWSTR S,
1504 OUT LPCWSTR *Terminator,
1505 OUT DL_EUI48 *Addr);
1506
1507 #ifdef UNICODE
1508 #define RtlEthernetAddressToString RtlEthernetAddressToStringW
1509 #define RtlEthernetStringToAddress RtlEthernetStringToAddressW
1510 #else
1511 #define RtlEthernetAddressToString RtlEthernetAddressToStringA
1512 #define RtlEthernetStringToAddress RtlEthernetStringToAddressA
1513 #endif
1514
1515 #endif /* _WS2DEF_ */
1516
1517 #endif /* (NTDDI >= NTDDI_VISTA) */
1518
1519 #endif /* __IP2STRING__ */
1520
1521 #ifdef __cplusplus
1522 }
1523 #endif