8 #define MSTCPIP_ASSERT_UNDEFINED
9 #define ASSERT(exp) ((VOID) 0)
13 #define MSTCPIP_INLINE __inline
15 #define MSTCPIP_INLINE extern inline
20 struct tcp_keepalive
{
23 ULONG keepaliveinterval
;
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)
43 RCVALL_SOCKETLEVELONLY
= 2,
45 } RCVALL_VALUE
, *PRCVALL_VALUE
;
47 #define RCVALL_MAX RCVALL_IPLEVEL
52 } RCVALL_IF
, *PRCVALL_IF
;
54 #if (NTDDI_VERSION >= NTDDI_WIN7)
55 DEFINE_GUID(SOCKET_DEFAULT2_QM_POLICY
, 0xaec2ef9c, 0x3a4d, 0x4d3e, 0x88, 0x42, 0x23, 0x99, 0x42, 0xe3, 0x9a, 0x47);
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)
62 typedef struct _INET_PORT_RANGE
{
65 } INET_PORT_RANGE
, *PINET_PORT_RANGE
;
66 typedef struct _INET_PORT_RANGE INET_PORT_RESERVATION
, *PINET_PORT_RESERVATION
;
70 } INET_PORT_RESERVATION_TOKEN
, *PINET_PORT_RESERVATION_TOKEN
;
72 #define INVALID_PORT_RESERVATION_TOKEN ((ULONG64)0)
76 INET_PORT_RESERVATION Reservation
;
77 INET_PORT_RESERVATION_TOKEN Token
;
79 INET_PORT_RESERVATION
;
80 INET_PORT_RESERVATION_TOKEN
;
82 } INET_PORT_RESERVATION_INSTANCE
, *PINET_PORT_RESERVATION_INSTANCE
;
85 ULONG AssignmentCount
;
87 } INET_PORT_RESERVATION_INFORMATION
, *PINET_PORT_RESERVATION_INFORMATION
;
91 #if (NTDDI_VERSION >= NTDDI_VISTA)
93 #define _SECURE_SOCKET_TYPES_DEFINED_
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)
100 #define SIO_SOCKET_USAGE_NOTIFICATION _WSAIOW(IOC_VENDOR, 204)
102 typedef enum _SOCKET_USAGE_TYPE
{
103 SYSTEM_CRITICAL_SOCKET
= 1
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
,
112 SOCKET_SECURITY_PROTOCOL_INVALID
113 } SOCKET_SECURITY_PROTOCOL
;
115 #define SOCKET_SETTINGS_GUARANTEE_ENCRYPTION 0x1
116 #define SOCKET_SETTINGS_ALLOW_INSECURE 0x2
118 typedef struct _SOCKET_SECURITY_SETTINGS
{
119 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
121 } SOCKET_SECURITY_SETTINGS
;
123 #define SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION 0x1
125 #if (NTDDI_VERSION >= NTDDI_WIN7)
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
131 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
133 typedef struct _SOCKET_SECURITY_SETTINGS_IPSEC
{
134 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
137 GUID AuthipMMPolicyKey
;
138 GUID AuthipQMPolicyKey
;
141 ULONG UserNameStringLen
;
142 ULONG DomainNameStringLen
;
143 ULONG PasswordStringLen
;
144 wchar_t AllStrings
[0];
145 } SOCKET_SECURITY_SETTINGS_IPSEC
;
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
;
154 typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE
{
155 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
156 SOCKADDR_STORAGE PeerAddress
;
157 ULONG PeerTokenAccessMask
;
158 } SOCKET_SECURITY_QUERY_TEMPLATE
;
160 #if (NTDDI_VERSION >= NTDDI_WIN7)
162 #define SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE 0x1
164 #define SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID 0x1
165 #define SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID 0x2
167 typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2
{
168 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
169 SOCKADDR_STORAGE PeerAddress
;
170 ULONG PeerTokenAccessMask
;
173 } SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2
;
175 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
177 #define SOCKET_INFO_CONNECTION_SECURED 0x1
178 #define SOCKET_INFO_CONNECTION_ENCRYPTED 0x2
179 #define SOCKET_INFO_CONNECTION_IMPERSONATED 0x4
181 typedef struct _SOCKET_SECURITY_QUERY_INFO
{
182 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
184 UINT64 PeerApplicationAccessTokenHandle
;
185 UINT64 PeerMachineAccessTokenHandle
;
186 } SOCKET_SECURITY_QUERY_INFO
;
188 #if (NTDDI_VERSION >= NTDDI_WIN7)
189 typedef struct _SOCKET_SECURITY_QUERY_INFO_IPSEC2
{
190 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
192 UINT64 PeerApplicationAccessTokenHandle
;
193 UINT64 PeerMachineAccessTokenHandle
;
196 UINT32 NegotiationWinerr
;
197 GUID SaLookupContext
;
198 } SOCKET_SECURITY_QUERY_INFO_IPSEC2
;
201 #define SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE _WSAIOR(IOC_VENDOR, 205)
202 #define SIO_QUERY_RSS_SCALABILITY_INFO _WSAIOR(IOC_VENDOR, 210)
204 typedef struct _RSS_SCALABILITY_INFO
{
206 } RSS_SCALABILITY_INFO
, *PRSS_SCALABILITY_INFO
;
208 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
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)
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, }
230 #define IN4ADDR_LOOPBACKPREFIX_LENGTH 8
231 #define IN4ADDR_LINKLOCALPREFIX_LENGTH 16
232 #define IN4ADDR_MULTICASTPREFIX_LENGTH 4
234 #if (NTDDI_VERSION >= NTDDI_WIN2KSP1)
242 return (BOOLEAN
)(a
->s_addr
== b
->s_addr
);
247 IN4_UNALIGNED_ADDR_EQUAL(
248 IN CONST IN_ADDR UNALIGNED
*a
,
249 IN CONST IN_ADDR UNALIGNED
*b
)
251 return (BOOLEAN
)(a
->s_addr
== b
->s_addr
);
256 IN4_IS_ADDR_UNSPECIFIED(
259 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_ANY
);
264 IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(
265 IN CONST IN_ADDR UNALIGNED
*a
)
267 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_ANY
);
272 IN4_IS_ADDR_LOOPBACK(
275 return (BOOLEAN
)(*((PUCHAR
) a
) == 0x7f);
280 IN4_IS_UNALIGNED_ADDR_LOOPBACK(
281 IN CONST IN_ADDR UNALIGNED
*a
)
283 return (BOOLEAN
)(*((PUCHAR
) a
) == 0x7f);
288 IN4_IS_ADDR_BROADCAST(
291 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_BROADCAST
);
296 IN4_IS_UNALIGNED_ADDR_BROADCAST(
297 IN CONST IN_ADDR UNALIGNED
*a
)
299 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_BROADCAST
);
304 IN4_IS_ADDR_MULTICAST(
307 return (BOOLEAN
)IN4_MULTICAST(a
->s_addr
);
312 IN4_IS_UNALIGNED_ADDR_MULTICAST(
313 IN CONST IN_ADDR UNALIGNED
*a
)
315 return (BOOLEAN
)IN4_MULTICAST(a
->s_addr
);
320 IN4_IS_ADDR_LINKLOCAL(
323 return (BOOLEAN
)((a
->s_addr
& 0xffff) == 0xfea9);
328 IN4_IS_UNALIGNED_ADDR_LINKLOCAL(
329 IN CONST IN_ADDR UNALIGNED
*a
)
331 return (BOOLEAN
)((a
->s_addr
& 0xffff) == 0xfea9); // 169.254/16
336 IN4_IS_ADDR_SITELOCAL(
339 UNREFERENCED_PARAMETER(a
);
342 #define IN4_IS_UNALIGNED_ADDR_SITELOCAL IN4_IS_ADDR_SITELOCAL
349 return (BOOLEAN
)(((a
->s_addr
& 0x00ff) == 0x0a) ||
350 ((a
->s_addr
& 0xf0ff) == 0x10ac) ||
351 ((a
->s_addr
& 0xffff) == 0xa8c0));
356 IN4_IS_UNALIGNED_ADDR_RFC1918(
357 IN CONST IN_ADDR UNALIGNED
*a
)
359 IN_ADDR Ipv4Address
= *a
;
360 return IN4_IS_ADDR_RFC1918(&Ipv4Address
);
365 IN4_IS_ADDR_MC_LINKLOCAL(
368 return (BOOLEAN
)((a
->s_addr
& 0xffffff) == 0xe0);
373 IN4_IS_ADDR_MC_ADMINLOCAL(
376 return (BOOLEAN
)((a
->s_addr
& 0xffff) == 0xffef);
381 IN4_IS_ADDR_MC_SITELOCAL(
384 return (BOOLEAN
)((a
->s_addr
& 0xff) == 0xef) &&
385 !IN4_IS_ADDR_MC_ADMINLOCAL(a
);
392 IN CONST IN_ADDR
*addr
,
395 a
->sin_family
= AF_INET
;
398 memset(a
->sin_zero
, 0, sizeof(a
->sin_zero
));
406 a
->sin_family
= AF_INET
;
408 a
->sin_addr
.s_addr
= IN4ADDR_ANY
;
409 memset(a
->sin_zero
, 0, sizeof(a
->sin_zero
));
417 a
->sin_family
= AF_INET
;
419 a
->sin_addr
.s_addr
= IN4ADDR_LOOPBACK
;
420 memset(a
->sin_zero
, 0, sizeof(a
->sin_zero
));
426 IN CONST SOCKADDR_IN
*a
)
428 ASSERT(a
->sin_family
== AF_INET
);
429 return IN4_IS_ADDR_UNSPECIFIED(&a
->sin_addr
);
435 IN CONST SOCKADDR_IN
*a
)
437 ASSERT(a
->sin_family
== AF_INET
);
438 return IN4_IS_ADDR_LOOPBACK(&a
->sin_addr
);
444 IN CONST SOCKADDR_IN
*a
)
446 SCOPE_ID UnspecifiedScopeId
= {{{0}}};
447 UNREFERENCED_PARAMETER(a
);
448 return UnspecifiedScopeId
;
454 IN CONST SOCKADDR_IN
*a
,
455 IN CONST SOCKADDR_IN
*b
)
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
));
464 IN4ADDR_ISUNSPECIFIED(
465 IN CONST SOCKADDR_IN
*a
)
467 ASSERT(a
->sin_family
== AF_INET
);
468 return (BOOLEAN
)(IN4ADDR_SCOPE_ID(a
).Value
== 0 &&
469 IN4_IS_ADDR_UNSPECIFIED(&a
->sin_addr
));
472 #define INET_IS_ALIGNED(Pointer, Type) \
473 (((ULONG_PTR)Pointer & (TYPE_ALIGNMENT(Type)-1)) == 0)
477 Ipv4UnicastAddressScope(
478 IN CONST UCHAR
*Address
)
482 if (!INET_IS_ALIGNED(Address
, IN_ADDR
)) {
483 Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*)Address
;
484 Address
= (CONST UCHAR
*) &Ipv4Address
;
486 if (IN4_IS_ADDR_LINKLOCAL((PIN_ADDR
) Address
) ||
487 IN4_IS_ADDR_LOOPBACK((PIN_ADDR
) Address
)) {
488 return ScopeLevelLink
;
490 return ScopeLevelGlobal
;
495 Ipv4MulticastAddressScope(
496 IN CONST UCHAR
*Address
)
500 if (!INET_IS_ALIGNED(Address
, IN_ADDR
)) {
501 Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*)Address
;
502 Address
= (CONST UCHAR
*) &Ipv4Address
;
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
;
511 return ScopeLevelGlobal
;
518 IN CONST UCHAR
*Address
)
520 IN CONST IN_ADDR Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*)Address
;
522 if (IN4_IS_ADDR_BROADCAST(&Ipv4Address
)) {
523 return ScopeLevelLink
;
524 } else if (IN4_IS_ADDR_MULTICAST(&Ipv4Address
)) {
525 return Ipv4MulticastAddressScope((UCHAR
*) &Ipv4Address
);
527 return Ipv4UnicastAddressScope((UCHAR
*) &Ipv4Address
);
534 IN CONST UCHAR
*Address
)
536 IN_ADDR Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*) Address
;
538 if (IN4_IS_ADDR_MULTICAST(&Ipv4Address
)) {
539 return NlatMulticast
;
541 if (IN4_IS_ADDR_BROADCAST(&Ipv4Address
)) {
542 return NlatBroadcast
;
544 if (IN4_IS_ADDR_UNSPECIFIED(&Ipv4Address
)) {
545 return NlatUnspecified
;
547 if (((Ipv4Address
.s_addr
& 0x000000ff) == 0) ||
548 ((Ipv4Address
.s_addr
& 0x000000f0) == 240)) {
556 IN4_UNCANONICALIZE_SCOPE_ID(
557 IN CONST IN_ADDR
*Address
,
558 IN OUT SCOPE_ID
*ScopeId
)
560 SCOPE_LEVEL ScopeLevel
= Ipv4AddressScope((CONST UCHAR
*)Address
);
562 if ((IN4_IS_ADDR_LOOPBACK(Address
)) || (ScopeLevel
== ScopeLevelGlobal
)) {
565 if ((SCOPE_LEVEL
)ScopeId
->Level
== ScopeLevel
) {
572 IN4_IS_ADDR_6TO4ELIGIBLE(
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
)));
584 IN4_IS_UNALIGNED_ADDR_6TO4ELIGIBLE(
585 IN CONST IN_ADDR UNALIGNED
*a
)
587 IN_ADDR Ipv4Address
= *a
;
588 return IN4_IS_ADDR_6TO4ELIGIBLE(&Ipv4Address
);
591 #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP1) */
593 #endif /* _WS2DEF_ */
600 IN CONST IN6_ADDR
*a
,
601 IN CONST IN6_ADDR
*b
,
604 UINT8 Bytes
= len
/ 8;
605 UINT8 Bits
= len
% 8;
606 UINT8 Mask
= 0xff << (8 - Bits
);
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
))));
615 IN6_IS_ADDR_ALLNODESONNODE(
616 IN CONST IN6_ADDR
*a
)
618 return IN6_ADDR_EQUAL(a
, &in6addr_allnodesonnode
);
623 IN6_IS_ADDR_ALLNODESONLINK(
624 IN CONST IN6_ADDR
*a
)
626 return IN6_ADDR_EQUAL(a
, &in6addr_allnodesonlink
);
631 IN6_IS_ADDR_ALLROUTERSONLINK(
632 IN CONST IN6_ADDR
*a
)
634 return IN6_ADDR_EQUAL(a
, &in6addr_allroutersonlink
);
639 IN6_IS_ADDR_SOLICITEDNODE(
640 IN CONST IN6_ADDR
*a
)
642 return IN6_PREFIX_EQUAL(a
, &in6addr_solicitednodemulticastprefix
,
643 IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH
);
649 IN CONST IN6_ADDR
*a
)
651 return (BOOLEAN
)(((a
->s6_words
[4] & 0xfffd) == 0x0000) &&
652 (a
->s6_words
[5] == 0xfe5e));
658 IN CONST IN6_ADDR
*a
)
660 C_ASSERT(IN6ADDR_6TO4PREFIX_LENGTH
== RTL_BITS_OF(USHORT
));
661 return (BOOLEAN
)(a
->s6_words
[0] == in6addr_6to4prefix
.s6_words
[0]);
667 IN CONST IN6_ADDR
*a
)
669 C_ASSERT(IN6ADDR_TEREDOPREFIX_LENGTH
== 2 * RTL_BITS_OF(USHORT
));
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])));
680 IN CONST SOCKADDR_IN6
*a
)
682 ASSERT(a
->sin6_family
== AF_INET6
);
683 return IN6_IS_ADDR_V4MAPPED(&a
->sin6_addr
);
689 IN CONST SOCKADDR_IN6
*a
)
691 ASSERT(a
->sin6_family
== AF_INET6
);
692 return IN6_IS_ADDR_ISATAP(&a
->sin6_addr
);
698 IN CONST SOCKADDR_IN6
*a
)
700 ASSERT(a
->sin6_family
== AF_INET6
);
701 return IN6_IS_ADDR_6TO4(&a
->sin6_addr
);
707 IN CONST SOCKADDR_IN6
*a
)
709 ASSERT(a
->sin6_family
== AF_INET6
);
710 return IN6_IS_ADDR_TEREDO(&a
->sin6_addr
);
715 IN6_GET_ADDR_V4MAPPED(
716 IN CONST IN6_ADDR
*Ipv6Address
)
718 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 6);
723 IN6_GET_ADDR_V4COMPAT(
724 IN CONST IN6_ADDR
*Ipv6Address
)
726 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 6);
731 IN6_EXTRACT_V4ADDR_FROM_ISATAP(
732 IN CONST IN6_ADDR
*Ipv6Address
)
734 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 6);
739 IN6_EXTRACT_V4ADDR_FROM_6TO4(
740 IN CONST IN6_ADDR
*Ipv6Address
)
742 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 1);
747 IN6_SET_ADDR_V4MAPPED(
749 IN CONST IN_ADDR
* a4
)
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];
760 IN6_SET_ADDR_V4COMPAT(
762 IN CONST IN_ADDR
* a4
)
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];
773 IN6_SET_ADDR_SOLICITEDNODE(
774 OUT PIN6_ADDR Multicast
,
775 IN CONST IN6_ADDR
*Unicast
)
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];
785 IN6_SET_ISATAP_IDENTIFIER(
786 IN OUT IN6_ADDR
*Ipv6Address
,
787 IN CONST IN_ADDR
*Ipv4Address
)
789 if (IN4_IS_ADDR_6TO4ELIGIBLE(Ipv4Address
)) {
790 Ipv6Address
->s6_words
[4] = 0x0002;
792 Ipv6Address
->s6_words
[4] = 0x0000;
794 Ipv6Address
->s6_words
[5] = 0xFE5E;
795 *((UNALIGNED IN_ADDR
*) (Ipv6Address
->s6_words
+ 6)) = *Ipv4Address
;
801 IN OUT IN6_ADDR
*Ipv6Address
,
802 IN CONST IN_ADDR
*Ipv4Address
)
804 Ipv6Address
->s6_words
[0] = 0x0220;
805 *((UNALIGNED IN_ADDR
*) (Ipv6Address
->s6_words
+ 1)) = *Ipv4Address
;
806 Ipv6Address
->s6_words
[3] = 0x0000;
811 Ipv6UnicastAddressScope(
812 IN CONST UCHAR
*Address
)
814 IN6_ADDR Ipv6Address
;
816 if (!INET_IS_ALIGNED(Address
, IN6_ADDR
)) {
817 Ipv6Address
= *(CONST IN6_ADDR UNALIGNED
*)Address
;
818 Address
= (CONST UCHAR
*) &Ipv6Address
;
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
;
826 return ScopeLevelGlobal
;
833 IN CONST UCHAR
*Address
)
835 PIN6_ADDR Ipv6Address
= (PIN6_ADDR
) Address
;
836 return (SCOPE_LEVEL
)(Ipv6Address
->s6_bytes
[1] & 0xf);
842 IN CONST UCHAR
*Address
)
844 if (IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR
*) Address
)) {
845 return IN6_MULTICAST_SCOPE(Address
);
847 return Ipv6UnicastAddressScope(Address
);
854 IN CONST UCHAR
*Address
)
856 CONST IN6_ADDR
*Ipv6Address
= (CONST IN6_ADDR
*) Address
;
857 CONST UCHAR
*Ipv4Address
;
859 if (IN6_IS_ADDR_MULTICAST(Ipv6Address
)) {
860 return NlatMulticast
;
862 if (IN6_IS_ADDR_UNSPECIFIED(Ipv6Address
)) {
863 return NlatUnspecified
;
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
);
873 if (Ipv4AddressType(Ipv4Address
) != NlatUnicast
) {
881 IN6_UNCANONICALIZE_SCOPE_ID(
882 IN CONST IN6_ADDR
*Address
,
883 IN OUT SCOPE_ID
*ScopeId
)
885 SCOPE_LEVEL ScopeLevel
= Ipv6AddressScope((CONST UCHAR
*)Address
);
887 if ((IN6_IS_ADDR_LOOPBACK(Address
)) || (ScopeLevel
== ScopeLevelGlobal
)) {
890 if ((SCOPE_LEVEL
)ScopeId
->Level
== ScopeLevel
) {
895 #if (NTDDI_VERSION >= NTDDI_VISTA)
901 IN CONST IN6_ADDR
*addr
,
905 a
->sin6_family
= AF_INET6
;
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
);
916 OUT PSOCKADDR_IN6 a6
,
917 IN CONST IN_ADDR
* a4
,
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
);
929 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
934 IN ADDRESS_FAMILY af
,
938 if (af
== AF_INET6
) {
939 return IN6_ADDR_EQUAL((CONST IN6_ADDR
*)a
, (CONST IN6_ADDR
*)b
);
941 ASSERT(af
== AF_INET
);
942 return IN4_ADDR_EQUAL((CONST IN_ADDR
*)a
, (CONST IN_ADDR
*)b
);
948 INET_UNALIGNED_ADDR_EQUAL(
949 IN ADDRESS_FAMILY af
,
953 if (af
== AF_INET6
) {
954 return IN6_ADDR_EQUAL((CONST IN6_ADDR
*)a
, (CONST IN6_ADDR
*)b
);
956 ASSERT(af
== AF_INET
);
957 return IN4_UNALIGNED_ADDR_EQUAL((CONST IN_ADDR
*)a
, (CONST IN_ADDR
*)b
);
963 INET_IS_ADDR_UNSPECIFIED(
964 IN ADDRESS_FAMILY af
,
967 if (af
== AF_INET6
) {
968 return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR
*)a
);
970 ASSERT(af
== AF_INET
);
971 return IN4_IS_ADDR_UNSPECIFIED((CONST IN_ADDR
*)a
);
977 INET_IS_UNALIGNED_ADDR_UNSPECIFIED(
978 IN ADDRESS_FAMILY af
,
981 if (af
== AF_INET6
) {
982 return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR
*)a
);
984 ASSERT(af
== AF_INET
);
985 return IN4_IS_UNALIGNED_ADDR_UNSPECIFIED((CONST IN_ADDR UNALIGNED
*)a
);
991 INET_IS_ADDR_LOOPBACK(
992 IN ADDRESS_FAMILY af
,
995 if (af
== AF_INET6
) {
996 return IN6_IS_ADDR_LOOPBACK((CONST IN6_ADDR
*)a
);
998 ASSERT(af
== AF_INET
);
999 return IN4_IS_ADDR_LOOPBACK((CONST IN_ADDR
*)a
);
1005 INET_IS_ADDR_BROADCAST(
1006 IN ADDRESS_FAMILY af
,
1009 if (af
== AF_INET6
) {
1012 ASSERT(af
== AF_INET
);
1013 return IN4_IS_ADDR_BROADCAST((CONST IN_ADDR
*)a
);
1019 INET_IS_ADDR_MULTICAST(
1020 IN ADDRESS_FAMILY af
,
1023 if (af
== AF_INET6
) {
1024 return IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR
*)a
);
1026 ASSERT(af
== AF_INET
);
1027 return IN4_IS_ADDR_MULTICAST((CONST IN_ADDR
*)a
);
1033 INET_ADDR_UNSPECIFIED(
1034 IN ADDRESS_FAMILY af
)
1036 if (af
== AF_INET6
) {
1037 return (CONST UCHAR
*)&in6addr_any
;
1039 ASSERT(af
== AF_INET
);
1040 return (CONST UCHAR
*)&in4addr_any
;
1047 IN ADDRESS_FAMILY Family
,
1049 IN CONST UCHAR
*Value
)
1051 if (Family
== AF_INET6
) {
1052 *((PIN6_ADDR
)Address
) = *((PIN6_ADDR
)Value
);
1054 ASSERT(Family
== AF_INET
);
1055 *((PIN_ADDR
)Address
) = *((PIN_ADDR
)Value
);
1062 IN ADDRESS_FAMILY af
)
1064 if (af
== AF_INET6
) {
1065 return sizeof(IN6_ADDR
);
1067 ASSERT(af
== AF_INET
);
1068 return sizeof(IN_ADDR
);
1074 INET_SOCKADDR_LENGTH(
1075 IN ADDRESS_FAMILY af
)
1077 if (af
== AF_INET6
) {
1078 return sizeof(SOCKADDR_IN6
);
1080 ASSERT(af
== AF_INET
);
1081 return sizeof(SOCKADDR_IN
);
1085 #if (NTDDI_VERSION >= NTDDI_VISTA)
1088 INETADDR_SETSOCKADDR(
1089 IN ADDRESS_FAMILY af
,
1091 IN CONST VOID
* addr
,
1095 if (af
== AF_INET6
) {
1096 IN6ADDR_SETSOCKADDR((PSOCKADDR_IN6
) a
, (CONST IN6_ADDR
*) addr
, scope
, port
);
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
);
1103 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1110 if (a
->sa_family
== AF_INET6
) {
1111 IN6ADDR_SETANY((PSOCKADDR_IN6
)a
);
1113 ASSERT(a
->sa_family
== AF_INET
);
1114 IN4ADDR_SETANY((PSOCKADDR_IN
)a
);
1120 INETADDR_SETLOOPBACK(
1123 if (a
->sa_family
== AF_INET6
) {
1124 IN6ADDR_SETLOOPBACK((PSOCKADDR_IN6
)a
);
1126 ASSERT(a
->sa_family
== AF_INET
);
1127 IN4ADDR_SETLOOPBACK((PSOCKADDR_IN
)a
);
1134 IN CONST SOCKADDR
*a
)
1136 if (a
->sa_family
== AF_INET6
) {
1137 return IN6ADDR_ISANY((CONST SOCKADDR_IN6
*)a
);
1139 ASSERT(a
->sa_family
== AF_INET
);
1140 return IN4ADDR_ISANY((CONST SOCKADDR_IN
*)a
);
1146 INETADDR_ISLOOPBACK(
1147 IN CONST SOCKADDR
*a
)
1149 if (a
->sa_family
== AF_INET6
) {
1150 return IN6ADDR_ISLOOPBACK((CONST SOCKADDR_IN6
*)a
);
1152 ASSERT(a
->sa_family
== AF_INET
);
1153 return IN4ADDR_ISLOOPBACK((CONST SOCKADDR_IN
*)a
);
1159 INETADDR_ISV4MAPPED(IN CONST SOCKADDR
*a
)
1161 if (a
->sa_family
== AF_INET6
) {
1162 return IN6ADDR_ISV4MAPPED((CONST SOCKADDR_IN6
*)a
);
1171 IN ADDRESS_FAMILY af
,
1177 return (BOOLEAN
)((sa
.Value
== sb
.Value
) && INET_ADDR_EQUAL(af
, aa
, ab
));
1182 NL_IS_ADDR_UNSPECIFIED(
1183 IN ADDRESS_FAMILY af
,
1187 return (BOOLEAN
)((s
.Value
== 0) && INET_IS_ADDR_UNSPECIFIED(af
, a
));
1193 IN CONST SOCKADDR
*a
,
1194 IN CONST SOCKADDR
*b
)
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
));
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
));
1208 INETADDR_ISUNSPECIFIED(
1209 IN CONST SOCKADDR
*a
)
1211 if (a
->sa_family
== AF_INET6
) {
1212 return IN6ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN6
*)a
);
1214 ASSERT(a
->sa_family
== AF_INET
);
1215 return IN4ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN
*)a
);
1219 #if (NTDDI_VERSION >= NTDDI_VISTA)
1223 IN CONST SOCKADDR
*a
)
1225 if (a
->sa_family
== AF_INET6
) {
1226 return ((CONST SOCKADDR_IN6
*)a
)->sin6_scope_struct
;
1228 ASSERT(a
->sa_family
== AF_INET
);
1229 return IN4ADDR_SCOPE_ID((CONST SOCKADDR_IN
*)a
);
1237 IN CONST SOCKADDR
*a
)
1239 if (a
->sa_family
== AF_INET6
) {
1240 return ((CONST SOCKADDR_IN6
*)a
)->sin6_port
;
1242 ASSERT(a
->sa_family
== AF_INET
);
1243 return ((CONST SOCKADDR_IN
*)a
)->sin_port
;
1250 IN CONST SOCKADDR
* a
)
1252 if (a
->sa_family
== AF_INET6
) {
1253 return (PUCHAR
)&((PSOCKADDR_IN6
)a
)->sin6_addr
;
1255 ASSERT(a
->sa_family
== AF_INET
);
1256 return (PUCHAR
)&((PSOCKADDR_IN
)a
)->sin_addr
;
1271 INETADDR_SET_ADDRESS(
1273 IN CONST UCHAR
*Address
)
1275 if (a
->sa_family
== AF_INET6
) {
1276 ((PSOCKADDR_IN6
)a
)->sin6_addr
= *((CONST IN6_ADDR
*)Address
);
1278 ASSERT(a
->sa_family
== AF_INET
);
1279 ((PSOCKADDR_IN
)a
)->sin_addr
= *((CONST IN_ADDR
*)Address
);
1285 INET_UNCANONICALIZE_SCOPE_ID(
1286 IN ADDRESS_FAMILY AddressFamily
,
1287 IN CONST UCHAR
*Address
,
1288 IN OUT SCOPE_ID
*ScopeId
)
1290 if (AddressFamily
== AF_INET6
) {
1291 IN6_UNCANONICALIZE_SCOPE_ID((CONST IN6_ADDR
*) Address
, ScopeId
);
1293 IN4_UNCANONICALIZE_SCOPE_ID((CONST IN_ADDR
*) Address
, ScopeId
);
1297 #endif /* _WS2IPDEF_ */
1299 #ifndef __IP2STRING__
1300 #define __IP2STRING__
1302 #if (NTDDI_VERSION >= NTDDI_VISTA)
1309 RtlIpv4AddressToStringA(
1310 IN
const struct in_addr
*Addr
,
1316 RtlIpv4AddressToStringExA(
1317 IN
const struct in_addr
*Address
,
1319 OUT PSTR AddressString
,
1320 IN OUT PULONG AddressStringLength
);
1325 RtlIpv4AddressToStringW(
1326 IN
const struct in_addr
*Addr
,
1332 RtlIpv4AddressToStringExW(
1333 IN
const struct in_addr
*Address
,
1335 OUT PWSTR AddressString
,
1336 IN OUT PULONG AddressStringLength
);
1341 RtlIpv4StringToAddressA(
1344 OUT PCSTR
*Terminator
,
1345 OUT
struct in_addr
*Addr
);
1350 RtlIpv4StringToAddressExA(
1351 IN PCSTR AddressString
,
1353 OUT
struct in_addr
*Address
,
1359 RtlIpv4StringToAddressW(
1362 OUT LPCWSTR
*Terminator
,
1363 OUT
struct in_addr
*Addr
);
1368 RtlIpv4StringToAddressExW(
1369 IN PCWSTR AddressString
,
1371 OUT
struct in_addr
*Address
,
1375 #define RtlIpv4AddressToString RtlIpv4AddressToStringW
1376 #define RtlIpv4StringToAddress RtlIpv4StringToAddressW
1377 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExW
1378 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExW
1380 #define RtlIpv4AddressToString RtlIpv4AddressToStringA
1381 #define RtlIpv4StringToAddress RtlIpv4StringToAddressA
1382 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExA
1383 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExA
1386 #endif /* _WS2DEF_ */
1393 RtlIpv6AddressToStringA(
1394 IN
const struct in6_addr
*Addr
,
1400 RtlIpv6AddressToStringExA(
1401 IN
const struct in6_addr
*Address
,
1404 OUT PSTR AddressString
,
1405 IN OUT PULONG AddressStringLength
);
1410 RtlIpv6AddressToStringW(
1411 IN
const struct in6_addr
*Addr
,
1417 RtlIpv6AddressToStringExW(
1418 IN
const struct in6_addr
*Address
,
1421 OUT PWSTR AddressString
,
1422 IN OUT PULONG AddressStringLength
);
1427 RtlIpv6StringToAddressA(
1429 OUT PCSTR
*Terminator
,
1430 OUT
struct in6_addr
*Addr
);
1435 RtlIpv6StringToAddressExA(
1436 IN PCSTR AddressString
,
1437 OUT
struct in6_addr
*Address
,
1444 RtlIpv6StringToAddressW(
1446 OUT PCWSTR
*Terminator
,
1447 OUT
struct in6_addr
*Addr
);
1452 RtlIpv6StringToAddressExW(
1453 IN PCWSTR AddressString
,
1454 OUT
struct in6_addr
*Address
,
1459 #define RtlIpv6AddressToString RtlIpv6AddressToStringW
1460 #define RtlIpv6StringToAddress RtlIpv6StringToAddressW
1461 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExW
1462 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExW
1464 #define RtlIpv6AddressToString RtlIpv6AddressToStringA
1465 #define RtlIpv6StringToAddress RtlIpv6StringToAddressA
1466 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExA
1467 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExA
1470 #endif /* __WS2IPDEF__ */
1475 typedef union _DL_EUI48 DL_EUI48
, *PDL_EUI48
;
1480 RtlEthernetAddressToStringA(
1481 IN
const DL_EUI48
*Addr
,
1487 RtlEthernetAddressToStringW(
1488 IN
const DL_EUI48
*Addr
,
1494 RtlEthernetStringToAddressA(
1496 OUT PCSTR
*Terminator
,
1497 OUT DL_EUI48
*Addr
);
1502 RtlEthernetStringToAddressW(
1504 OUT LPCWSTR
*Terminator
,
1505 OUT DL_EUI48
*Addr
);
1508 #define RtlEthernetAddressToString RtlEthernetAddressToStringW
1509 #define RtlEthernetStringToAddress RtlEthernetStringToAddressW
1511 #define RtlEthernetAddressToString RtlEthernetAddressToStringA
1512 #define RtlEthernetStringToAddress RtlEthernetStringToAddressA
1515 #endif /* _WS2DEF_ */
1517 #endif /* (NTDDI >= NTDDI_VISTA) */
1519 #endif /* __IP2STRING__ */