1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #ifndef IP_TYPES_INCLUDED
7 #define IP_TYPES_INCLUDED
8 
9 #include <winapifamily.h>
10 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP) || _WIN32_WINNT >= 0x0A00
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 #include <time.h>
17 #include <ifdef.h>
18 #include <nldef.h>
19 
20 #define MAX_ADAPTER_DESCRIPTION_LENGTH 128
21 #define MAX_ADAPTER_NAME_LENGTH 256
22 #define MAX_ADAPTER_ADDRESS_LENGTH 8
23 #define DEFAULT_MINIMUM_ENTITIES 32
24 #define MAX_HOSTNAME_LEN 128
25 #define MAX_DOMAIN_NAME_LEN 128
26 #define MAX_SCOPE_ID_LEN 256
27 #define MAX_DHCPV6_DUID_LENGTH 130
28 #define MAX_DNS_SUFFIX_STRING_LENGTH 256
29 
30 #define BROADCAST_NODETYPE 1
31 #define PEER_TO_PEER_NODETYPE 2
32 #define MIXED_NODETYPE 4
33 #define HYBRID_NODETYPE 8
34 
35   typedef struct {
36     char String[4*4];
37   } IP_ADDRESS_STRING,*PIP_ADDRESS_STRING,IP_MASK_STRING,*PIP_MASK_STRING;
38 
39   typedef struct _IP_ADDR_STRING {
40     struct _IP_ADDR_STRING *Next;
41     IP_ADDRESS_STRING IpAddress;
42     IP_MASK_STRING IpMask;
43     DWORD Context;
44   } IP_ADDR_STRING,*PIP_ADDR_STRING;
45 
46   typedef struct _IP_ADAPTER_INFO {
47     struct _IP_ADAPTER_INFO *Next;
48     DWORD ComboIndex;
49     char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
50     char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
51     UINT AddressLength;
52     BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
53     DWORD Index;
54     UINT Type;
55     UINT DhcpEnabled;
56     PIP_ADDR_STRING CurrentIpAddress;
57     IP_ADDR_STRING IpAddressList;
58     IP_ADDR_STRING GatewayList;
59     IP_ADDR_STRING DhcpServer;
60     WINBOOL HaveWins;
61     IP_ADDR_STRING PrimaryWinsServer;
62     IP_ADDR_STRING SecondaryWinsServer;
63     time_t LeaseObtained;
64     time_t LeaseExpires;
65   } IP_ADAPTER_INFO,*PIP_ADAPTER_INFO;
66 
67 #ifdef _WINSOCK2API_
68 
69   typedef NL_PREFIX_ORIGIN IP_PREFIX_ORIGIN;
70   typedef NL_SUFFIX_ORIGIN IP_SUFFIX_ORIGIN;
71   typedef NL_DAD_STATE IP_DAD_STATE;
72 
73   typedef struct _IP_ADAPTER_UNICAST_ADDRESS_XP {
74     __C89_NAMELESS union {
75       ULONGLONG Alignment;
76       __C89_NAMELESS struct {
77 	ULONG Length;
78 	DWORD Flags;
79       };
80     };
81     struct _IP_ADAPTER_UNICAST_ADDRESS_XP *Next;
82     SOCKET_ADDRESS Address;
83     IP_PREFIX_ORIGIN PrefixOrigin;
84     IP_SUFFIX_ORIGIN SuffixOrigin;
85     IP_DAD_STATE DadState;
86     ULONG ValidLifetime;
87     ULONG PreferredLifetime;
88     ULONG LeaseLifetime;
89   } IP_ADAPTER_UNICAST_ADDRESS_XP,*PIP_ADAPTER_UNICAST_ADDRESS_XP;
90 
91   typedef struct _IP_ADAPTER_UNICAST_ADDRESS_LH {
92     __C89_NAMELESS union {
93       ULONGLONG Alignment;
94       __C89_NAMELESS struct {
95 	ULONG Length;
96 	DWORD Flags;
97       };
98     };
99     struct _IP_ADAPTER_UNICAST_ADDRESS_LH *Next;
100     SOCKET_ADDRESS Address;
101     IP_PREFIX_ORIGIN PrefixOrigin;
102     IP_SUFFIX_ORIGIN SuffixOrigin;
103     IP_DAD_STATE DadState;
104     ULONG ValidLifetime;
105     ULONG PreferredLifetime;
106     ULONG LeaseLifetime;
107     UINT8 OnLinkPrefixLength;
108   } IP_ADAPTER_UNICAST_ADDRESS_LH,*PIP_ADAPTER_UNICAST_ADDRESS_LH;
109 
110 #if (_WIN32_WINNT >= 0x0600)
111   typedef IP_ADAPTER_UNICAST_ADDRESS_LH   IP_ADAPTER_UNICAST_ADDRESS;
112   typedef IP_ADAPTER_UNICAST_ADDRESS_LH *PIP_ADAPTER_UNICAST_ADDRESS;
113 #else /* _WIN32_WINNT >= 0x0501 */
114   typedef IP_ADAPTER_UNICAST_ADDRESS_XP   IP_ADAPTER_UNICAST_ADDRESS;
115   typedef IP_ADAPTER_UNICAST_ADDRESS_XP *PIP_ADAPTER_UNICAST_ADDRESS;
116 #endif
117 
118   typedef struct _IP_ADAPTER_ANYCAST_ADDRESS_XP {
119     __C89_NAMELESS union {
120       ULONGLONG Alignment;
121       __C89_NAMELESS struct {
122 	ULONG Length;
123 	DWORD Flags;
124       };
125     };
126     struct _IP_ADAPTER_ANYCAST_ADDRESS_XP *Next;
127     SOCKET_ADDRESS Address;
128   } IP_ADAPTER_ANYCAST_ADDRESS_XP,*PIP_ADAPTER_ANYCAST_ADDRESS_XP;
129   typedef IP_ADAPTER_ANYCAST_ADDRESS_XP   IP_ADAPTER_ANYCAST_ADDRESS;
130   typedef IP_ADAPTER_ANYCAST_ADDRESS_XP *PIP_ADAPTER_ANYCAST_ADDRESS;
131 
132   typedef struct _IP_ADAPTER_MULTICAST_ADDRESS_XP {
133     __C89_NAMELESS union {
134       ULONGLONG Alignment;
135       __C89_NAMELESS struct {
136 	ULONG Length;
137 	DWORD Flags;
138       };
139     };
140     struct _IP_ADAPTER_MULTICAST_ADDRESS_XP *Next;
141     SOCKET_ADDRESS Address;
142   } IP_ADAPTER_MULTICAST_ADDRESS_XP,*PIP_ADAPTER_MULTICAST_ADDRESS_XP;
143   typedef IP_ADAPTER_MULTICAST_ADDRESS_XP   IP_ADAPTER_MULTICAST_ADDRESS;
144   typedef IP_ADAPTER_MULTICAST_ADDRESS_XP *PIP_ADAPTER_MULTICAST_ADDRESS;
145 
146 #define IP_ADAPTER_ADDRESS_DNS_ELIGIBLE 0x01
147 #define IP_ADAPTER_ADDRESS_TRANSIENT 0x02
148 #define IP_ADAPTER_ADDRESS_PRIMARY 0x04
149 
150   typedef struct _IP_ADAPTER_DNS_SERVER_ADDRESS_XP {
151     __C89_NAMELESS union {
152       ULONGLONG Alignment;
153       __C89_NAMELESS struct {
154 	ULONG Length;
155 	DWORD Reserved;
156       };
157     };
158     struct _IP_ADAPTER_DNS_SERVER_ADDRESS_XP *Next;
159     SOCKET_ADDRESS Address;
160   } IP_ADAPTER_DNS_SERVER_ADDRESS_XP,*PIP_ADAPTER_DNS_SERVER_ADDRESS_XP;
161   typedef IP_ADAPTER_DNS_SERVER_ADDRESS_XP   IP_ADAPTER_DNS_SERVER_ADDRESS;
162   typedef IP_ADAPTER_DNS_SERVER_ADDRESS_XP *PIP_ADAPTER_DNS_SERVER_ADDRESS;
163 
164   typedef struct _IP_ADAPTER_PREFIX_XP {
165     __C89_NAMELESS union {
166       ULONGLONG Alignment;
167       __C89_NAMELESS struct {
168 	ULONG Length;
169 	DWORD Flags;
170       };
171     };
172     struct _IP_ADAPTER_PREFIX_XP *Next;
173     SOCKET_ADDRESS Address;
174     ULONG PrefixLength;
175   } IP_ADAPTER_PREFIX_XP,*PIP_ADAPTER_PREFIX_XP;
176   typedef IP_ADAPTER_PREFIX_XP   IP_ADAPTER_PREFIX;
177   typedef IP_ADAPTER_PREFIX_XP *PIP_ADAPTER_PREFIX;
178 
179   typedef struct _IP_ADAPTER_WINS_SERVER_ADDRESS_LH {
180     __C89_NAMELESS union {
181       ULONGLONG Alignment;
182       __C89_NAMELESS struct {
183 	ULONG Length;
184 	DWORD Reserved;
185       };
186     };
187     struct _IP_ADAPTER_WINS_SERVER_ADDRESS_LH *Next;
188     SOCKET_ADDRESS Address;
189   } IP_ADAPTER_WINS_SERVER_ADDRESS_LH,*PIP_ADAPTER_WINS_SERVER_ADDRESS_LH;
190 #if (_WIN32_WINNT >= 0x0600)
191   typedef IP_ADAPTER_WINS_SERVER_ADDRESS_LH   IP_ADAPTER_WINS_SERVER_ADDRESS;
192   typedef IP_ADAPTER_WINS_SERVER_ADDRESS_LH *PIP_ADAPTER_WINS_SERVER_ADDRESS;
193 #endif
194 
195   typedef struct _IP_ADAPTER_GATEWAY_ADDRESS_LH {
196     __C89_NAMELESS union {
197       ULONGLONG Alignment;
198       __C89_NAMELESS struct {
199 	ULONG Length;
200 	DWORD Reserved;
201       };
202     };
203     struct _IP_ADAPTER_GATEWAY_ADDRESS_LH *Next;
204     SOCKET_ADDRESS Address;
205   } IP_ADAPTER_GATEWAY_ADDRESS_LH,*PIP_ADAPTER_GATEWAY_ADDRESS_LH;
206 #if (_WIN32_WINNT >= 0x0600)
207   typedef IP_ADAPTER_GATEWAY_ADDRESS_LH   IP_ADAPTER_GATEWAY_ADDRESS;
208   typedef IP_ADAPTER_GATEWAY_ADDRESS_LH *PIP_ADAPTER_GATEWAY_ADDRESS;
209 #endif
210 
211   typedef struct _IP_ADAPTER_DNS_SUFFIX {
212     struct _IP_ADAPTER_DNS_SUFFIX *Next;
213     WCHAR String[MAX_DNS_SUFFIX_STRING_LENGTH];
214   } IP_ADAPTER_DNS_SUFFIX, *PIP_ADAPTER_DNS_SUFFIX;
215 
216 #define IP_ADAPTER_DDNS_ENABLED 0x01
217 #define IP_ADAPTER_REGISTER_ADAPTER_SUFFIX 0x02
218 #define IP_ADAPTER_DHCP_ENABLED 0x04
219 #define IP_ADAPTER_RECEIVE_ONLY 0x08
220 #define IP_ADAPTER_NO_MULTICAST 0x10
221 #define IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG 0x20
222 #define IP_ADAPTER_NETBIOS_OVER_TCPIP_ENABLED 0x40
223 #define IP_ADAPTER_IPV4_ENABLED 0x80
224 #define IP_ADAPTER_IPV6_ENABLED 0x100
225 #define IP_ADAPTER_IPV6_MANAGE_ADDRESS_CONFIG 0x200
226 
227   typedef struct _IP_ADAPTER_ADDRESSES_LH {
228     __C89_NAMELESS union {
229       ULONGLONG   Alignment;
230       __C89_NAMELESS struct {
231 	ULONG Length;
232 	IF_INDEX IfIndex;
233       };
234     };
235     struct _IP_ADAPTER_ADDRESSES_LH *Next;
236     PCHAR AdapterName;
237     PIP_ADAPTER_UNICAST_ADDRESS_LH    FirstUnicastAddress;
238     PIP_ADAPTER_ANYCAST_ADDRESS_XP    FirstAnycastAddress;
239     PIP_ADAPTER_MULTICAST_ADDRESS_XP  FirstMulticastAddress;
240     PIP_ADAPTER_DNS_SERVER_ADDRESS_XP FirstDnsServerAddress;
241     PWCHAR DnsSuffix;
242     PWCHAR Description;
243     PWCHAR FriendlyName;
244     BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];
245     ULONG PhysicalAddressLength;
246     __C89_NAMELESS union {
247       ULONG Flags;
248       __C89_NAMELESS struct {
249 	ULONG DdnsEnabled : 1;
250 	ULONG RegisterAdapterSuffix : 1;
251 	ULONG Dhcpv4Enabled : 1;
252 	ULONG ReceiveOnly : 1;
253 	ULONG NoMulticast : 1;
254 	ULONG Ipv6OtherStatefulConfig : 1;
255 	ULONG NetbiosOverTcpipEnabled : 1;
256 	ULONG Ipv4Enabled : 1;
257 	ULONG Ipv6Enabled : 1;
258 	ULONG Ipv6ManagedAddressConfigurationSupported : 1;
259       };
260     };
261     ULONG Mtu;
262     IFTYPE IfType;
263     IF_OPER_STATUS OperStatus;
264     IF_INDEX Ipv6IfIndex;
265     ULONG ZoneIndices[16];
266     PIP_ADAPTER_PREFIX_XP FirstPrefix;
267 
268     ULONG64 TransmitLinkSpeed;
269     ULONG64 ReceiveLinkSpeed;
270     PIP_ADAPTER_WINS_SERVER_ADDRESS_LH FirstWinsServerAddress;
271     PIP_ADAPTER_GATEWAY_ADDRESS_LH     FirstGatewayAddress;
272     ULONG Ipv4Metric;
273     ULONG Ipv6Metric;
274     IF_LUID Luid;
275     SOCKET_ADDRESS Dhcpv4Server;
276     NET_IF_COMPARTMENT_ID CompartmentId;
277     NET_IF_NETWORK_GUID NetworkGuid;
278     NET_IF_CONNECTION_TYPE ConnectionType;
279     TUNNEL_TYPE TunnelType;
280 
281     SOCKET_ADDRESS Dhcpv6Server;
282     BYTE Dhcpv6ClientDuid[MAX_DHCPV6_DUID_LENGTH];
283     ULONG Dhcpv6ClientDuidLength;
284     ULONG Dhcpv6Iaid;
285 #if (NTDDI_VERSION >= 0x06000100) /* NTDDI_VISTASP1 */
286     PIP_ADAPTER_DNS_SUFFIX FirstDnsSuffix;
287 #endif
288   } IP_ADAPTER_ADDRESSES_LH, *PIP_ADAPTER_ADDRESSES_LH;
289 
290   typedef struct _IP_ADAPTER_ADDRESSES_XP {
291     __C89_NAMELESS union {
292       ULONGLONG Alignment;
293       __C89_NAMELESS struct {
294 	ULONG Length;
295 	DWORD IfIndex;
296       };
297     };
298     struct _IP_ADAPTER_ADDRESSES_XP *Next;
299     PCHAR AdapterName;
300     PIP_ADAPTER_UNICAST_ADDRESS_XP    FirstUnicastAddress;
301     PIP_ADAPTER_ANYCAST_ADDRESS_XP    FirstAnycastAddress;
302     PIP_ADAPTER_MULTICAST_ADDRESS_XP  FirstMulticastAddress;
303     PIP_ADAPTER_DNS_SERVER_ADDRESS_XP FirstDnsServerAddress;
304     PWCHAR DnsSuffix;
305     PWCHAR Description;
306     PWCHAR FriendlyName;
307     BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];
308     DWORD PhysicalAddressLength;
309     DWORD Flags;
310     DWORD Mtu;
311     DWORD IfType;
312     IF_OPER_STATUS OperStatus;
313     DWORD Ipv6IfIndex;
314     DWORD ZoneIndices[16];
315     PIP_ADAPTER_PREFIX_XP FirstPrefix;
316   } IP_ADAPTER_ADDRESSES_XP,*PIP_ADAPTER_ADDRESSES_XP;
317 
318 #if (_WIN32_WINNT >= 0x0600)
319   typedef IP_ADAPTER_ADDRESSES_LH   IP_ADAPTER_ADDRESSES;
320   typedef IP_ADAPTER_ADDRESSES_LH *PIP_ADAPTER_ADDRESSES;
321 #else /* _WIN32_WINNT >= 0x0501 */
322   typedef IP_ADAPTER_ADDRESSES_XP   IP_ADAPTER_ADDRESSES;
323   typedef IP_ADAPTER_ADDRESSES_XP *PIP_ADAPTER_ADDRESSES;
324 #endif
325 
326 #define GAA_FLAG_SKIP_UNICAST 0x0001
327 #define GAA_FLAG_SKIP_ANYCAST 0x0002
328 #define GAA_FLAG_SKIP_MULTICAST 0x0004
329 #define GAA_FLAG_SKIP_DNS_SERVER 0x0008
330 #define GAA_FLAG_INCLUDE_PREFIX 0x0010
331 #define GAA_FLAG_SKIP_FRIENDLY_NAME 0x0020
332 #define GAA_FLAG_INCLUDE_WINS_INFO 0x0040
333 #define GAA_FLAG_INCLUDE_GATEWAYS 0x0080
334 #define GAA_FLAG_INCLUDE_ALL_INTERFACES 0x0100
335 #define GAA_FLAG_INCLUDE_ALL_COMPARTMENTS 0x0200
336 #define GAA_FLAG_INCLUDE_TUNNEL_BINDINGORDER 0x0400
337 #endif /* _WINSOCK2API_ */
338 
339   typedef struct _IP_PER_ADAPTER_INFO {
340     UINT AutoconfigEnabled;
341     UINT AutoconfigActive;
342     PIP_ADDR_STRING CurrentDnsServer;
343     IP_ADDR_STRING DnsServerList;
344   } IP_PER_ADAPTER_INFO,*PIP_PER_ADAPTER_INFO;
345 
346   typedef struct {
347     char HostName[MAX_HOSTNAME_LEN + 4];
348     char DomainName[MAX_DOMAIN_NAME_LEN + 4];
349     PIP_ADDR_STRING CurrentDnsServer;
350     IP_ADDR_STRING DnsServerList;
351     UINT NodeType;
352     char ScopeId[MAX_SCOPE_ID_LEN + 4];
353     UINT EnableRouting;
354     UINT EnableProxy;
355     UINT EnableDns;
356   } FIXED_INFO,*PFIXED_INFO;
357 
358 #ifndef IP_INTERFACE_NAME_INFO_DEFINED
359 #define IP_INTERFACE_NAME_INFO_DEFINED
360 
361   typedef struct ip_interface_name_info {
362     ULONG Index;
363     ULONG MediaType;
364     UCHAR ConnectionType;
365     UCHAR AccessType;
366     GUID DeviceGuid;
367     GUID InterfaceGuid;
368   } IP_INTERFACE_NAME_INFO,*PIP_INTERFACE_NAME_INFO;
369 #endif
370 
371 #ifdef __cplusplus
372 }
373 #endif
374 
375 #endif /* #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP) || _WIN32_WINNT >= 0x0A00 */
376 
377 #endif /* IP_TYPES_INCLUDED */
378 
379