8 #define MSTCPIP_ASSERT_UNDEFINED
9 #define ASSERT(exp) ((VOID) 0)
13 #define MSTCPIP_INLINE __inline
15 #define MSTCPIP_INLINE extern inline
22 struct tcp_keepalive
{
25 ULONG keepaliveinterval
;
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)
45 RCVALL_SOCKETLEVELONLY
= 2,
47 } RCVALL_VALUE
, *PRCVALL_VALUE
;
49 #define RCVALL_MAX RCVALL_IPLEVEL
54 } RCVALL_IF
, *PRCVALL_IF
;
56 #if (NTDDI_VERSION >= NTDDI_WIN7)
57 DEFINE_GUID(SOCKET_DEFAULT2_QM_POLICY
, 0xaec2ef9c, 0x3a4d, 0x4d3e, 0x88, 0x42, 0x23, 0x99, 0x42, 0xe3, 0x9a, 0x47);
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)
64 typedef struct _INET_PORT_RANGE
{
67 } INET_PORT_RANGE
, *PINET_PORT_RANGE
;
68 typedef struct _INET_PORT_RANGE INET_PORT_RESERVATION
, *PINET_PORT_RESERVATION
;
72 } INET_PORT_RESERVATION_TOKEN
, *PINET_PORT_RESERVATION_TOKEN
;
74 #define INVALID_PORT_RESERVATION_TOKEN ((ULONG64)0)
78 INET_PORT_RESERVATION Reservation
;
79 INET_PORT_RESERVATION_TOKEN Token
;
81 INET_PORT_RESERVATION
;
82 INET_PORT_RESERVATION_TOKEN
;
84 } INET_PORT_RESERVATION_INSTANCE
, *PINET_PORT_RESERVATION_INSTANCE
;
87 ULONG AssignmentCount
;
89 } INET_PORT_RESERVATION_INFORMATION
, *PINET_PORT_RESERVATION_INFORMATION
;
93 #if (NTDDI_VERSION >= NTDDI_VISTA)
95 #define _SECURE_SOCKET_TYPES_DEFINED_
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)
102 #define SIO_SOCKET_USAGE_NOTIFICATION _WSAIOW(IOC_VENDOR, 204)
104 typedef enum _SOCKET_USAGE_TYPE
{
105 SYSTEM_CRITICAL_SOCKET
= 1
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
,
114 SOCKET_SECURITY_PROTOCOL_INVALID
115 } SOCKET_SECURITY_PROTOCOL
;
117 #define SOCKET_SETTINGS_GUARANTEE_ENCRYPTION 0x1
118 #define SOCKET_SETTINGS_ALLOW_INSECURE 0x2
120 typedef struct _SOCKET_SECURITY_SETTINGS
{
121 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
123 } SOCKET_SECURITY_SETTINGS
;
125 #define SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION 0x1
127 #if (NTDDI_VERSION >= NTDDI_WIN7)
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
133 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
135 typedef struct _SOCKET_SECURITY_SETTINGS_IPSEC
{
136 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
139 GUID AuthipMMPolicyKey
;
140 GUID AuthipQMPolicyKey
;
143 ULONG UserNameStringLen
;
144 ULONG DomainNameStringLen
;
145 ULONG PasswordStringLen
;
146 wchar_t AllStrings
[0];
147 } SOCKET_SECURITY_SETTINGS_IPSEC
;
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
;
156 typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE
{
157 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
158 SOCKADDR_STORAGE PeerAddress
;
159 ULONG PeerTokenAccessMask
;
160 } SOCKET_SECURITY_QUERY_TEMPLATE
;
162 #if (NTDDI_VERSION >= NTDDI_WIN7)
164 #define SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE 0x1
166 #define SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID 0x1
167 #define SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID 0x2
169 typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2
{
170 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
171 SOCKADDR_STORAGE PeerAddress
;
172 ULONG PeerTokenAccessMask
;
175 } SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2
;
177 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
179 #define SOCKET_INFO_CONNECTION_SECURED 0x1
180 #define SOCKET_INFO_CONNECTION_ENCRYPTED 0x2
181 #define SOCKET_INFO_CONNECTION_IMPERSONATED 0x4
183 typedef struct _SOCKET_SECURITY_QUERY_INFO
{
184 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
186 UINT64 PeerApplicationAccessTokenHandle
;
187 UINT64 PeerMachineAccessTokenHandle
;
188 } SOCKET_SECURITY_QUERY_INFO
;
190 #if (NTDDI_VERSION >= NTDDI_WIN7)
191 typedef struct _SOCKET_SECURITY_QUERY_INFO_IPSEC2
{
192 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
194 UINT64 PeerApplicationAccessTokenHandle
;
195 UINT64 PeerMachineAccessTokenHandle
;
198 UINT32 NegotiationWinerr
;
199 GUID SaLookupContext
;
200 } SOCKET_SECURITY_QUERY_INFO_IPSEC2
;
203 #define SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE _WSAIOR(IOC_VENDOR, 205)
204 #define SIO_QUERY_RSS_SCALABILITY_INFO _WSAIOR(IOC_VENDOR, 210)
206 typedef struct _RSS_SCALABILITY_INFO
{
208 } RSS_SCALABILITY_INFO
, *PRSS_SCALABILITY_INFO
;
210 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
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)
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, }
232 #define IN4ADDR_LOOPBACKPREFIX_LENGTH 8
233 #define IN4ADDR_LINKLOCALPREFIX_LENGTH 16
234 #define IN4ADDR_MULTICASTPREFIX_LENGTH 4
236 #if (NTDDI_VERSION >= NTDDI_WIN2KSP1)
244 return (BOOLEAN
)(a
->s_addr
== b
->s_addr
);
249 IN4_UNALIGNED_ADDR_EQUAL(
250 IN CONST IN_ADDR UNALIGNED
*a
,
251 IN CONST IN_ADDR UNALIGNED
*b
)
253 return (BOOLEAN
)(a
->s_addr
== b
->s_addr
);
258 IN4_IS_ADDR_UNSPECIFIED(
261 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_ANY
);
266 IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(
267 IN CONST IN_ADDR UNALIGNED
*a
)
269 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_ANY
);
274 IN4_IS_ADDR_LOOPBACK(
277 return (BOOLEAN
)(*((PUCHAR
) a
) == 0x7f);
282 IN4_IS_UNALIGNED_ADDR_LOOPBACK(
283 IN CONST IN_ADDR UNALIGNED
*a
)
285 return (BOOLEAN
)(*((PUCHAR
) a
) == 0x7f);
290 IN4_IS_ADDR_BROADCAST(
293 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_BROADCAST
);
298 IN4_IS_UNALIGNED_ADDR_BROADCAST(
299 IN CONST IN_ADDR UNALIGNED
*a
)
301 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_BROADCAST
);
306 IN4_IS_ADDR_MULTICAST(
309 return (BOOLEAN
)IN4_MULTICAST(a
->s_addr
);
314 IN4_IS_UNALIGNED_ADDR_MULTICAST(
315 IN CONST IN_ADDR UNALIGNED
*a
)
317 return (BOOLEAN
)IN4_MULTICAST(a
->s_addr
);
322 IN4_IS_ADDR_LINKLOCAL(
325 return (BOOLEAN
)((a
->s_addr
& 0xffff) == 0xfea9);
330 IN4_IS_UNALIGNED_ADDR_LINKLOCAL(
331 IN CONST IN_ADDR UNALIGNED
*a
)
333 return (BOOLEAN
)((a
->s_addr
& 0xffff) == 0xfea9); // 169.254/16
338 IN4_IS_ADDR_SITELOCAL(
341 UNREFERENCED_PARAMETER(a
);
344 #define IN4_IS_UNALIGNED_ADDR_SITELOCAL IN4_IS_ADDR_SITELOCAL
351 return (BOOLEAN
)(((a
->s_addr
& 0x00ff) == 0x0a) ||
352 ((a
->s_addr
& 0xf0ff) == 0x10ac) ||
353 ((a
->s_addr
& 0xffff) == 0xa8c0));
358 IN4_IS_UNALIGNED_ADDR_RFC1918(
359 IN CONST IN_ADDR UNALIGNED
*a
)
361 IN_ADDR Ipv4Address
= *a
;
362 return IN4_IS_ADDR_RFC1918(&Ipv4Address
);
367 IN4_IS_ADDR_MC_LINKLOCAL(
370 return (BOOLEAN
)((a
->s_addr
& 0xffffff) == 0xe0);
375 IN4_IS_ADDR_MC_ADMINLOCAL(
378 return (BOOLEAN
)((a
->s_addr
& 0xffff) == 0xffef);
383 IN4_IS_ADDR_MC_SITELOCAL(
386 return (BOOLEAN
)((a
->s_addr
& 0xff) == 0xef) &&
387 !IN4_IS_ADDR_MC_ADMINLOCAL(a
);
394 IN CONST IN_ADDR
*addr
,
397 a
->sin_family
= AF_INET
;
400 memset(a
->sin_zero
, 0, sizeof(a
->sin_zero
));
408 a
->sin_family
= AF_INET
;
410 a
->sin_addr
.s_addr
= IN4ADDR_ANY
;
411 memset(a
->sin_zero
, 0, sizeof(a
->sin_zero
));
419 a
->sin_family
= AF_INET
;
421 a
->sin_addr
.s_addr
= IN4ADDR_LOOPBACK
;
422 memset(a
->sin_zero
, 0, sizeof(a
->sin_zero
));
428 IN CONST SOCKADDR_IN
*a
)
430 ASSERT(a
->sin_family
== AF_INET
);
431 return IN4_IS_ADDR_UNSPECIFIED(&a
->sin_addr
);
437 IN CONST SOCKADDR_IN
*a
)
439 ASSERT(a
->sin_family
== AF_INET
);
440 return IN4_IS_ADDR_LOOPBACK(&a
->sin_addr
);
446 IN CONST SOCKADDR_IN
*a
)
448 SCOPE_ID UnspecifiedScopeId
= {0};
449 UNREFERENCED_PARAMETER(a
);
450 return UnspecifiedScopeId
;
456 IN CONST SOCKADDR_IN
*a
,
457 IN CONST SOCKADDR_IN
*b
)
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
));
466 IN4ADDR_ISUNSPECIFIED(
467 IN CONST SOCKADDR_IN
*a
)
469 ASSERT(a
->sin_family
== AF_INET
);
470 return (BOOLEAN
)(IN4ADDR_SCOPE_ID(a
).Value
== 0 &&
471 IN4_IS_ADDR_UNSPECIFIED(&a
->sin_addr
));
474 #define INET_IS_ALIGNED(Pointer, Type) \
475 (((ULONG_PTR)Pointer & (__builtin_alignof(Type)-1)) == 0)
479 Ipv4UnicastAddressScope(
480 IN CONST UCHAR
*Address
)
484 if (!INET_IS_ALIGNED(Address
, IN_ADDR
)) {
485 Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*)Address
;
486 Address
= (CONST UCHAR
*) &Ipv4Address
;
488 if (IN4_IS_ADDR_LINKLOCAL((PIN_ADDR
) Address
) ||
489 IN4_IS_ADDR_LOOPBACK((PIN_ADDR
) Address
)) {
490 return ScopeLevelLink
;
492 return ScopeLevelGlobal
;
497 Ipv4MulticastAddressScope(
498 IN CONST UCHAR
*Address
)
502 if (!INET_IS_ALIGNED(Address
, IN_ADDR
)) {
503 Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*)Address
;
504 Address
= (CONST UCHAR
*) &Ipv4Address
;
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
;
513 return ScopeLevelGlobal
;
520 IN CONST UCHAR
*Address
)
522 IN CONST IN_ADDR Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*)Address
;
524 if (IN4_IS_ADDR_BROADCAST(&Ipv4Address
)) {
525 return ScopeLevelLink
;
526 } else if (IN4_IS_ADDR_MULTICAST(&Ipv4Address
)) {
527 return Ipv4MulticastAddressScope((UCHAR
*) &Ipv4Address
);
529 return Ipv4UnicastAddressScope((UCHAR
*) &Ipv4Address
);
536 IN CONST UCHAR
*Address
)
538 IN_ADDR Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*) Address
;
540 if (IN4_IS_ADDR_MULTICAST(&Ipv4Address
)) {
541 return NlatMulticast
;
543 if (IN4_IS_ADDR_BROADCAST(&Ipv4Address
)) {
544 return NlatBroadcast
;
546 if (IN4_IS_ADDR_UNSPECIFIED(&Ipv4Address
)) {
547 return NlatUnspecified
;
549 if (((Ipv4Address
.s_addr
& 0x000000ff) == 0) ||
550 ((Ipv4Address
.s_addr
& 0x000000f0) == 240)) {
558 IN4_UNCANONICALIZE_SCOPE_ID(
559 IN CONST IN_ADDR
*Address
,
560 IN OUT SCOPE_ID
*ScopeId
)
562 SCOPE_LEVEL ScopeLevel
= Ipv4AddressScope((CONST UCHAR
*)Address
);
564 if ((IN4_IS_ADDR_LOOPBACK(Address
)) || (ScopeLevel
== ScopeLevelGlobal
)) {
567 if ((SCOPE_LEVEL
)ScopeId
->Level
== ScopeLevel
) {
574 IN4_IS_ADDR_6TO4ELIGIBLE(
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
)));
586 IN4_IS_UNALIGNED_ADDR_6TO4ELIGIBLE(
587 IN CONST IN_ADDR UNALIGNED
*a
)
589 IN_ADDR Ipv4Address
= *a
;
590 return IN4_IS_ADDR_6TO4ELIGIBLE(&Ipv4Address
);
593 #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP1) */
595 #endif /* _WS2DEF_ */
602 IN CONST IN6_ADDR
*a
,
603 IN CONST IN6_ADDR
*b
,
606 UINT8 Bytes
= len
/ 8;
607 UINT8 Bits
= len
% 8;
608 UINT8 Mask
= 0xff << (8 - Bits
);
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
))));
617 IN6_IS_ADDR_ALLNODESONNODE(
618 IN CONST IN6_ADDR
*a
)
620 return IN6_ADDR_EQUAL(a
, &in6addr_allnodesonnode
);
625 IN6_IS_ADDR_ALLNODESONLINK(
626 IN CONST IN6_ADDR
*a
)
628 return IN6_ADDR_EQUAL(a
, &in6addr_allnodesonlink
);
633 IN6_IS_ADDR_ALLROUTERSONLINK(
634 IN CONST IN6_ADDR
*a
)
636 return IN6_ADDR_EQUAL(a
, &in6addr_allroutersonlink
);
641 IN6_IS_ADDR_SOLICITEDNODE(
642 IN CONST IN6_ADDR
*a
)
644 return IN6_PREFIX_EQUAL(a
, &in6addr_solicitednodemulticastprefix
,
645 IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH
);
651 IN CONST IN6_ADDR
*a
)
653 return (BOOLEAN
)(((a
->s6_words
[4] & 0xfffd) == 0x0000) &&
654 (a
->s6_words
[5] == 0xfe5e));
660 IN CONST IN6_ADDR
*a
)
662 C_ASSERT(IN6ADDR_6TO4PREFIX_LENGTH
== RTL_BITS_OF(USHORT
));
663 return (BOOLEAN
)(a
->s6_words
[0] == in6addr_6to4prefix
.s6_words
[0]);
669 IN CONST IN6_ADDR
*a
)
671 C_ASSERT(IN6ADDR_TEREDOPREFIX_LENGTH
== 2 * RTL_BITS_OF(USHORT
));
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])));
682 IN CONST SOCKADDR_IN6
*a
)
684 ASSERT(a
->sin6_family
== AF_INET6
);
685 return IN6_IS_ADDR_V4MAPPED(&a
->sin6_addr
);
691 IN CONST SOCKADDR_IN6
*a
)
693 ASSERT(a
->sin6_family
== AF_INET6
);
694 return IN6_IS_ADDR_ISATAP(&a
->sin6_addr
);
700 IN CONST SOCKADDR_IN6
*a
)
702 ASSERT(a
->sin6_family
== AF_INET6
);
703 return IN6_IS_ADDR_6TO4(&a
->sin6_addr
);
709 IN CONST SOCKADDR_IN6
*a
)
711 ASSERT(a
->sin6_family
== AF_INET6
);
712 return IN6_IS_ADDR_TEREDO(&a
->sin6_addr
);
717 IN6_GET_ADDR_V4MAPPED(
718 IN CONST IN6_ADDR
*Ipv6Address
)
720 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 6);
725 IN6_GET_ADDR_V4COMPAT(
726 IN CONST IN6_ADDR
*Ipv6Address
)
728 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 6);
733 IN6_EXTRACT_V4ADDR_FROM_ISATAP(
734 IN CONST IN6_ADDR
*Ipv6Address
)
736 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 6);
741 IN6_EXTRACT_V4ADDR_FROM_6TO4(
742 IN CONST IN6_ADDR
*Ipv6Address
)
744 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 1);
749 IN6_SET_ADDR_V4MAPPED(
751 IN CONST IN_ADDR
* a4
)
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];
762 IN6_SET_ADDR_V4COMPAT(
764 IN CONST IN_ADDR
* a4
)
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];
775 IN6_SET_ADDR_SOLICITEDNODE(
776 OUT PIN6_ADDR Multicast
,
777 IN CONST IN6_ADDR
*Unicast
)
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];
787 IN6_SET_ISATAP_IDENTIFIER(
788 IN OUT IN6_ADDR
*Ipv6Address
,
789 IN CONST IN_ADDR
*Ipv4Address
)
791 if (IN4_IS_ADDR_6TO4ELIGIBLE(Ipv4Address
)) {
792 Ipv6Address
->s6_words
[4] = 0x0002;
794 Ipv6Address
->s6_words
[4] = 0x0000;
796 Ipv6Address
->s6_words
[5] = 0xFE5E;
797 *((UNALIGNED IN_ADDR
*) (Ipv6Address
->s6_words
+ 6)) = *Ipv4Address
;
803 IN OUT IN6_ADDR
*Ipv6Address
,
804 IN CONST IN_ADDR
*Ipv4Address
)
806 Ipv6Address
->s6_words
[0] = 0x0220;
807 *((UNALIGNED IN_ADDR
*) (Ipv6Address
->s6_words
+ 1)) = *Ipv4Address
;
808 Ipv6Address
->s6_words
[3] = 0x0000;
813 Ipv6UnicastAddressScope(
814 IN CONST UCHAR
*Address
)
816 IN6_ADDR Ipv6Address
;
818 if (!INET_IS_ALIGNED(Address
, IN6_ADDR
)) {
819 Ipv6Address
= *(CONST IN6_ADDR UNALIGNED
*)Address
;
820 Address
= (CONST UCHAR
*) &Ipv6Address
;
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
;
828 return ScopeLevelGlobal
;
835 IN CONST UCHAR
*Address
)
837 PIN6_ADDR Ipv6Address
= (PIN6_ADDR
) Address
;
838 return (SCOPE_LEVEL
)(Ipv6Address
->s6_bytes
[1] & 0xf);
844 IN CONST UCHAR
*Address
)
846 if (IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR
*) Address
)) {
847 return IN6_MULTICAST_SCOPE(Address
);
849 return Ipv6UnicastAddressScope(Address
);
856 IN CONST UCHAR
*Address
)
858 CONST IN6_ADDR
*Ipv6Address
= (CONST IN6_ADDR
*) Address
;
859 CONST UCHAR
*Ipv4Address
;
861 if (IN6_IS_ADDR_MULTICAST(Ipv6Address
)) {
862 return NlatMulticast
;
864 if (IN6_IS_ADDR_UNSPECIFIED(Ipv6Address
)) {
865 return NlatUnspecified
;
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
);
875 if (Ipv4AddressType(Ipv4Address
) != NlatUnicast
) {
883 IN6_UNCANONICALIZE_SCOPE_ID(
884 IN CONST IN6_ADDR
*Address
,
885 IN OUT SCOPE_ID
*ScopeId
)
887 SCOPE_LEVEL ScopeLevel
= Ipv6AddressScope((CONST UCHAR
*)Address
);
889 if ((IN6_IS_ADDR_LOOPBACK(Address
)) || (ScopeLevel
== ScopeLevelGlobal
)) {
892 if ((SCOPE_LEVEL
)ScopeId
->Level
== ScopeLevel
) {
897 #if (NTDDI_VERSION >= NTDDI_VISTA)
903 IN CONST IN6_ADDR
*addr
,
907 a
->sin6_family
= AF_INET6
;
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
);
918 OUT PSOCKADDR_IN6 a6
,
919 IN CONST IN_ADDR
* a4
,
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
);
931 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
936 IN ADDRESS_FAMILY af
,
940 if (af
== AF_INET6
) {
941 return IN6_ADDR_EQUAL((CONST IN6_ADDR
*)a
, (CONST IN6_ADDR
*)b
);
943 ASSERT(af
== AF_INET
);
944 return IN4_ADDR_EQUAL((CONST IN_ADDR
*)a
, (CONST IN_ADDR
*)b
);
950 INET_UNALIGNED_ADDR_EQUAL(
951 IN ADDRESS_FAMILY af
,
955 if (af
== AF_INET6
) {
956 return IN6_ADDR_EQUAL((CONST IN6_ADDR
*)a
, (CONST IN6_ADDR
*)b
);
958 ASSERT(af
== AF_INET
);
959 return IN4_UNALIGNED_ADDR_EQUAL((CONST IN_ADDR
*)a
, (CONST IN_ADDR
*)b
);
965 INET_IS_ADDR_UNSPECIFIED(
966 IN ADDRESS_FAMILY af
,
969 if (af
== AF_INET6
) {
970 return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR
*)a
);
972 ASSERT(af
== AF_INET
);
973 return IN4_IS_ADDR_UNSPECIFIED((CONST IN_ADDR
*)a
);
979 INET_IS_UNALIGNED_ADDR_UNSPECIFIED(
980 IN ADDRESS_FAMILY af
,
983 if (af
== AF_INET6
) {
984 return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR
*)a
);
986 ASSERT(af
== AF_INET
);
987 return IN4_IS_UNALIGNED_ADDR_UNSPECIFIED((CONST IN_ADDR UNALIGNED
*)a
);
993 INET_IS_ADDR_LOOPBACK(
994 IN ADDRESS_FAMILY af
,
997 if (af
== AF_INET6
) {
998 return IN6_IS_ADDR_LOOPBACK((CONST IN6_ADDR
*)a
);
1000 ASSERT(af
== AF_INET
);
1001 return IN4_IS_ADDR_LOOPBACK((CONST IN_ADDR
*)a
);
1007 INET_IS_ADDR_BROADCAST(
1008 IN ADDRESS_FAMILY af
,
1011 if (af
== AF_INET6
) {
1014 ASSERT(af
== AF_INET
);
1015 return IN4_IS_ADDR_BROADCAST((CONST IN_ADDR
*)a
);
1021 INET_IS_ADDR_MULTICAST(
1022 IN ADDRESS_FAMILY af
,
1025 if (af
== AF_INET6
) {
1026 return IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR
*)a
);
1028 ASSERT(af
== AF_INET
);
1029 return IN4_IS_ADDR_MULTICAST((CONST IN_ADDR
*)a
);
1035 INET_ADDR_UNSPECIFIED(
1036 IN ADDRESS_FAMILY af
)
1038 if (af
== AF_INET6
) {
1039 return (CONST UCHAR
*)&in6addr_any
;
1041 ASSERT(af
== AF_INET
);
1042 return (CONST UCHAR
*)&in4addr_any
;
1049 IN ADDRESS_FAMILY Family
,
1051 IN CONST UCHAR
*Value
)
1053 if (Family
== AF_INET6
) {
1054 *((PIN6_ADDR
)Address
) = *((PIN6_ADDR
)Value
);
1056 ASSERT(Family
== AF_INET
);
1057 *((PIN_ADDR
)Address
) = *((PIN_ADDR
)Value
);
1064 IN ADDRESS_FAMILY af
)
1066 if (af
== AF_INET6
) {
1067 return sizeof(IN6_ADDR
);
1069 ASSERT(af
== AF_INET
);
1070 return sizeof(IN_ADDR
);
1076 INET_SOCKADDR_LENGTH(
1077 IN ADDRESS_FAMILY af
)
1079 if (af
== AF_INET6
) {
1080 return sizeof(SOCKADDR_IN6
);
1082 ASSERT(af
== AF_INET
);
1083 return sizeof(SOCKADDR_IN
);
1087 #if (NTDDI_VERSION >= NTDDI_VISTA)
1090 INETADDR_SETSOCKADDR(
1091 IN ADDRESS_FAMILY af
,
1093 IN CONST VOID
* addr
,
1097 if (af
== AF_INET6
) {
1098 IN6ADDR_SETSOCKADDR((PSOCKADDR_IN6
) a
, (CONST IN6_ADDR
*) addr
, scope
, port
);
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
);
1105 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1112 if (a
->sa_family
== AF_INET6
) {
1113 IN6ADDR_SETANY((PSOCKADDR_IN6
)a
);
1115 ASSERT(a
->sa_family
== AF_INET
);
1116 IN4ADDR_SETANY((PSOCKADDR_IN
)a
);
1122 INETADDR_SETLOOPBACK(
1125 if (a
->sa_family
== AF_INET6
) {
1126 IN6ADDR_SETLOOPBACK((PSOCKADDR_IN6
)a
);
1128 ASSERT(a
->sa_family
== AF_INET
);
1129 IN4ADDR_SETLOOPBACK((PSOCKADDR_IN
)a
);
1136 IN CONST SOCKADDR
*a
)
1138 if (a
->sa_family
== AF_INET6
) {
1139 return IN6ADDR_ISANY((CONST SOCKADDR_IN6
*)a
);
1141 ASSERT(a
->sa_family
== AF_INET
);
1142 return IN4ADDR_ISANY((CONST SOCKADDR_IN
*)a
);
1148 INETADDR_ISLOOPBACK(
1149 IN CONST SOCKADDR
*a
)
1151 if (a
->sa_family
== AF_INET6
) {
1152 return IN6ADDR_ISLOOPBACK((CONST SOCKADDR_IN6
*)a
);
1154 ASSERT(a
->sa_family
== AF_INET
);
1155 return IN4ADDR_ISLOOPBACK((CONST SOCKADDR_IN
*)a
);
1161 INETADDR_ISV4MAPPED(IN CONST SOCKADDR
*a
)
1163 if (a
->sa_family
== AF_INET6
) {
1164 return IN6ADDR_ISV4MAPPED((CONST SOCKADDR_IN6
*)a
);
1173 IN ADDRESS_FAMILY af
,
1179 return (BOOLEAN
)((sa
.Value
== sb
.Value
) && INET_ADDR_EQUAL(af
, aa
, ab
));
1184 NL_IS_ADDR_UNSPECIFIED(
1185 IN ADDRESS_FAMILY af
,
1189 return (BOOLEAN
)((s
.Value
== 0) && INET_IS_ADDR_UNSPECIFIED(af
, a
));
1195 IN CONST SOCKADDR
*a
,
1196 IN CONST SOCKADDR
*b
)
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
));
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
));
1210 INETADDR_ISUNSPECIFIED(
1211 IN CONST SOCKADDR
*a
)
1213 if (a
->sa_family
== AF_INET6
) {
1214 return IN6ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN6
*)a
);
1216 ASSERT(a
->sa_family
== AF_INET
);
1217 return IN4ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN
*)a
);
1221 #if (NTDDI_VERSION >= NTDDI_VISTA)
1225 IN CONST SOCKADDR
*a
)
1227 if (a
->sa_family
== AF_INET6
) {
1228 return ((CONST SOCKADDR_IN6
*)a
)->sin6_scope_struct
;
1230 ASSERT(a
->sa_family
== AF_INET
);
1231 return IN4ADDR_SCOPE_ID((CONST SOCKADDR_IN
*)a
);
1239 IN CONST SOCKADDR
*a
)
1241 if (a
->sa_family
== AF_INET6
) {
1242 return ((CONST SOCKADDR_IN6
*)a
)->sin6_port
;
1244 ASSERT(a
->sa_family
== AF_INET
);
1245 return ((CONST SOCKADDR_IN
*)a
)->sin_port
;
1252 IN CONST SOCKADDR
* a
)
1254 if (a
->sa_family
== AF_INET6
) {
1255 return (PUCHAR
)&((PSOCKADDR_IN6
)a
)->sin6_addr
;
1257 ASSERT(a
->sa_family
== AF_INET
);
1258 return (PUCHAR
)&((PSOCKADDR_IN
)a
)->sin_addr
;
1273 INETADDR_SET_ADDRESS(
1275 IN CONST UCHAR
*Address
)
1277 if (a
->sa_family
== AF_INET6
) {
1278 ((PSOCKADDR_IN6
)a
)->sin6_addr
= *((CONST IN6_ADDR
*)Address
);
1280 ASSERT(a
->sa_family
== AF_INET
);
1281 ((PSOCKADDR_IN
)a
)->sin_addr
= *((CONST IN_ADDR
*)Address
);
1287 INET_UNCANONICALIZE_SCOPE_ID(
1288 IN ADDRESS_FAMILY AddressFamily
,
1289 IN CONST UCHAR
*Address
,
1290 IN OUT SCOPE_ID
*ScopeId
)
1292 if (AddressFamily
== AF_INET6
) {
1293 IN6_UNCANONICALIZE_SCOPE_ID((CONST IN6_ADDR
*) Address
, ScopeId
);
1295 IN4_UNCANONICALIZE_SCOPE_ID((CONST IN_ADDR
*) Address
, ScopeId
);
1299 #endif /* _WS2IPDEF_ */
1301 #ifndef __IP2STRING__
1302 #define __IP2STRING__
1304 #if (NTDDI_VERSION >= NTDDI_VISTA)
1311 RtlIpv4AddressToStringA(
1312 IN
const struct in_addr
*Addr
,
1318 RtlIpv4AddressToStringExA(
1319 IN
const struct in_addr
*Address
,
1321 OUT PSTR AddressString
,
1322 IN OUT PULONG AddressStringLength
);
1327 RtlIpv4AddressToStringW(
1328 IN
const struct in_addr
*Addr
,
1334 RtlIpv4AddressToStringExW(
1335 IN
const struct in_addr
*Address
,
1337 OUT PWSTR AddressString
,
1338 IN OUT PULONG AddressStringLength
);
1343 RtlIpv4StringToAddressA(
1346 OUT PCSTR
*Terminator
,
1347 OUT
struct in_addr
*Addr
);
1352 RtlIpv4StringToAddressExA(
1353 IN PCSTR AddressString
,
1355 OUT
struct in_addr
*Address
,
1361 RtlIpv4StringToAddressW(
1364 OUT LPCWSTR
*Terminator
,
1365 OUT
struct in_addr
*Addr
);
1370 RtlIpv4StringToAddressExW(
1371 IN PCWSTR AddressString
,
1373 OUT
struct in_addr
*Address
,
1377 #define RtlIpv4AddressToString RtlIpv4AddressToStringW
1378 #define RtlIpv4StringToAddress RtlIpv4StringToAddressW
1379 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExW
1380 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExW
1382 #define RtlIpv4AddressToString RtlIpv4AddressToStringA
1383 #define RtlIpv4StringToAddress RtlIpv4StringToAddressA
1384 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExA
1385 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExA
1388 #endif /* _WS2DEF_ */
1395 RtlIpv6AddressToStringA(
1396 IN
const struct in6_addr
*Addr
,
1402 RtlIpv6AddressToStringExA(
1403 IN
const struct in6_addr
*Address
,
1406 OUT PSTR AddressString
,
1407 IN OUT PULONG AddressStringLength
);
1412 RtlIpv6AddressToStringW(
1413 IN
const struct in6_addr
*Addr
,
1419 RtlIpv6AddressToStringExW(
1420 IN
const struct in6_addr
*Address
,
1423 OUT PWSTR AddressString
,
1424 IN OUT PULONG AddressStringLength
);
1429 RtlIpv6StringToAddressA(
1431 OUT PCSTR
*Terminator
,
1432 OUT
struct in6_addr
*Addr
);
1437 RtlIpv6StringToAddressExA(
1438 IN PCSTR AddressString
,
1439 OUT
struct in6_addr
*Address
,
1446 RtlIpv6StringToAddressW(
1448 OUT PCWSTR
*Terminator
,
1449 OUT
struct in6_addr
*Addr
);
1454 RtlIpv6StringToAddressExW(
1455 IN PCWSTR AddressString
,
1456 OUT
struct in6_addr
*Address
,
1461 #define RtlIpv6AddressToString RtlIpv6AddressToStringW
1462 #define RtlIpv6StringToAddress RtlIpv6StringToAddressW
1463 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExW
1464 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExW
1466 #define RtlIpv6AddressToString RtlIpv6AddressToStringA
1467 #define RtlIpv6StringToAddress RtlIpv6StringToAddressA
1468 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExA
1469 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExA
1472 #endif /* __WS2IPDEF__ */
1477 typedef union _DL_EUI48 DL_EUI48
, *PDL_EUI48
;
1482 RtlEthernetAddressToStringA(
1483 IN
const DL_EUI48
*Addr
,
1489 RtlEthernetAddressToStringW(
1490 IN
const DL_EUI48
*Addr
,
1496 RtlEthernetStringToAddressA(
1498 OUT PCSTR
*Terminator
,
1499 OUT DL_EUI48
*Addr
);
1504 RtlEthernetStringToAddressW(
1506 OUT LPCWSTR
*Terminator
,
1507 OUT DL_EUI48
*Addr
);
1510 #define RtlEthernetAddressToString RtlEthernetAddressToStringW
1511 #define RtlEthernetStringToAddress RtlEthernetStringToAddressW
1513 #define RtlEthernetAddressToString RtlEthernetAddressToStringA
1514 #define RtlEthernetStringToAddress RtlEthernetStringToAddressA
1517 #endif /* _WS2DEF_ */
1519 #endif /* (NTDDI >= NTDDI_VISTA) */
1521 #endif /* __IP2STRING__ */