1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtNetwork module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file.  Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 #ifndef QNETWORKINTERFACE_WIN_P_H
43 #define QNETWORKINTERFACE_WIN_P_H
44 
45 //
46 //  W A R N I N G
47 //  -------------
48 //
49 // This file is not part of the Qt API.  It exists for the convenience
50 // of the QLibrary class.  This header file may change from
51 // version to version without notice, or even be removed.
52 //
53 // We mean it.
54 //
55 
56 #include <winsock2.h>
57 #include <qt_windows.h>
58 #include <time.h>
59 
60 QT_BEGIN_NAMESPACE
61 
62 #ifndef GAA_FLAG_INCLUDE_ALL_INTERFACES
63 # define GAA_FLAG_INCLUDE_ALL_INTERFACES 0x0100
64 #endif
65 #ifndef MAX_ADAPTER_ADDRESS_LENGTH
66 // definitions from iptypes.h
67 # define MAX_ADAPTER_DESCRIPTION_LENGTH  128 // arb.
68 # define MAX_ADAPTER_NAME_LENGTH         256 // arb.
69 # define MAX_ADAPTER_ADDRESS_LENGTH      8   // arb.
70 # define DEFAULT_MINIMUM_ENTITIES        32  // arb.
71 # define MAX_HOSTNAME_LEN                128 // arb.
72 # define MAX_DOMAIN_NAME_LEN             128 // arb.
73 # define MAX_SCOPE_ID_LEN                256 // arb.
74 
75 # define GAA_FLAG_SKIP_UNICAST       0x0001
76 # define GAA_FLAG_SKIP_ANYCAST       0x0002
77 # define GAA_FLAG_SKIP_MULTICAST     0x0004
78 # define GAA_FLAG_SKIP_DNS_SERVER    0x0008
79 # define GAA_FLAG_INCLUDE_PREFIX     0x0010
80 # define GAA_FLAG_SKIP_FRIENDLY_NAME 0x0020
81 
82 # define IP_ADAPTER_DDNS_ENABLED               0x01
83 # define IP_ADAPTER_REGISTER_ADAPTER_SUFFIX    0x02
84 # define IP_ADAPTER_DHCP_ENABLED               0x04
85 # define IP_ADAPTER_RECEIVE_ONLY               0x08
86 # define IP_ADAPTER_NO_MULTICAST               0x10
87 # define IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG 0x20
88 
89 # define MIB_IF_TYPE_OTHER               1
90 # define MIB_IF_TYPE_ETHERNET            6
91 # define MIB_IF_TYPE_TOKENRING           9
92 # define MIB_IF_TYPE_FDDI                15
93 # define MIB_IF_TYPE_PPP                 23
94 # define MIB_IF_TYPE_LOOPBACK            24
95 # define MIB_IF_TYPE_SLIP                28
96 
97 #endif
98 // copied from qnativesocketengine_win.cpp
99 struct qt_in6_addr {
100     u_char qt_s6_addr[16];
101 };
102 typedef struct {
103     short   sin6_family;            /* AF_INET6 */
104     u_short sin6_port;              /* Transport level port number */
105     u_long  sin6_flowinfo;          /* IPv6 flow information */
106     struct  qt_in6_addr sin6_addr;  /* IPv6 address */
107     u_long  sin6_scope_id;          /* set of interfaces for a scope */
108 } qt_sockaddr_in6;
109 
110 // copied from MSDN online help
111 typedef enum {
112   IpPrefixOriginOther = 0,
113   IpPrefixOriginManual,
114   IpPrefixOriginWellKnown,
115   IpPrefixOriginDhcp,
116   IpPrefixOriginRouterAdvertisement
117 } IP_PREFIX_ORIGIN;
118 
119 typedef enum {
120   IpSuffixOriginOther = 0,
121   IpSuffixOriginManual,
122   IpSuffixOriginWellKnown,
123   IpSuffixOriginDhcp,
124   IpSuffixOriginLinkLayerAddress,
125   IpSuffixOriginRandom
126 } IP_SUFFIX_ORIGIN;
127 
128 typedef enum {
129     IpDadStateInvalid    = 0,
130     IpDadStateTentative,
131     IpDadStateDuplicate,
132     IpDadStateDeprecated,
133     IpDadStatePreferred,
134 } IP_DAD_STATE;
135 
136 typedef enum {
137     IfOperStatusUp = 1,
138     IfOperStatusDown,
139     IfOperStatusTesting,
140     IfOperStatusUnknown,
141     IfOperStatusDormant,
142     IfOperStatusNotPresent,
143     IfOperStatusLowerLayerDown
144 } IF_OPER_STATUS;
145 
146 typedef struct _IP_ADAPTER_UNICAST_ADDRESS {
147   union {
148     ULONGLONG Alignment;
149     struct {
150       ULONG Length;
151       DWORD Flags;
152     };
153   };
154   struct _IP_ADAPTER_UNICAST_ADDRESS* Next;
155   SOCKET_ADDRESS Address;
156   IP_PREFIX_ORIGIN PrefixOrigin;
157   IP_SUFFIX_ORIGIN SuffixOrigin;
158   IP_DAD_STATE DadState;
159   ULONG ValidLifetime;
160   ULONG PreferredLifetime;
161   ULONG LeaseLifetime;
162 } IP_ADAPTER_UNICAST_ADDRESS, *PIP_ADAPTER_UNICAST_ADDRESS;
163 
164 typedef struct _IP_ADAPTER_ANYCAST_ADDRESS
165  IP_ADAPTER_ANYCAST_ADDRESS, *PIP_ADAPTER_ANYCAST_ADDRESS;
166 
167 typedef struct _IP_ADAPTER_MULTICAST_ADDRESS
168  IP_ADAPTER_MULTICAST_ADDRESS,
169  *PIP_ADAPTER_MULTICAST_ADDRESS;
170 
171 typedef struct _IP_ADAPTER_DNS_SERVER_ADDRESS
172  IP_ADAPTER_DNS_SERVER_ADDRESS,
173  *PIP_ADAPTER_DNS_SERVER_ADDRESS;
174 
175 typedef struct _IP_ADAPTER_PREFIX {
176   union {
177     ULONGLONG  Alignment;
178     struct {
179       ULONG Length;
180       DWORD Flags;
181     };
182   };
183   struct _IP_ADAPTER_PREFIX* Next;
184   SOCKET_ADDRESS Address;
185   ULONG PrefixLength;
186 } IP_ADAPTER_PREFIX,
187  *PIP_ADAPTER_PREFIX;
188 
189 typedef struct _IP_ADAPTER_ADDRESSES {
190   union {
191     ULONGLONG Alignment;
192     struct {
193       ULONG Length;
194       DWORD IfIndex;
195     };
196   };
197   struct _IP_ADAPTER_ADDRESSES* Next;
198   PCHAR AdapterName;
199   PIP_ADAPTER_UNICAST_ADDRESS FirstUnicastAddress;
200   PIP_ADAPTER_ANYCAST_ADDRESS FirstAnycastAddress;
201   PIP_ADAPTER_MULTICAST_ADDRESS FirstMulticastAddress;
202   PIP_ADAPTER_DNS_SERVER_ADDRESS FirstDnsServerAddress;
203   PWCHAR DnsSuffix;
204   PWCHAR Description;
205   PWCHAR FriendlyName;
206   BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];
207   DWORD PhysicalAddressLength;
208   DWORD Flags;
209   DWORD Mtu;
210   DWORD IfType;
211   IF_OPER_STATUS OperStatus;
212   DWORD Ipv6IfIndex;
213   DWORD ZoneIndices[16];
214   PIP_ADAPTER_PREFIX FirstPrefix;
215 } IP_ADAPTER_ADDRESSES,
216  *PIP_ADAPTER_ADDRESSES;
217 
218 typedef struct {
219     char String[4 * 4];
220 } IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
221 
222 typedef struct _IP_ADDR_STRING {
223   struct _IP_ADDR_STRING* Next;
224   IP_ADDRESS_STRING IpAddress;
225   IP_MASK_STRING IpMask;
226   DWORD Context;
227 } IP_ADDR_STRING,
228  *PIP_ADDR_STRING;
229 
230 typedef struct _IP_ADAPTER_INFO {
231   struct _IP_ADAPTER_INFO* Next;
232   DWORD ComboIndex;
233   char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
234   char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
235   UINT AddressLength;
236   BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
237   DWORD Index;
238   UINT Type;
239   UINT DhcpEnabled;
240   PIP_ADDR_STRING CurrentIpAddress;
241   IP_ADDR_STRING IpAddressList;
242   IP_ADDR_STRING GatewayList;
243   IP_ADDR_STRING DhcpServer;
244   BOOL HaveWins;
245   IP_ADDR_STRING PrimaryWinsServer;
246   IP_ADDR_STRING SecondaryWinsServer;
247   time_t LeaseObtained;
248   time_t LeaseExpires;
249 } IP_ADAPTER_INFO,
250  *PIP_ADAPTER_INFO;
251 
252 typedef struct {
253   char HostName[MAX_HOSTNAME_LEN + 4];
254   char DomainName[MAX_DOMAIN_NAME_LEN + 4];
255   PIP_ADDR_STRING CurrentDnsServer;
256   IP_ADDR_STRING DnsServerList;
257   UINT NodeType;
258   char ScopeId[MAX_SCOPE_ID_LEN + 4];
259   UINT EnableRouting;
260   UINT EnableProxy;
261   UINT EnableDns;
262 } FIXED_INFO, *PFIXED_INFO;
263 
264 QT_END_NAMESPACE
265 
266 #endif
267