blob: 74c9c13c25cf35d08bc6df9612b3cdbd183e8a8c [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26#ifndef NETWORK_INTERFACE_H
27#define NETWORK_INTERFACE_H
28
29#include "net_util.h"
30
31/*
32 * Structures used when enumerating interfaces and addresses
33 */
34typedef struct _netaddr {
35 SOCKETADDRESS addr; /* IPv4 or IPv6 address */
36 SOCKETADDRESS brdcast;
37 short mask;
38 struct _netaddr *next;
39} netaddr;
40
41typedef struct _netif {
42 char *name;
43 char *displayName;
44 DWORD dwIndex; /* Internal index */
45 DWORD ifType; /* Interface type */
46 int index; /* Friendly index */
47 struct _netif *next;
48
49 /* Following fields used on Windows XP when IPv6 is used only */
50 jboolean hasIpv6Address; /* true when following fields valid */
51 jboolean dNameIsUnicode; /* Display Name is Unicode */
52 int naddrs; /* Number of addrs */
53 DWORD ipv6Index;
54 struct _netaddr *addrs; /* addr list for interfaces */
55} netif;
56
57extern void free_netif(netif *netifP);
58extern void free_netaddr(netaddr *netaddrP);
59
60/* various JNI ids */
61extern jclass ni_class; /* NetworkInterface */
62
63extern jmethodID ni_ctor; /* NetworkInterface() */
64
65extern jfieldID ni_indexID; /* NetworkInterface.index */
66extern jfieldID ni_addrsID; /* NetworkInterface.addrs */
67extern jfieldID ni_bindsID; /* NetworkInterface.bindings */
68extern jfieldID ni_nameID; /* NetworkInterface.name */
69extern jfieldID ni_displayNameID; /* NetworkInterface.displayName */
70extern jfieldID ni_childsID; /* NetworkInterface.childs */
71
72extern jclass ni_iacls; /* InetAddress */
73extern jfieldID ni_iaAddr; /* InetAddress.address */
74
75extern jclass ni_ia4cls; /* Inet4Address */
76extern jmethodID ni_ia4Ctor; /* Inet4Address() */
77
78extern jclass ni_ia6cls; /* Inet6Address */
79extern jmethodID ni_ia6ctrID; /* Inet6Address() */
80extern jfieldID ni_ia6ipaddressID;
81extern jfieldID ni_ia6ipaddressID;
82
83extern jclass ni_ibcls; /* InterfaceAddress */
84extern jmethodID ni_ibctrID; /* InterfaceAddress() */
85extern jfieldID ni_ibaddressID; /* InterfaceAddress.address */
86extern jfieldID ni_ibbroadcastID; /* InterfaceAddress.broadcast */
87extern jfieldID ni_ibmaskID; /* InterfaceAddress.maskLength */
88
89/*
90 * Following includes come from iptypes.h
91 */
92
93#pragma warning(push)
94#pragma warning(disable:4201)
95
96#include <time.h>
97
98// Definitions and structures used by getnetworkparams and getadaptersinfo apis
99
100#define MAX_ADAPTER_DESCRIPTION_LENGTH 128 // arb.
101#define MAX_ADAPTER_NAME_LENGTH 256 // arb.
102#define MAX_ADAPTER_ADDRESS_LENGTH 8 // arb.
103#define DEFAULT_MINIMUM_ENTITIES 32 // arb.
104#define MAX_HOSTNAME_LEN 128 // arb.
105#define MAX_DOMAIN_NAME_LEN 128 // arb.
106#define MAX_SCOPE_ID_LEN 256 // arb.
107
108//
109// types
110//
111
112// Node Type
113
114#define BROADCAST_NODETYPE 1
115#define PEER_TO_PEER_NODETYPE 2
116#define MIXED_NODETYPE 4
117#define HYBRID_NODETYPE 8
118
119//
120// IP_ADDRESS_STRING - store an IP address as a dotted decimal string
121//
122
123typedef struct {
124 char String[4 * 4];
125} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
126
127//
128// IP_ADDR_STRING - store an IP address with its corresponding subnet mask,
129// both as dotted decimal strings
130//
131
132typedef struct _IP_ADDR_STRING {
133 struct _IP_ADDR_STRING* Next;
134 IP_ADDRESS_STRING IpAddress;
135 IP_MASK_STRING IpMask;
136 DWORD Context;
137} IP_ADDR_STRING, *PIP_ADDR_STRING;
138
139//
140// ADAPTER_INFO - per-adapter information. All IP addresses are stored as
141// strings
142//
143
144typedef struct _IP_ADAPTER_INFO {
145 struct _IP_ADAPTER_INFO* Next;
146 DWORD ComboIndex;
147 char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
148 char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
149 UINT AddressLength;
150 BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
151 DWORD Index;
152 UINT Type;
153 UINT DhcpEnabled;
154 PIP_ADDR_STRING CurrentIpAddress;
155 IP_ADDR_STRING IpAddressList;
156 IP_ADDR_STRING GatewayList;
157 IP_ADDR_STRING DhcpServer;
158 BOOL HaveWins;
159 IP_ADDR_STRING PrimaryWinsServer;
160 IP_ADDR_STRING SecondaryWinsServer;
161 time_t LeaseObtained;
162 time_t LeaseExpires;
163} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
164
165#ifdef _WINSOCK2API_
166
167//
168// The following types require Winsock2.
169//
170
171typedef enum {
172 IpPrefixOriginOther = 0,
173 IpPrefixOriginManual,
174 IpPrefixOriginWellKnown,
175 IpPrefixOriginDhcp,
176 IpPrefixOriginRouterAdvertisement,
177} IP_PREFIX_ORIGIN;
178
179typedef enum {
180 IpSuffixOriginOther = 0,
181 IpSuffixOriginManual,
182 IpSuffixOriginWellKnown,
183 IpSuffixOriginDhcp,
184 IpSuffixOriginLinkLayerAddress,
185 IpSuffixOriginRandom,
186} IP_SUFFIX_ORIGIN;
187
188typedef enum {
189 IpDadStateInvalid = 0,
190 IpDadStateTentative,
191 IpDadStateDuplicate,
192 IpDadStateDeprecated,
193 IpDadStatePreferred,
194} IP_DAD_STATE;
195
196typedef struct _IP_ADAPTER_UNICAST_ADDRESS {
197 union {
198 ULONGLONG Alignment;
199 struct {
200 ULONG Length;
201 DWORD Flags;
202 };
203 };
204 struct _IP_ADAPTER_UNICAST_ADDRESS *Next;
205 SOCKET_ADDRESS Address;
206
207 IP_PREFIX_ORIGIN PrefixOrigin;
208 IP_SUFFIX_ORIGIN SuffixOrigin;
209 IP_DAD_STATE DadState;
210
211 ULONG ValidLifetime;
212 ULONG PreferredLifetime;
213 ULONG LeaseLifetime;
214} IP_ADAPTER_UNICAST_ADDRESS, *PIP_ADAPTER_UNICAST_ADDRESS;
215
216typedef struct _IP_ADAPTER_ANYCAST_ADDRESS {
217 union {
218 ULONGLONG Alignment;
219 struct {
220 ULONG Length;
221 DWORD Flags;
222 };
223 };
224 struct _IP_ADAPTER_ANYCAST_ADDRESS *Next;
225 SOCKET_ADDRESS Address;
226} IP_ADAPTER_ANYCAST_ADDRESS, *PIP_ADAPTER_ANYCAST_ADDRESS;
227
228typedef struct _IP_ADAPTER_MULTICAST_ADDRESS {
229 union {
230 ULONGLONG Alignment;
231 struct {
232 ULONG Length;
233 DWORD Flags;
234 };
235 };
236 struct _IP_ADAPTER_MULTICAST_ADDRESS *Next;
237 SOCKET_ADDRESS Address;
238} IP_ADAPTER_MULTICAST_ADDRESS, *PIP_ADAPTER_MULTICAST_ADDRESS;
239
240//
241// Per-address Flags
242//
243#define IP_ADAPTER_ADDRESS_DNS_ELIGIBLE 0x01
244#define IP_ADAPTER_ADDRESS_TRANSIENT 0x02
245
246typedef struct _IP_ADAPTER_DNS_SERVER_ADDRESS {
247 union {
248 ULONGLONG Alignment;
249 struct {
250 ULONG Length;
251 DWORD Reserved;
252 };
253 };
254 struct _IP_ADAPTER_DNS_SERVER_ADDRESS *Next;
255 SOCKET_ADDRESS Address;
256} IP_ADAPTER_DNS_SERVER_ADDRESS, *PIP_ADAPTER_DNS_SERVER_ADDRESS;
257
258typedef struct _IP_ADAPTER_PREFIX {
259 union {
260 ULONGLONG Alignment;
261 struct {
262 ULONG Length;
263 DWORD Flags;
264 };
265 };
266 struct _IP_ADAPTER_PREFIX *Next;
267 SOCKET_ADDRESS Address;
268 ULONG PrefixLength;
269} IP_ADAPTER_PREFIX, *PIP_ADAPTER_PREFIX;
270
271//
272// Per-adapter Flags
273//
274#define IP_ADAPTER_DDNS_ENABLED 0x01
275#define IP_ADAPTER_REGISTER_ADAPTER_SUFFIX 0x02
276#define IP_ADAPTER_DHCP_ENABLED 0x04
277#define IP_ADAPTER_RECEIVE_ONLY 0x08
278#define IP_ADAPTER_NO_MULTICAST 0x10
279#define IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG 0x20
280
281//
282// OperStatus values from RFC 2863
283//
284typedef enum {
285 IfOperStatusUp = 1,
286 IfOperStatusDown,
287 IfOperStatusTesting,
288 IfOperStatusUnknown,
289 IfOperStatusDormant,
290 IfOperStatusNotPresent,
291 IfOperStatusLowerLayerDown
292} IF_OPER_STATUS;
293
294//
295// Scope levels from RFC 2373 used with ZoneIndices array.
296//
297typedef enum {
298 ScopeLevelInterface = 1,
299 ScopeLevelLink = 2,
300 ScopeLevelSubnet = 3,
301 ScopeLevelAdmin = 4,
302 ScopeLevelSite = 5,
303 ScopeLevelOrganization = 8,
304 ScopeLevelGlobal = 14
305} SCOPE_LEVEL;
306
307typedef struct _IP_ADAPTER_ADDRESSES {
308 union {
309 ULONGLONG Alignment;
310 struct {
311 ULONG Length;
312 DWORD IfIndex;
313 };
314 };
315 struct _IP_ADAPTER_ADDRESSES *Next;
316 PCHAR AdapterName;
317 PIP_ADAPTER_UNICAST_ADDRESS FirstUnicastAddress;
318 PIP_ADAPTER_ANYCAST_ADDRESS FirstAnycastAddress;
319 PIP_ADAPTER_MULTICAST_ADDRESS FirstMulticastAddress;
320 PIP_ADAPTER_DNS_SERVER_ADDRESS FirstDnsServerAddress;
321 PWCHAR DnsSuffix;
322 PWCHAR Description;
323 PWCHAR FriendlyName;
324 BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];
325 DWORD PhysicalAddressLength;
326 DWORD Flags;
327 DWORD Mtu;
328 DWORD IfType;
329 IF_OPER_STATUS OperStatus;
330 DWORD Ipv6IfIndex;
331 DWORD ZoneIndices[16];
332 PIP_ADAPTER_PREFIX FirstPrefix;
333} IP_ADAPTER_ADDRESSES, *PIP_ADAPTER_ADDRESSES;
334
335//
336// Flags used as argument to GetAdaptersAddresses().
337// "SKIP" flags are added when the default is to include the information.
338// "INCLUDE" flags are added when the default is to skip the information.
339//
340#define GAA_FLAG_SKIP_UNICAST 0x0001
341#define GAA_FLAG_SKIP_ANYCAST 0x0002
342#define GAA_FLAG_SKIP_MULTICAST 0x0004
343#define GAA_FLAG_SKIP_DNS_SERVER 0x0008
344#define GAA_FLAG_INCLUDE_PREFIX 0x0010
345#define GAA_FLAG_SKIP_FRIENDLY_NAME 0x0020
346
347#endif /* _WINSOCK2API_ */
348
349//
350// IP_PER_ADAPTER_INFO - per-adapter IP information such as DNS server list.
351//
352
353typedef struct _IP_PER_ADAPTER_INFO {
354 UINT AutoconfigEnabled;
355 UINT AutoconfigActive;
356 PIP_ADDR_STRING CurrentDnsServer;
357 IP_ADDR_STRING DnsServerList;
358} IP_PER_ADAPTER_INFO, *PIP_PER_ADAPTER_INFO;
359
360//
361// FIXED_INFO - the set of IP-related information which does not depend on DHCP
362//
363
364typedef struct {
365 char HostName[MAX_HOSTNAME_LEN + 4] ;
366 char DomainName[MAX_DOMAIN_NAME_LEN + 4];
367 PIP_ADDR_STRING CurrentDnsServer;
368 IP_ADDR_STRING DnsServerList;
369 UINT NodeType;
370 char ScopeId[MAX_SCOPE_ID_LEN + 4];
371 UINT EnableRouting;
372 UINT EnableProxy;
373 UINT EnableDns;
374} FIXED_INFO, *PFIXED_INFO;
375
376#ifndef IP_INTERFACE_NAME_INFO_DEFINED
377#define IP_INTERFACE_NAME_INFO_DEFINED
378
379typedef struct ip_interface_name_info {
380 ULONG Index; // Interface Index
381 ULONG MediaType; // Interface Types - see ipifcons.h
382 UCHAR ConnectionType;
383 UCHAR AccessType;
384 GUID DeviceGuid; // Device GUID is the guid of the device
385 // that IP exposes
386 GUID InterfaceGuid; // Interface GUID, if not GUID_NULL is the
387 // GUID for the interface mapped to the device.
388} IP_INTERFACE_NAME_INFO, *PIP_INTERFACE_NAME_INFO;
389
390#endif
391
392#pragma warning(pop)
393
394/* from ipifcons.h */
395
396#ifndef IF_TYPE_PPP
397#define IF_TYPE_PPP 23
398#endif
399
400#ifndef IF_TYPE_SOFTWARE_LOOPBACK
401#define IF_TYPE_SOFTWARE_LOOPBACK 24
402#endif
403
404#ifndef IF_TYPE_SLIP
405#define IF_TYPE_SLIP 28
406#endif
407
408#ifndef IF_TYPE_TUNNEL
409#define IF_TYPE_TUNNEL 131
410#endif
411
412#endif