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