ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

mstcpip.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.