Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmstcpip.h
Go to the documentation of this file.
00001 #pragma once 00002 00003 #ifdef __cplusplus 00004 extern "C" { 00005 #endif 00006 00007 #ifndef ASSERT 00008 #define MSTCPIP_ASSERT_UNDEFINED 00009 #define ASSERT(exp) ((VOID) 0) 00010 #endif 00011 00012 #ifdef _MSC_VER 00013 #define MSTCPIP_INLINE __inline 00014 #else 00015 #define MSTCPIP_INLINE extern inline 00016 #endif 00017 00018 #include <nldef.h> 00019 00020 struct tcp_keepalive { 00021 ULONG onoff; 00022 ULONG keepalivetime; 00023 ULONG keepaliveinterval; 00024 }; 00025 00026 #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) 00027 #define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2) 00028 #define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3) 00029 #define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4) 00030 #define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5) 00031 #define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6) 00032 #define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7) 00033 #define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8) 00034 #define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9) 00035 #define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10) 00036 #define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11) 00037 #define SIO_RCVALL_MCAST_IF _WSAIOW(IOC_VENDOR,13) 00038 #define SIO_RCVALL_IF _WSAIOW(IOC_VENDOR,14) 00039 00040 typedef enum { 00041 RCVALL_OFF = 0, 00042 RCVALL_ON = 1, 00043 RCVALL_SOCKETLEVELONLY = 2, 00044 RCVALL_IPLEVEL = 3, 00045 } RCVALL_VALUE, *PRCVALL_VALUE; 00046 00047 #define RCVALL_MAX RCVALL_IPLEVEL 00048 00049 typedef struct { 00050 RCVALL_VALUE Mode; 00051 ULONG Interface; 00052 } RCVALL_IF, *PRCVALL_IF; 00053 00054 #if (NTDDI_VERSION >= NTDDI_WIN7) 00055 DEFINE_GUID(SOCKET_DEFAULT2_QM_POLICY, 0xaec2ef9c, 0x3a4d, 0x4d3e, 0x88, 0x42, 0x23, 0x99, 0x42, 0xe3, 0x9a, 0x47); 00056 #endif 00057 00058 #define SIO_ACQUIRE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 100) 00059 #define SIO_RELEASE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 101) 00060 #define SIO_ASSOCIATE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 102) 00061 00062 typedef struct _INET_PORT_RANGE { 00063 USHORT StartPort; 00064 USHORT NumberOfPorts; 00065 } INET_PORT_RANGE, *PINET_PORT_RANGE; 00066 typedef struct _INET_PORT_RANGE INET_PORT_RESERVATION, *PINET_PORT_RESERVATION; 00067 00068 typedef struct { 00069 ULONG64 Token; 00070 } INET_PORT_RESERVATION_TOKEN, *PINET_PORT_RESERVATION_TOKEN; 00071 00072 #define INVALID_PORT_RESERVATION_TOKEN ((ULONG64)0) 00073 00074 typedef struct { 00075 #ifdef __cplusplus 00076 INET_PORT_RESERVATION Reservation; 00077 INET_PORT_RESERVATION_TOKEN Token; 00078 #else 00079 INET_PORT_RESERVATION; 00080 INET_PORT_RESERVATION_TOKEN; 00081 #endif 00082 } INET_PORT_RESERVATION_INSTANCE, *PINET_PORT_RESERVATION_INSTANCE; 00083 00084 typedef struct { 00085 ULONG AssignmentCount; 00086 ULONG OwningPid; 00087 } INET_PORT_RESERVATION_INFORMATION, *PINET_PORT_RESERVATION_INFORMATION; 00088 00089 #ifdef _WS2DEF_ 00090 00091 #if (NTDDI_VERSION >= NTDDI_VISTA) 00092 00093 #define _SECURE_SOCKET_TYPES_DEFINED_ 00094 00095 #define SIO_SET_SECURITY _WSAIOW(IOC_VENDOR, 200) 00096 #define SIO_QUERY_SECURITY _WSAIORW(IOC_VENDOR, 201) 00097 #define SIO_SET_PEER_TARGET_NAME _WSAIOW(IOC_VENDOR, 202) 00098 #define SIO_DELETE_PEER_TARGET_NAME _WSAIOW(IOC_VENDOR, 203) 00099 00100 #define SIO_SOCKET_USAGE_NOTIFICATION _WSAIOW(IOC_VENDOR, 204) 00101 00102 typedef enum _SOCKET_USAGE_TYPE { 00103 SYSTEM_CRITICAL_SOCKET = 1 00104 }SOCKET_USAGE_TYPE; 00105 00106 typedef enum _SOCKET_SECURITY_PROTOCOL { 00107 SOCKET_SECURITY_PROTOCOL_DEFAULT, 00108 SOCKET_SECURITY_PROTOCOL_IPSEC, 00109 #if (NTDDI_VERSION >= NTDDI_WIN7) 00110 SOCKET_SECURITY_PROTOCOL_IPSEC2, 00111 #endif 00112 SOCKET_SECURITY_PROTOCOL_INVALID 00113 } SOCKET_SECURITY_PROTOCOL; 00114 00115 #define SOCKET_SETTINGS_GUARANTEE_ENCRYPTION 0x1 00116 #define SOCKET_SETTINGS_ALLOW_INSECURE 0x2 00117 00118 typedef struct _SOCKET_SECURITY_SETTINGS { 00119 SOCKET_SECURITY_PROTOCOL SecurityProtocol; 00120 ULONG SecurityFlags; 00121 } SOCKET_SECURITY_SETTINGS; 00122 00123 #define SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION 0x1 00124 00125 #if (NTDDI_VERSION >= NTDDI_WIN7) 00126 00127 #define SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION 0x2 00128 #define SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED 0x4 00129 #define SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT 0x8 00130 00131 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ 00132 00133 typedef struct _SOCKET_SECURITY_SETTINGS_IPSEC { 00134 SOCKET_SECURITY_PROTOCOL SecurityProtocol; 00135 ULONG SecurityFlags; 00136 ULONG IpsecFlags; 00137 GUID AuthipMMPolicyKey; 00138 GUID AuthipQMPolicyKey; 00139 GUID Reserved; 00140 UINT64 Reserved2; 00141 ULONG UserNameStringLen; 00142 ULONG DomainNameStringLen; 00143 ULONG PasswordStringLen; 00144 wchar_t AllStrings[0]; 00145 } SOCKET_SECURITY_SETTINGS_IPSEC; 00146 00147 typedef struct _SOCKET_PEER_TARGET_NAME { 00148 SOCKET_SECURITY_PROTOCOL SecurityProtocol; 00149 SOCKADDR_STORAGE PeerAddress; 00150 ULONG PeerTargetNameStringLen; 00151 wchar_t AllStrings[0]; 00152 } SOCKET_PEER_TARGET_NAME; 00153 00154 typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE { 00155 SOCKET_SECURITY_PROTOCOL SecurityProtocol; 00156 SOCKADDR_STORAGE PeerAddress; 00157 ULONG PeerTokenAccessMask; 00158 } SOCKET_SECURITY_QUERY_TEMPLATE; 00159 00160 #if (NTDDI_VERSION >= NTDDI_WIN7) 00161 00162 #define SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE 0x1 00163 00164 #define SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID 0x1 00165 #define SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID 0x2 00166 00167 typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2 { 00168 SOCKET_SECURITY_PROTOCOL SecurityProtocol; 00169 SOCKADDR_STORAGE PeerAddress; 00170 ULONG PeerTokenAccessMask; 00171 ULONG Flags; 00172 ULONG FieldMask; 00173 } SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2; 00174 00175 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ 00176 00177 #define SOCKET_INFO_CONNECTION_SECURED 0x1 00178 #define SOCKET_INFO_CONNECTION_ENCRYPTED 0x2 00179 #define SOCKET_INFO_CONNECTION_IMPERSONATED 0x4 00180 00181 typedef struct _SOCKET_SECURITY_QUERY_INFO { 00182 SOCKET_SECURITY_PROTOCOL SecurityProtocol; 00183 ULONG Flags; 00184 UINT64 PeerApplicationAccessTokenHandle; 00185 UINT64 PeerMachineAccessTokenHandle; 00186 } SOCKET_SECURITY_QUERY_INFO; 00187 00188 #if (NTDDI_VERSION >= NTDDI_WIN7) 00189 typedef struct _SOCKET_SECURITY_QUERY_INFO_IPSEC2 { 00190 SOCKET_SECURITY_PROTOCOL SecurityProtocol; 00191 ULONG Flags; 00192 UINT64 PeerApplicationAccessTokenHandle; 00193 UINT64 PeerMachineAccessTokenHandle; 00194 UINT64 MmSaId; 00195 UINT64 QmSaId; 00196 UINT32 NegotiationWinerr; 00197 GUID SaLookupContext; 00198 } SOCKET_SECURITY_QUERY_INFO_IPSEC2; 00199 #endif 00200 00201 #define SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE _WSAIOR(IOC_VENDOR, 205) 00202 #define SIO_QUERY_RSS_SCALABILITY_INFO _WSAIOR(IOC_VENDOR, 210) 00203 00204 typedef struct _RSS_SCALABILITY_INFO { 00205 BOOLEAN RssEnabled; 00206 } RSS_SCALABILITY_INFO, *PRSS_SCALABILITY_INFO; 00207 00208 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ 00209 00210 #define IN4_CLASSA(i) (((LONG)(i) & 0x00000080) == 0) 00211 #define IN4_CLASSB(i) (((LONG)(i) & 0x000000c0) == 0x00000080) 00212 #define IN4_CLASSC(i) (((LONG)(i) & 0x000000e0) == 0x000000c0) 00213 #define IN4_CLASSD(i) (((LONG)(i) & 0x000000f0) == 0x000000e0) 00214 #define IN4_MULTICAST(i) IN4_CLASSD(i) 00215 00216 #define IN4ADDR_ANY INADDR_ANY 00217 #define IN4ADDR_LOOPBACK 0x0100007f 00218 #define IN4ADDR_BROADCAST INADDR_BROADCAST 00219 #define IN4ADDR_NONE INADDR_NONE 00220 #define IN4ADDR_ANY_INIT { 0 } 00221 #define IN4ADDR_LOOPBACK_INIT { 0x7f, 0, 0, 1 } 00222 #define IN4ADDR_BROADCAST_INIT { 0xff, 0xff, 0xff, 0xff } 00223 #define IN4ADDR_ALLNODESONLINK_INIT { 0xe0, 0, 0, 1 } 00224 #define IN4ADDR_ALLROUTERSONLINK_INIT { 0xe0, 0, 0, 2 } 00225 #define IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT { 0xe0, 0, 0, 0x16 } 00226 #define IN4ADDR_ALLTEREDONODESONLINK_INIT { 0xe0, 0, 0, 0xfd } 00227 #define IN4ADDR_LINKLOCALPREFIX_INIT { 0xa9, 0xfe, } 00228 #define IN4ADDR_MULTICASTPREFIX_INIT { 0xe0, } 00229 00230 #define IN4ADDR_LOOPBACKPREFIX_LENGTH 8 00231 #define IN4ADDR_LINKLOCALPREFIX_LENGTH 16 00232 #define IN4ADDR_MULTICASTPREFIX_LENGTH 4 00233 00234 #if (NTDDI_VERSION >= NTDDI_WIN2KSP1) 00235 00236 MSTCPIP_INLINE 00237 BOOLEAN 00238 IN4_ADDR_EQUAL( 00239 IN CONST IN_ADDR *a, 00240 IN CONST IN_ADDR *b) 00241 { 00242 return (BOOLEAN)(a->s_addr == b->s_addr); 00243 } 00244 00245 MSTCPIP_INLINE 00246 BOOLEAN 00247 IN4_UNALIGNED_ADDR_EQUAL( 00248 IN CONST IN_ADDR UNALIGNED *a, 00249 IN CONST IN_ADDR UNALIGNED *b) 00250 { 00251 return (BOOLEAN)(a->s_addr == b->s_addr); 00252 } 00253 00254 MSTCPIP_INLINE 00255 BOOLEAN 00256 IN4_IS_ADDR_UNSPECIFIED( 00257 IN CONST IN_ADDR *a) 00258 { 00259 return (BOOLEAN)(a->s_addr == IN4ADDR_ANY); 00260 } 00261 00262 MSTCPIP_INLINE 00263 BOOLEAN 00264 IN4_IS_UNALIGNED_ADDR_UNSPECIFIED( 00265 IN CONST IN_ADDR UNALIGNED *a) 00266 { 00267 return (BOOLEAN)(a->s_addr == IN4ADDR_ANY); 00268 } 00269 00270 MSTCPIP_INLINE 00271 BOOLEAN 00272 IN4_IS_ADDR_LOOPBACK( 00273 IN CONST IN_ADDR *a) 00274 { 00275 return (BOOLEAN)(*((PUCHAR) a) == 0x7f); 00276 } 00277 00278 MSTCPIP_INLINE 00279 BOOLEAN 00280 IN4_IS_UNALIGNED_ADDR_LOOPBACK( 00281 IN CONST IN_ADDR UNALIGNED *a) 00282 { 00283 return (BOOLEAN)(*((PUCHAR) a) == 0x7f); 00284 } 00285 00286 MSTCPIP_INLINE 00287 BOOLEAN 00288 IN4_IS_ADDR_BROADCAST( 00289 IN CONST IN_ADDR *a) 00290 { 00291 return (BOOLEAN)(a->s_addr == IN4ADDR_BROADCAST); 00292 } 00293 00294 MSTCPIP_INLINE 00295 BOOLEAN 00296 IN4_IS_UNALIGNED_ADDR_BROADCAST( 00297 IN CONST IN_ADDR UNALIGNED *a) 00298 { 00299 return (BOOLEAN)(a->s_addr == IN4ADDR_BROADCAST); 00300 } 00301 00302 MSTCPIP_INLINE 00303 BOOLEAN 00304 IN4_IS_ADDR_MULTICAST( 00305 IN CONST IN_ADDR *a) 00306 { 00307 return (BOOLEAN)IN4_MULTICAST(a->s_addr); 00308 } 00309 00310 MSTCPIP_INLINE 00311 BOOLEAN 00312 IN4_IS_UNALIGNED_ADDR_MULTICAST( 00313 IN CONST IN_ADDR UNALIGNED *a) 00314 { 00315 return (BOOLEAN)IN4_MULTICAST(a->s_addr); 00316 } 00317 00318 MSTCPIP_INLINE 00319 BOOLEAN 00320 IN4_IS_ADDR_LINKLOCAL( 00321 IN CONST IN_ADDR *a) 00322 { 00323 return (BOOLEAN)((a->s_addr & 0xffff) == 0xfea9); 00324 } 00325 00326 MSTCPIP_INLINE 00327 BOOLEAN 00328 IN4_IS_UNALIGNED_ADDR_LINKLOCAL( 00329 IN CONST IN_ADDR UNALIGNED *a) 00330 { 00331 return (BOOLEAN)((a->s_addr & 0xffff) == 0xfea9); // 169.254/16 00332 } 00333 00334 MSTCPIP_INLINE 00335 BOOLEAN 00336 IN4_IS_ADDR_SITELOCAL( 00337 IN CONST IN_ADDR *a) 00338 { 00339 UNREFERENCED_PARAMETER(a); 00340 return FALSE; 00341 } 00342 #define IN4_IS_UNALIGNED_ADDR_SITELOCAL IN4_IS_ADDR_SITELOCAL 00343 00344 MSTCPIP_INLINE 00345 BOOLEAN 00346 IN4_IS_ADDR_RFC1918( 00347 IN CONST IN_ADDR *a) 00348 { 00349 return (BOOLEAN)(((a->s_addr & 0x00ff) == 0x0a) || 00350 ((a->s_addr & 0xf0ff) == 0x10ac) || 00351 ((a->s_addr & 0xffff) == 0xa8c0)); 00352 } 00353 00354 MSTCPIP_INLINE 00355 BOOLEAN 00356 IN4_IS_UNALIGNED_ADDR_RFC1918( 00357 IN CONST IN_ADDR UNALIGNED *a) 00358 { 00359 IN_ADDR Ipv4Address = *a; 00360 return IN4_IS_ADDR_RFC1918(&Ipv4Address); 00361 } 00362 00363 MSTCPIP_INLINE 00364 BOOLEAN 00365 IN4_IS_ADDR_MC_LINKLOCAL( 00366 IN CONST IN_ADDR *a) 00367 { 00368 return (BOOLEAN)((a->s_addr & 0xffffff) == 0xe0); 00369 } 00370 00371 MSTCPIP_INLINE 00372 BOOLEAN 00373 IN4_IS_ADDR_MC_ADMINLOCAL( 00374 IN CONST IN_ADDR *a) 00375 { 00376 return (BOOLEAN)((a->s_addr & 0xffff) == 0xffef); 00377 } 00378 00379 MSTCPIP_INLINE 00380 BOOLEAN 00381 IN4_IS_ADDR_MC_SITELOCAL( 00382 IN CONST IN_ADDR *a) 00383 { 00384 return (BOOLEAN)((a->s_addr & 0xff) == 0xef) && 00385 !IN4_IS_ADDR_MC_ADMINLOCAL(a); 00386 } 00387 00388 MSTCPIP_INLINE 00389 VOID 00390 IN4ADDR_SETSOCKADDR( 00391 OUT PSOCKADDR_IN a, 00392 IN CONST IN_ADDR *addr, 00393 IN USHORT port) 00394 { 00395 a->sin_family = AF_INET; 00396 a->sin_port = port; 00397 a->sin_addr = *addr; 00398 memset(a->sin_zero, 0, sizeof(a->sin_zero)); 00399 } 00400 00401 MSTCPIP_INLINE 00402 VOID 00403 IN4ADDR_SETANY( 00404 OUT PSOCKADDR_IN a) 00405 { 00406 a->sin_family = AF_INET; 00407 a->sin_port = 0; 00408 a->sin_addr.s_addr = IN4ADDR_ANY; 00409 memset(a->sin_zero, 0, sizeof(a->sin_zero)); 00410 } 00411 00412 MSTCPIP_INLINE 00413 VOID 00414 IN4ADDR_SETLOOPBACK( 00415 OUT PSOCKADDR_IN a) 00416 { 00417 a->sin_family = AF_INET; 00418 a->sin_port = 0; 00419 a->sin_addr.s_addr = IN4ADDR_LOOPBACK; 00420 memset(a->sin_zero, 0, sizeof(a->sin_zero)); 00421 } 00422 00423 MSTCPIP_INLINE 00424 BOOLEAN 00425 IN4ADDR_ISANY( 00426 IN CONST SOCKADDR_IN *a) 00427 { 00428 ASSERT(a->sin_family == AF_INET); 00429 return IN4_IS_ADDR_UNSPECIFIED(&a->sin_addr); 00430 } 00431 00432 MSTCPIP_INLINE 00433 BOOLEAN 00434 IN4ADDR_ISLOOPBACK( 00435 IN CONST SOCKADDR_IN *a) 00436 { 00437 ASSERT(a->sin_family == AF_INET); 00438 return IN4_IS_ADDR_LOOPBACK(&a->sin_addr); 00439 } 00440 00441 MSTCPIP_INLINE 00442 SCOPE_ID 00443 IN4ADDR_SCOPE_ID( 00444 IN CONST SOCKADDR_IN *a) 00445 { 00446 SCOPE_ID UnspecifiedScopeId = {0}; 00447 UNREFERENCED_PARAMETER(a); 00448 return UnspecifiedScopeId; 00449 } 00450 00451 MSTCPIP_INLINE 00452 BOOLEAN 00453 IN4ADDR_ISEQUAL( 00454 IN CONST SOCKADDR_IN *a, 00455 IN CONST SOCKADDR_IN *b) 00456 { 00457 ASSERT(a->sin_family == AF_INET); 00458 return (BOOLEAN)(IN4ADDR_SCOPE_ID(a).Value == IN4ADDR_SCOPE_ID(b).Value && 00459 IN4_ADDR_EQUAL(&a->sin_addr, &b->sin_addr)); 00460 } 00461 00462 MSTCPIP_INLINE 00463 BOOLEAN 00464 IN4ADDR_ISUNSPECIFIED( 00465 IN CONST SOCKADDR_IN *a) 00466 { 00467 ASSERT(a->sin_family == AF_INET); 00468 return (BOOLEAN)(IN4ADDR_SCOPE_ID(a).Value == 0 && 00469 IN4_IS_ADDR_UNSPECIFIED(&a->sin_addr)); 00470 } 00471 00472 #define INET_IS_ALIGNED(Pointer, Type) \ 00473 (((ULONG_PTR)Pointer & (__builtin_alignof(Type)-1)) == 0) 00474 00475 MSTCPIP_INLINE 00476 SCOPE_LEVEL 00477 Ipv4UnicastAddressScope( 00478 IN CONST UCHAR *Address) 00479 { 00480 IN_ADDR Ipv4Address; 00481 00482 if (!INET_IS_ALIGNED(Address, IN_ADDR)) { 00483 Ipv4Address = *(CONST IN_ADDR UNALIGNED *)Address; 00484 Address = (CONST UCHAR *) &Ipv4Address; 00485 } 00486 if (IN4_IS_ADDR_LINKLOCAL((PIN_ADDR) Address) || 00487 IN4_IS_ADDR_LOOPBACK((PIN_ADDR) Address)) { 00488 return ScopeLevelLink; 00489 } 00490 return ScopeLevelGlobal; 00491 } 00492 00493 MSTCPIP_INLINE 00494 SCOPE_LEVEL 00495 Ipv4MulticastAddressScope( 00496 IN CONST UCHAR *Address) 00497 { 00498 IN_ADDR Ipv4Address; 00499 00500 if (!INET_IS_ALIGNED(Address, IN_ADDR)) { 00501 Ipv4Address = *(CONST IN_ADDR UNALIGNED *)Address; 00502 Address = (CONST UCHAR *) &Ipv4Address; 00503 } 00504 if (IN4_IS_ADDR_MC_LINKLOCAL((PIN_ADDR) Address)) { 00505 return ScopeLevelLink; 00506 } else if (IN4_IS_ADDR_MC_ADMINLOCAL((PIN_ADDR) Address)) { 00507 return ScopeLevelAdmin; 00508 } else if (IN4_IS_ADDR_MC_SITELOCAL((PIN_ADDR) Address)) { 00509 return ScopeLevelSite; 00510 } else { 00511 return ScopeLevelGlobal; 00512 } 00513 } 00514 00515 MSTCPIP_INLINE 00516 SCOPE_LEVEL 00517 Ipv4AddressScope( 00518 IN CONST UCHAR *Address) 00519 { 00520 IN CONST IN_ADDR Ipv4Address = *(CONST IN_ADDR UNALIGNED *)Address; 00521 00522 if (IN4_IS_ADDR_BROADCAST(&Ipv4Address)) { 00523 return ScopeLevelLink; 00524 } else if (IN4_IS_ADDR_MULTICAST(&Ipv4Address)) { 00525 return Ipv4MulticastAddressScope((UCHAR *) &Ipv4Address); 00526 } else { 00527 return Ipv4UnicastAddressScope((UCHAR *) &Ipv4Address); 00528 } 00529 } 00530 00531 MSTCPIP_INLINE 00532 NL_ADDRESS_TYPE 00533 Ipv4AddressType( 00534 IN CONST UCHAR *Address) 00535 { 00536 IN_ADDR Ipv4Address = *(CONST IN_ADDR UNALIGNED *) Address; 00537 00538 if (IN4_IS_ADDR_MULTICAST(&Ipv4Address)) { 00539 return NlatMulticast; 00540 } 00541 if (IN4_IS_ADDR_BROADCAST(&Ipv4Address)) { 00542 return NlatBroadcast; 00543 } 00544 if (IN4_IS_ADDR_UNSPECIFIED(&Ipv4Address)) { 00545 return NlatUnspecified; 00546 } 00547 if (((Ipv4Address.s_addr & 0x000000ff) == 0) || 00548 ((Ipv4Address.s_addr & 0x000000f0) == 240)) { 00549 return NlatInvalid; 00550 } 00551 return NlatUnicast; 00552 } 00553 00554 MSTCPIP_INLINE 00555 VOID 00556 IN4_UNCANONICALIZE_SCOPE_ID( 00557 IN CONST IN_ADDR *Address, 00558 IN OUT SCOPE_ID *ScopeId) 00559 { 00560 SCOPE_LEVEL ScopeLevel = Ipv4AddressScope((CONST UCHAR *)Address); 00561 00562 if ((IN4_IS_ADDR_LOOPBACK(Address)) || (ScopeLevel == ScopeLevelGlobal)) { 00563 ScopeId->Value = 0; 00564 } 00565 if ((SCOPE_LEVEL)ScopeId->Level == ScopeLevel) { 00566 ScopeId->Level = 0; 00567 } 00568 } 00569 00570 MSTCPIP_INLINE 00571 BOOLEAN 00572 IN4_IS_ADDR_6TO4ELIGIBLE( 00573 IN CONST IN_ADDR *a) 00574 { 00575 return (BOOLEAN)((Ipv4AddressType((CONST UCHAR *) a) == NlatUnicast) && 00576 !(IN4_IS_ADDR_LOOPBACK(a) || 00577 IN4_IS_ADDR_LINKLOCAL(a) || 00578 IN4_IS_ADDR_SITELOCAL(a) || 00579 IN4_IS_ADDR_RFC1918(a))); 00580 } 00581 00582 MSTCPIP_INLINE 00583 BOOLEAN 00584 IN4_IS_UNALIGNED_ADDR_6TO4ELIGIBLE( 00585 IN CONST IN_ADDR UNALIGNED *a) 00586 { 00587 IN_ADDR Ipv4Address = *a; 00588 return IN4_IS_ADDR_6TO4ELIGIBLE(&Ipv4Address); 00589 } 00590 00591 #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP1) */ 00592 00593 #endif /* _WS2DEF_ */ 00594 00595 #ifdef _WS2IPDEF_ 00596 00597 MSTCPIP_INLINE 00598 BOOLEAN 00599 IN6_PREFIX_EQUAL( 00600 IN CONST IN6_ADDR *a, 00601 IN CONST IN6_ADDR *b, 00602 IN UINT8 len) 00603 { 00604 UINT8 Bytes = len / 8; 00605 UINT8 Bits = len % 8; 00606 UINT8 Mask = 0xff << (8 - Bits); 00607 00608 ASSERT(len <= (sizeof(IN6_ADDR) * 8)); 00609 return (BOOLEAN) (((memcmp(a, b, Bytes)) == 0) && ((Bits == 0) || 00610 ((a->s6_bytes[Bytes] | Mask) == (b->s6_bytes[Bytes] | Mask)))); 00611 } 00612 00613 MSTCPIP_INLINE 00614 BOOLEAN 00615 IN6_IS_ADDR_ALLNODESONNODE( 00616 IN CONST IN6_ADDR *a) 00617 { 00618 return IN6_ADDR_EQUAL(a, &in6addr_allnodesonnode); 00619 } 00620 00621 MSTCPIP_INLINE 00622 BOOLEAN 00623 IN6_IS_ADDR_ALLNODESONLINK( 00624 IN CONST IN6_ADDR *a) 00625 { 00626 return IN6_ADDR_EQUAL(a, &in6addr_allnodesonlink); 00627 } 00628 00629 MSTCPIP_INLINE 00630 BOOLEAN 00631 IN6_IS_ADDR_ALLROUTERSONLINK( 00632 IN CONST IN6_ADDR *a) 00633 { 00634 return IN6_ADDR_EQUAL(a, &in6addr_allroutersonlink); 00635 } 00636 00637 MSTCPIP_INLINE 00638 BOOLEAN 00639 IN6_IS_ADDR_SOLICITEDNODE( 00640 IN CONST IN6_ADDR *a) 00641 { 00642 return IN6_PREFIX_EQUAL(a, &in6addr_solicitednodemulticastprefix, 00643 IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH); 00644 } 00645 00646 MSTCPIP_INLINE 00647 BOOLEAN 00648 IN6_IS_ADDR_ISATAP( 00649 IN CONST IN6_ADDR *a) 00650 { 00651 return (BOOLEAN)(((a->s6_words[4] & 0xfffd) == 0x0000) && 00652 (a->s6_words[5] == 0xfe5e)); 00653 } 00654 00655 MSTCPIP_INLINE 00656 BOOLEAN 00657 IN6_IS_ADDR_6TO4( 00658 IN CONST IN6_ADDR *a) 00659 { 00660 C_ASSERT(IN6ADDR_6TO4PREFIX_LENGTH == RTL_BITS_OF(USHORT)); 00661 return (BOOLEAN)(a->s6_words[0] == in6addr_6to4prefix.s6_words[0]); 00662 } 00663 00664 MSTCPIP_INLINE 00665 BOOLEAN 00666 IN6_IS_ADDR_TEREDO( 00667 IN CONST IN6_ADDR *a) 00668 { 00669 C_ASSERT(IN6ADDR_TEREDOPREFIX_LENGTH == 2 * RTL_BITS_OF(USHORT)); 00670 return (BOOLEAN) 00671 (((a->s6_words[0] == in6addr_teredoprefix.s6_words[0]) && 00672 (a->s6_words[1] == in6addr_teredoprefix.s6_words[1])) || 00673 ((a->s6_words[0] == in6addr_teredoprefix_old.s6_words[0]) && 00674 (a->s6_words[1] == in6addr_teredoprefix_old.s6_words[1]))); 00675 } 00676 00677 MSTCPIP_INLINE 00678 BOOLEAN 00679 IN6ADDR_ISV4MAPPED( 00680 IN CONST SOCKADDR_IN6 *a) 00681 { 00682 ASSERT(a->sin6_family == AF_INET6); 00683 return IN6_IS_ADDR_V4MAPPED(&a->sin6_addr); 00684 } 00685 00686 MSTCPIP_INLINE 00687 BOOLEAN 00688 IN6ADDR_ISISATAP( 00689 IN CONST SOCKADDR_IN6 *a) 00690 { 00691 ASSERT(a->sin6_family == AF_INET6); 00692 return IN6_IS_ADDR_ISATAP(&a->sin6_addr); 00693 } 00694 00695 MSTCPIP_INLINE 00696 BOOLEAN 00697 IN6ADDR_IS6TO4( 00698 IN CONST SOCKADDR_IN6 *a) 00699 { 00700 ASSERT(a->sin6_family == AF_INET6); 00701 return IN6_IS_ADDR_6TO4(&a->sin6_addr); 00702 } 00703 00704 MSTCPIP_INLINE 00705 BOOLEAN 00706 IN6ADDR_ISTEREDO( 00707 IN CONST SOCKADDR_IN6 *a) 00708 { 00709 ASSERT(a->sin6_family == AF_INET6); 00710 return IN6_IS_ADDR_TEREDO(&a->sin6_addr); 00711 } 00712 00713 MSTCPIP_INLINE 00714 CONST UCHAR* 00715 IN6_GET_ADDR_V4MAPPED( 00716 IN CONST IN6_ADDR *Ipv6Address) 00717 { 00718 return (CONST UCHAR *) (Ipv6Address->s6_words + 6); 00719 } 00720 00721 MSTCPIP_INLINE 00722 CONST UCHAR* 00723 IN6_GET_ADDR_V4COMPAT( 00724 IN CONST IN6_ADDR *Ipv6Address) 00725 { 00726 return (CONST UCHAR *) (Ipv6Address->s6_words + 6); 00727 } 00728 00729 MSTCPIP_INLINE 00730 CONST UCHAR* 00731 IN6_EXTRACT_V4ADDR_FROM_ISATAP( 00732 IN CONST IN6_ADDR *Ipv6Address) 00733 { 00734 return (CONST UCHAR *) (Ipv6Address->s6_words + 6); 00735 } 00736 00737 MSTCPIP_INLINE 00738 CONST UCHAR* 00739 IN6_EXTRACT_V4ADDR_FROM_6TO4( 00740 IN CONST IN6_ADDR *Ipv6Address) 00741 { 00742 return (CONST UCHAR *) (Ipv6Address->s6_words + 1); 00743 } 00744 00745 MSTCPIP_INLINE 00746 VOID 00747 IN6_SET_ADDR_V4MAPPED( 00748 OUT PIN6_ADDR a6, 00749 IN CONST IN_ADDR* a4) 00750 { 00751 *a6 = in6addr_v4mappedprefix; 00752 a6->s6_bytes[12] = ((CONST UCHAR *) a4)[0]; 00753 a6->s6_bytes[13] = ((CONST UCHAR *) a4)[1]; 00754 a6->s6_bytes[14] = ((CONST UCHAR *) a4)[2]; 00755 a6->s6_bytes[15] = ((CONST UCHAR *) a4)[3]; 00756 } 00757 00758 MSTCPIP_INLINE 00759 VOID 00760 IN6_SET_ADDR_V4COMPAT( 00761 OUT PIN6_ADDR a6, 00762 IN CONST IN_ADDR* a4) 00763 { 00764 *a6 = in6addr_any; 00765 a6->s6_bytes[12] = ((CONST UCHAR *) a4)[0]; 00766 a6->s6_bytes[13] = ((CONST UCHAR *) a4)[1]; 00767 a6->s6_bytes[14] = ((CONST UCHAR *) a4)[2]; 00768 a6->s6_bytes[15] = ((CONST UCHAR *) a4)[3]; 00769 } 00770 00771 MSTCPIP_INLINE 00772 VOID 00773 IN6_SET_ADDR_SOLICITEDNODE( 00774 OUT PIN6_ADDR Multicast, 00775 IN CONST IN6_ADDR *Unicast) 00776 { 00777 *Multicast = in6addr_solicitednodemulticastprefix; 00778 Multicast->s6_bytes[13] = Unicast->s6_bytes[13]; 00779 Multicast->s6_bytes[14] = Unicast->s6_bytes[14]; 00780 Multicast->s6_bytes[15] = Unicast->s6_bytes[15]; 00781 } 00782 00783 MSTCPIP_INLINE 00784 VOID 00785 IN6_SET_ISATAP_IDENTIFIER( 00786 IN OUT IN6_ADDR *Ipv6Address, 00787 IN CONST IN_ADDR *Ipv4Address) 00788 { 00789 if (IN4_IS_ADDR_6TO4ELIGIBLE(Ipv4Address)) { 00790 Ipv6Address->s6_words[4] = 0x0002; 00791 } else { 00792 Ipv6Address->s6_words[4] = 0x0000; 00793 } 00794 Ipv6Address->s6_words[5] = 0xFE5E; 00795 *((UNALIGNED IN_ADDR *) (Ipv6Address->s6_words + 6)) = *Ipv4Address; 00796 } 00797 00798 MSTCPIP_INLINE 00799 VOID 00800 IN6_SET_6TO4_PREFIX( 00801 IN OUT IN6_ADDR *Ipv6Address, 00802 IN CONST IN_ADDR *Ipv4Address) 00803 { 00804 Ipv6Address->s6_words[0] = 0x0220; 00805 *((UNALIGNED IN_ADDR *) (Ipv6Address->s6_words + 1)) = *Ipv4Address; 00806 Ipv6Address->s6_words[3] = 0x0000; 00807 } 00808 00809 MSTCPIP_INLINE 00810 SCOPE_LEVEL 00811 Ipv6UnicastAddressScope( 00812 IN CONST UCHAR *Address) 00813 { 00814 IN6_ADDR Ipv6Address; 00815 00816 if (!INET_IS_ALIGNED(Address, IN6_ADDR)) { 00817 Ipv6Address = *(CONST IN6_ADDR UNALIGNED *)Address; 00818 Address = (CONST UCHAR *) &Ipv6Address; 00819 } 00820 if (IN6_IS_ADDR_LINKLOCAL((PIN6_ADDR) Address) || 00821 IN6_IS_ADDR_LOOPBACK((PIN6_ADDR) Address)) { 00822 return ScopeLevelLink; 00823 } else if (IN6_IS_ADDR_SITELOCAL((PIN6_ADDR) Address)) { 00824 return ScopeLevelSite; 00825 } else { 00826 return ScopeLevelGlobal; 00827 } 00828 } 00829 00830 MSTCPIP_INLINE 00831 SCOPE_LEVEL 00832 IN6_MULTICAST_SCOPE( 00833 IN CONST UCHAR *Address) 00834 { 00835 PIN6_ADDR Ipv6Address = (PIN6_ADDR) Address; 00836 return (SCOPE_LEVEL)(Ipv6Address->s6_bytes[1] & 0xf); 00837 } 00838 00839 MSTCPIP_INLINE 00840 SCOPE_LEVEL 00841 Ipv6AddressScope( 00842 IN CONST UCHAR *Address) 00843 { 00844 if (IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR *) Address)) { 00845 return IN6_MULTICAST_SCOPE(Address); 00846 } else { 00847 return Ipv6UnicastAddressScope(Address); 00848 } 00849 } 00850 00851 MSTCPIP_INLINE 00852 NL_ADDRESS_TYPE 00853 Ipv6AddressType( 00854 IN CONST UCHAR *Address) 00855 { 00856 CONST IN6_ADDR *Ipv6Address = (CONST IN6_ADDR *) Address; 00857 CONST UCHAR *Ipv4Address; 00858 00859 if (IN6_IS_ADDR_MULTICAST(Ipv6Address)) { 00860 return NlatMulticast; 00861 } 00862 if (IN6_IS_ADDR_UNSPECIFIED(Ipv6Address)) { 00863 return NlatUnspecified; 00864 } 00865 if (IN6_IS_ADDR_ISATAP(Ipv6Address) || IN6_IS_ADDR_V4COMPAT(Ipv6Address) || 00866 IN6_IS_ADDR_V4MAPPED(Ipv6Address) || IN6_IS_ADDR_V4TRANSLATED(Ipv6Address)) { 00867 Ipv4Address = IN6_EXTRACT_V4ADDR_FROM_ISATAP(Ipv6Address); 00868 } else if (IN6_IS_ADDR_6TO4(Ipv6Address)) { 00869 Ipv4Address = IN6_EXTRACT_V4ADDR_FROM_6TO4(Ipv6Address); 00870 } else { 00871 return NlatUnicast; 00872 } 00873 if (Ipv4AddressType(Ipv4Address) != NlatUnicast) { 00874 return NlatInvalid; 00875 } 00876 return NlatUnicast; 00877 } 00878 00879 MSTCPIP_INLINE 00880 VOID 00881 IN6_UNCANONICALIZE_SCOPE_ID( 00882 IN CONST IN6_ADDR *Address, 00883 IN OUT SCOPE_ID *ScopeId) 00884 { 00885 SCOPE_LEVEL ScopeLevel = Ipv6AddressScope((CONST UCHAR *)Address); 00886 00887 if ((IN6_IS_ADDR_LOOPBACK(Address)) || (ScopeLevel == ScopeLevelGlobal)) { 00888 ScopeId->Value = 0; 00889 } 00890 if ((SCOPE_LEVEL)ScopeId->Level == ScopeLevel) { 00891 ScopeId->Level = 0; 00892 } 00893 } 00894 00895 #if (NTDDI_VERSION >= NTDDI_VISTA) 00896 00897 MSTCPIP_INLINE 00898 VOID 00899 IN6ADDR_SETSOCKADDR( 00900 OUT PSOCKADDR_IN6 a, 00901 IN CONST IN6_ADDR *addr, 00902 IN SCOPE_ID scope, 00903 IN USHORT port) 00904 { 00905 a->sin6_family = AF_INET6; 00906 a->sin6_port = port; 00907 a->sin6_flowinfo = 0; 00908 RtlCopyMemory(&a->sin6_addr, addr, sizeof(IN6_ADDR)); 00909 a->sin6_scope_struct = scope; 00910 IN6_UNCANONICALIZE_SCOPE_ID(&a->sin6_addr, &a->sin6_scope_struct); 00911 } 00912 00913 MSTCPIP_INLINE 00914 VOID 00915 IN6ADDR_SETV4MAPPED( 00916 OUT PSOCKADDR_IN6 a6, 00917 IN CONST IN_ADDR* a4, 00918 IN SCOPE_ID scope, 00919 IN USHORT port) 00920 { 00921 a6->sin6_family = AF_INET6; 00922 a6->sin6_port = port; 00923 a6->sin6_flowinfo = 0; 00924 IN6_SET_ADDR_V4MAPPED(&a6->sin6_addr, a4); 00925 a6->sin6_scope_struct = scope; 00926 IN4_UNCANONICALIZE_SCOPE_ID(a4, &a6->sin6_scope_struct); 00927 } 00928 00929 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ 00930 00931 MSTCPIP_INLINE 00932 BOOLEAN 00933 INET_ADDR_EQUAL( 00934 IN ADDRESS_FAMILY af, 00935 IN CONST VOID* a, 00936 IN CONST VOID* b) 00937 { 00938 if (af == AF_INET6) { 00939 return IN6_ADDR_EQUAL((CONST IN6_ADDR*)a, (CONST IN6_ADDR*)b); 00940 } else { 00941 ASSERT(af == AF_INET); 00942 return IN4_ADDR_EQUAL((CONST IN_ADDR*)a, (CONST IN_ADDR*)b); 00943 } 00944 } 00945 00946 MSTCPIP_INLINE 00947 BOOLEAN 00948 INET_UNALIGNED_ADDR_EQUAL( 00949 IN ADDRESS_FAMILY af, 00950 IN CONST VOID* a, 00951 IN CONST VOID* b) 00952 { 00953 if (af == AF_INET6) { 00954 return IN6_ADDR_EQUAL((CONST IN6_ADDR*)a, (CONST IN6_ADDR*)b); 00955 } else { 00956 ASSERT(af == AF_INET); 00957 return IN4_UNALIGNED_ADDR_EQUAL((CONST IN_ADDR*)a, (CONST IN_ADDR*)b); 00958 } 00959 } 00960 00961 MSTCPIP_INLINE 00962 BOOLEAN 00963 INET_IS_ADDR_UNSPECIFIED( 00964 IN ADDRESS_FAMILY af, 00965 IN CONST VOID* a) 00966 { 00967 if (af == AF_INET6) { 00968 return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR*)a); 00969 } else { 00970 ASSERT(af == AF_INET); 00971 return IN4_IS_ADDR_UNSPECIFIED((CONST IN_ADDR*)a); 00972 } 00973 } 00974 00975 MSTCPIP_INLINE 00976 BOOLEAN 00977 INET_IS_UNALIGNED_ADDR_UNSPECIFIED( 00978 IN ADDRESS_FAMILY af, 00979 IN CONST VOID* a) 00980 { 00981 if (af == AF_INET6) { 00982 return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR*)a); 00983 } else { 00984 ASSERT(af == AF_INET); 00985 return IN4_IS_UNALIGNED_ADDR_UNSPECIFIED((CONST IN_ADDR UNALIGNED*)a); 00986 } 00987 } 00988 00989 MSTCPIP_INLINE 00990 BOOLEAN 00991 INET_IS_ADDR_LOOPBACK( 00992 IN ADDRESS_FAMILY af, 00993 IN CONST VOID* a) 00994 { 00995 if (af == AF_INET6) { 00996 return IN6_IS_ADDR_LOOPBACK((CONST IN6_ADDR*)a); 00997 } else { 00998 ASSERT(af == AF_INET); 00999 return IN4_IS_ADDR_LOOPBACK((CONST IN_ADDR*)a); 01000 } 01001 } 01002 01003 MSTCPIP_INLINE 01004 BOOLEAN 01005 INET_IS_ADDR_BROADCAST( 01006 IN ADDRESS_FAMILY af, 01007 IN CONST VOID* a) 01008 { 01009 if (af == AF_INET6) { 01010 return FALSE; 01011 } else { 01012 ASSERT(af == AF_INET); 01013 return IN4_IS_ADDR_BROADCAST((CONST IN_ADDR*)a); 01014 } 01015 } 01016 01017 MSTCPIP_INLINE 01018 BOOLEAN 01019 INET_IS_ADDR_MULTICAST( 01020 IN ADDRESS_FAMILY af, 01021 IN CONST VOID* a) 01022 { 01023 if (af == AF_INET6) { 01024 return IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR*)a); 01025 } else { 01026 ASSERT(af == AF_INET); 01027 return IN4_IS_ADDR_MULTICAST((CONST IN_ADDR*)a); 01028 } 01029 } 01030 01031 MSTCPIP_INLINE 01032 CONST UCHAR* 01033 INET_ADDR_UNSPECIFIED( 01034 IN ADDRESS_FAMILY af) 01035 { 01036 if (af == AF_INET6) { 01037 return (CONST UCHAR*)&in6addr_any; 01038 } else { 01039 ASSERT(af == AF_INET); 01040 return (CONST UCHAR*)&in4addr_any; 01041 } 01042 } 01043 01044 MSTCPIP_INLINE 01045 VOID 01046 INET_SET_ADDRESS( 01047 IN ADDRESS_FAMILY Family, 01048 OUT PUCHAR Address, 01049 IN CONST UCHAR *Value) 01050 { 01051 if (Family == AF_INET6) { 01052 *((PIN6_ADDR)Address) = *((PIN6_ADDR)Value); 01053 } else { 01054 ASSERT(Family == AF_INET); 01055 *((PIN_ADDR)Address) = *((PIN_ADDR)Value); 01056 } 01057 } 01058 01059 MSTCPIP_INLINE 01060 SIZE_T 01061 INET_ADDR_LENGTH( 01062 IN ADDRESS_FAMILY af) 01063 { 01064 if (af == AF_INET6) { 01065 return sizeof(IN6_ADDR); 01066 } else { 01067 ASSERT(af == AF_INET); 01068 return sizeof(IN_ADDR); 01069 } 01070 } 01071 01072 MSTCPIP_INLINE 01073 SIZE_T 01074 INET_SOCKADDR_LENGTH( 01075 IN ADDRESS_FAMILY af) 01076 { 01077 if (af == AF_INET6) { 01078 return sizeof(SOCKADDR_IN6); 01079 } else { 01080 ASSERT(af == AF_INET); 01081 return sizeof(SOCKADDR_IN); 01082 } 01083 } 01084 01085 #if (NTDDI_VERSION >= NTDDI_VISTA) 01086 MSTCPIP_INLINE 01087 VOID 01088 INETADDR_SETSOCKADDR( 01089 IN ADDRESS_FAMILY af, 01090 OUT PSOCKADDR a, 01091 IN CONST VOID* addr, 01092 IN SCOPE_ID scope, 01093 IN USHORT port) 01094 { 01095 if (af == AF_INET6) { 01096 IN6ADDR_SETSOCKADDR((PSOCKADDR_IN6) a, (CONST IN6_ADDR *) addr, scope, port); 01097 } else { 01098 CONST IN_ADDR addr4 = *((IN_ADDR UNALIGNED *) addr); 01099 ASSERT(af == AF_INET); 01100 IN4ADDR_SETSOCKADDR((PSOCKADDR_IN) a, (CONST IN_ADDR *) &addr4, port); 01101 } 01102 } 01103 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ 01104 01105 MSTCPIP_INLINE 01106 VOID 01107 INETADDR_SETANY( 01108 OUT PSOCKADDR a) 01109 { 01110 if (a->sa_family == AF_INET6) { 01111 IN6ADDR_SETANY((PSOCKADDR_IN6)a); 01112 } else { 01113 ASSERT(a->sa_family == AF_INET); 01114 IN4ADDR_SETANY((PSOCKADDR_IN)a); 01115 } 01116 } 01117 01118 MSTCPIP_INLINE 01119 VOID 01120 INETADDR_SETLOOPBACK( 01121 OUT PSOCKADDR a) 01122 { 01123 if (a->sa_family == AF_INET6) { 01124 IN6ADDR_SETLOOPBACK((PSOCKADDR_IN6)a); 01125 } else { 01126 ASSERT(a->sa_family == AF_INET); 01127 IN4ADDR_SETLOOPBACK((PSOCKADDR_IN)a); 01128 } 01129 } 01130 01131 MSTCPIP_INLINE 01132 BOOLEAN 01133 INETADDR_ISANY( 01134 IN CONST SOCKADDR *a) 01135 { 01136 if (a->sa_family == AF_INET6) { 01137 return IN6ADDR_ISANY((CONST SOCKADDR_IN6*)a); 01138 } else { 01139 ASSERT(a->sa_family == AF_INET); 01140 return IN4ADDR_ISANY((CONST SOCKADDR_IN*)a); 01141 } 01142 } 01143 01144 MSTCPIP_INLINE 01145 BOOLEAN 01146 INETADDR_ISLOOPBACK( 01147 IN CONST SOCKADDR *a) 01148 { 01149 if (a->sa_family == AF_INET6) { 01150 return IN6ADDR_ISLOOPBACK((CONST SOCKADDR_IN6*)a); 01151 } else { 01152 ASSERT(a->sa_family == AF_INET); 01153 return IN4ADDR_ISLOOPBACK((CONST SOCKADDR_IN*)a); 01154 } 01155 } 01156 01157 MSTCPIP_INLINE 01158 BOOLEAN 01159 INETADDR_ISV4MAPPED(IN CONST SOCKADDR *a) 01160 { 01161 if (a->sa_family == AF_INET6) { 01162 return IN6ADDR_ISV4MAPPED((CONST SOCKADDR_IN6*)a); 01163 } else { 01164 return FALSE; 01165 } 01166 } 01167 01168 MSTCPIP_INLINE 01169 BOOLEAN 01170 NL_ADDR_EQUAL( 01171 IN ADDRESS_FAMILY af, 01172 IN SCOPE_ID sa, 01173 IN CONST UCHAR* aa, 01174 IN SCOPE_ID sb, 01175 IN CONST UCHAR* ab) 01176 { 01177 return (BOOLEAN)((sa.Value == sb.Value) && INET_ADDR_EQUAL(af, aa, ab)); 01178 } 01179 01180 MSTCPIP_INLINE 01181 BOOLEAN 01182 NL_IS_ADDR_UNSPECIFIED( 01183 IN ADDRESS_FAMILY af, 01184 IN SCOPE_ID s, 01185 IN CONST UCHAR* a) 01186 { 01187 return (BOOLEAN)((s.Value == 0) && INET_IS_ADDR_UNSPECIFIED(af, a)); 01188 } 01189 01190 MSTCPIP_INLINE 01191 BOOLEAN 01192 INETADDR_ISEQUAL( 01193 IN CONST SOCKADDR *a, 01194 IN CONST SOCKADDR *b) 01195 { 01196 if (a->sa_family == AF_INET6) { 01197 return (BOOLEAN) (b->sa_family == AF_INET6 && 01198 IN6ADDR_ISEQUAL((CONST SOCKADDR_IN6*)a, (CONST SOCKADDR_IN6*)b)); 01199 } else { 01200 ASSERT(a->sa_family == AF_INET); 01201 return (BOOLEAN) (b->sa_family == AF_INET && 01202 IN4ADDR_ISEQUAL((CONST SOCKADDR_IN*)a, (CONST SOCKADDR_IN*)b)); 01203 } 01204 } 01205 01206 MSTCPIP_INLINE 01207 BOOLEAN 01208 INETADDR_ISUNSPECIFIED( 01209 IN CONST SOCKADDR *a) 01210 { 01211 if (a->sa_family == AF_INET6) { 01212 return IN6ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN6*)a); 01213 } else { 01214 ASSERT(a->sa_family == AF_INET); 01215 return IN4ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN*)a); 01216 } 01217 } 01218 01219 #if (NTDDI_VERSION >= NTDDI_VISTA) 01220 MSTCPIP_INLINE 01221 SCOPE_ID 01222 INETADDR_SCOPE_ID( 01223 IN CONST SOCKADDR *a) 01224 { 01225 if (a->sa_family == AF_INET6) { 01226 return ((CONST SOCKADDR_IN6*)a)->sin6_scope_struct; 01227 } else { 01228 ASSERT(a->sa_family == AF_INET); 01229 return IN4ADDR_SCOPE_ID((CONST SOCKADDR_IN*)a); 01230 } 01231 } 01232 #endif 01233 01234 MSTCPIP_INLINE 01235 USHORT 01236 INETADDR_PORT( 01237 IN CONST SOCKADDR *a) 01238 { 01239 if (a->sa_family == AF_INET6) { 01240 return ((CONST SOCKADDR_IN6*)a)->sin6_port; 01241 } else { 01242 ASSERT(a->sa_family == AF_INET); 01243 return ((CONST SOCKADDR_IN*)a)->sin_port; 01244 } 01245 } 01246 01247 MSTCPIP_INLINE 01248 PUCHAR 01249 INETADDR_ADDRESS( 01250 IN CONST SOCKADDR* a) 01251 { 01252 if (a->sa_family == AF_INET6) { 01253 return (PUCHAR)&((PSOCKADDR_IN6)a)->sin6_addr; 01254 } else { 01255 ASSERT(a->sa_family == AF_INET); 01256 return (PUCHAR)&((PSOCKADDR_IN)a)->sin_addr; 01257 } 01258 } 01259 01260 MSTCPIP_INLINE 01261 VOID 01262 INETADDR_SET_PORT( 01263 IN OUT PSOCKADDR a, 01264 IN USHORT Port) 01265 { 01266 SS_PORT(a) = Port; 01267 } 01268 01269 MSTCPIP_INLINE 01270 VOID 01271 INETADDR_SET_ADDRESS( 01272 IN OUT PSOCKADDR a, 01273 IN CONST UCHAR *Address) 01274 { 01275 if (a->sa_family == AF_INET6) { 01276 ((PSOCKADDR_IN6)a)->sin6_addr = *((CONST IN6_ADDR*)Address); 01277 } else { 01278 ASSERT(a->sa_family == AF_INET); 01279 ((PSOCKADDR_IN)a)->sin_addr = *((CONST IN_ADDR*)Address); 01280 } 01281 } 01282 01283 MSTCPIP_INLINE 01284 VOID 01285 INET_UNCANONICALIZE_SCOPE_ID( 01286 IN ADDRESS_FAMILY AddressFamily, 01287 IN CONST UCHAR *Address, 01288 IN OUT SCOPE_ID *ScopeId) 01289 { 01290 if (AddressFamily == AF_INET6) { 01291 IN6_UNCANONICALIZE_SCOPE_ID((CONST IN6_ADDR*) Address, ScopeId); 01292 } else { 01293 IN4_UNCANONICALIZE_SCOPE_ID((CONST IN_ADDR*) Address, ScopeId); 01294 } 01295 } 01296 01297 #endif /* _WS2IPDEF_ */ 01298 01299 #ifndef __IP2STRING__ 01300 #define __IP2STRING__ 01301 01302 #if (NTDDI_VERSION >= NTDDI_VISTA) 01303 01304 #ifdef _WS2DEF_ 01305 01306 NTSYSAPI 01307 PSTR 01308 NTAPI 01309 RtlIpv4AddressToStringA( 01310 IN const struct in_addr *Addr, 01311 OUT PSTR S); 01312 01313 NTSYSAPI 01314 LONG 01315 NTAPI 01316 RtlIpv4AddressToStringExA( 01317 IN const struct in_addr *Address, 01318 IN USHORT Port, 01319 OUT PSTR AddressString, 01320 IN OUT PULONG AddressStringLength); 01321 01322 NTSYSAPI 01323 PWSTR 01324 NTAPI 01325 RtlIpv4AddressToStringW( 01326 IN const struct in_addr *Addr, 01327 OUT PWSTR S); 01328 01329 NTSYSAPI 01330 LONG 01331 NTAPI 01332 RtlIpv4AddressToStringExW( 01333 IN const struct in_addr *Address, 01334 IN USHORT Port, 01335 OUT PWSTR AddressString, 01336 IN OUT PULONG AddressStringLength); 01337 01338 NTSYSAPI 01339 LONG 01340 NTAPI 01341 RtlIpv4StringToAddressA( 01342 IN PCSTR S, 01343 IN BOOLEAN Strict, 01344 OUT PCSTR *Terminator, 01345 OUT struct in_addr *Addr); 01346 01347 NTSYSAPI 01348 LONG 01349 NTAPI 01350 RtlIpv4StringToAddressExA( 01351 IN PCSTR AddressString, 01352 IN BOOLEAN Strict, 01353 OUT struct in_addr *Address, 01354 OUT PUSHORT Port); 01355 01356 NTSYSAPI 01357 LONG 01358 NTAPI 01359 RtlIpv4StringToAddressW( 01360 IN PCWSTR S, 01361 IN BOOLEAN Strict, 01362 OUT LPCWSTR *Terminator, 01363 OUT struct in_addr *Addr); 01364 01365 NTSYSAPI 01366 LONG 01367 NTAPI 01368 RtlIpv4StringToAddressExW( 01369 IN PCWSTR AddressString, 01370 IN BOOLEAN Strict, 01371 OUT struct in_addr *Address, 01372 OUT PUSHORT Port); 01373 01374 #ifdef UNICODE 01375 #define RtlIpv4AddressToString RtlIpv4AddressToStringW 01376 #define RtlIpv4StringToAddress RtlIpv4StringToAddressW 01377 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExW 01378 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExW 01379 #else 01380 #define RtlIpv4AddressToString RtlIpv4AddressToStringA 01381 #define RtlIpv4StringToAddress RtlIpv4StringToAddressA 01382 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExA 01383 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExA 01384 #endif 01385 01386 #endif /* _WS2DEF_ */ 01387 01388 #ifdef _WS2IPDEF_ 01389 01390 NTSYSAPI 01391 PSTR 01392 NTAPI 01393 RtlIpv6AddressToStringA( 01394 IN const struct in6_addr *Addr, 01395 OUT PSTR S); 01396 01397 NTSYSAPI 01398 LONG 01399 NTAPI 01400 RtlIpv6AddressToStringExA( 01401 IN const struct in6_addr *Address, 01402 IN ULONG ScopeId, 01403 IN USHORT Port, 01404 OUT PSTR AddressString, 01405 IN OUT PULONG AddressStringLength); 01406 01407 NTSYSAPI 01408 PWSTR 01409 NTAPI 01410 RtlIpv6AddressToStringW( 01411 IN const struct in6_addr *Addr, 01412 OUT PWSTR S); 01413 01414 NTSYSAPI 01415 LONG 01416 NTAPI 01417 RtlIpv6AddressToStringExW( 01418 IN const struct in6_addr *Address, 01419 IN ULONG ScopeId, 01420 IN USHORT Port, 01421 OUT PWSTR AddressString, 01422 IN OUT PULONG AddressStringLength); 01423 01424 NTSYSAPI 01425 LONG 01426 NTAPI 01427 RtlIpv6StringToAddressA( 01428 IN PCSTR S, 01429 OUT PCSTR *Terminator, 01430 OUT struct in6_addr *Addr); 01431 01432 NTSYSAPI 01433 LONG 01434 NTAPI 01435 RtlIpv6StringToAddressExA( 01436 IN PCSTR AddressString, 01437 OUT struct in6_addr *Address, 01438 OUT PULONG ScopeId, 01439 OUT PUSHORT Port); 01440 01441 NTSYSAPI 01442 LONG 01443 NTAPI 01444 RtlIpv6StringToAddressW( 01445 IN PCWSTR S, 01446 OUT PCWSTR *Terminator, 01447 OUT struct in6_addr *Addr); 01448 01449 NTSYSAPI 01450 LONG 01451 NTAPI 01452 RtlIpv6StringToAddressExW( 01453 IN PCWSTR AddressString, 01454 OUT struct in6_addr *Address, 01455 OUT PULONG ScopeId, 01456 OUT PUSHORT Port); 01457 01458 #ifdef UNICODE 01459 #define RtlIpv6AddressToString RtlIpv6AddressToStringW 01460 #define RtlIpv6StringToAddress RtlIpv6StringToAddressW 01461 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExW 01462 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExW 01463 #else 01464 #define RtlIpv6AddressToString RtlIpv6AddressToStringA 01465 #define RtlIpv6StringToAddress RtlIpv6StringToAddressA 01466 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExA 01467 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExA 01468 #endif 01469 01470 #endif /* __WS2IPDEF__ */ 01471 01472 #ifdef _WS2DEF_ 01473 01474 union _DL_EUI48; 01475 typedef union _DL_EUI48 DL_EUI48, *PDL_EUI48; 01476 01477 NTSYSAPI 01478 PSTR 01479 NTAPI 01480 RtlEthernetAddressToStringA( 01481 IN const DL_EUI48 *Addr, 01482 OUT PSTR S); 01483 01484 NTSYSAPI 01485 PWSTR 01486 NTAPI 01487 RtlEthernetAddressToStringW( 01488 IN const DL_EUI48 *Addr, 01489 OUT PWSTR S); 01490 01491 NTSYSAPI 01492 LONG 01493 NTAPI 01494 RtlEthernetStringToAddressA( 01495 IN PCSTR S, 01496 OUT PCSTR *Terminator, 01497 OUT DL_EUI48 *Addr); 01498 01499 NTSYSAPI 01500 LONG 01501 NTAPI 01502 RtlEthernetStringToAddressW( 01503 IN PCWSTR S, 01504 OUT LPCWSTR *Terminator, 01505 OUT DL_EUI48 *Addr); 01506 01507 #ifdef UNICODE 01508 #define RtlEthernetAddressToString RtlEthernetAddressToStringW 01509 #define RtlEthernetStringToAddress RtlEthernetStringToAddressW 01510 #else 01511 #define RtlEthernetAddressToString RtlEthernetAddressToStringA 01512 #define RtlEthernetStringToAddress RtlEthernetStringToAddressA 01513 #endif 01514 01515 #endif /* _WS2DEF_ */ 01516 01517 #endif /* (NTDDI >= NTDDI_VISTA) */ 01518 01519 #endif /* __IP2STRING__ */ 01520 01521 #ifdef __cplusplus 01522 } 01523 #endif Generated on Sat May 26 2012 04:30:46 for ReactOS by
1.7.6.1
|