1 /*
   2  * Copyright 2002-2008 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 <iphlpapi.h>
  30 #include "net_util.h"
  31 
  32 /*
  33  * Structures used when enumerating interfaces and addresses
  34  */
  35 typedef struct _netaddr  {
  36     SOCKETADDRESS    addr;                  /* IPv4 or IPv6 address */
  37     SOCKETADDRESS    brdcast;
  38     short            mask;
  39     struct _netaddr *next;
  40 } netaddr;
  41 
  42 typedef struct _netif {
  43     char *name;
  44     char *displayName;
  45     DWORD dwIndex;              /* Internal index */
  46     DWORD ifType;               /* Interface type */
  47     int index;                  /* Friendly index */
  48     struct _netif *next;
  49 
  50     /* Following fields used on Windows XP when IPv6 is used only */
  51     jboolean hasIpv6Address;    /* true when following fields valid */
  52     jboolean dNameIsUnicode;    /* Display Name is Unicode */
  53     int naddrs;                 /* Number of addrs */
  54     DWORD ipv6Index;
  55     struct _netaddr *addrs;     /* addr list for interfaces */
  56 } netif;
  57 
  58 extern void free_netif(netif *netifP);
  59 extern void free_netaddr(netaddr *netaddrP);
  60 
  61 /* various JNI ids */
  62 extern jclass ni_class;             /* NetworkInterface */
  63 
  64 extern jmethodID ni_ctrID;           /* NetworkInterface() */
  65 
  66 extern jfieldID ni_indexID;         /* NetworkInterface.index */
  67 extern jfieldID ni_addrsID;         /* NetworkInterface.addrs */
  68 extern jfieldID ni_bindsID;         /* NetworkInterface.bindings */
  69 extern jfieldID ni_nameID;          /* NetworkInterface.name */
  70 extern jfieldID ni_displayNameID;   /* NetworkInterface.displayName */
  71 extern jfieldID ni_childsID;        /* NetworkInterface.childs */
  72 











  73 extern jclass ni_ibcls;             /* InterfaceAddress */
  74 extern jmethodID ni_ibctrID;        /* InterfaceAddress() */
  75 extern jfieldID ni_ibaddressID;     /* InterfaceAddress.address */
  76 extern jfieldID ni_ibbroadcastID;   /* InterfaceAddress.broadcast */
  77 extern jfieldID ni_ibmaskID;        /* InterfaceAddress.maskLength */
  78 
  79 int enumInterfaces_win(JNIEnv *env, netif **netifPP);
  80 
  81 /* We have included iphlpapi.h which includes iptypes.h which has the definition
  82  * for MAX_ADAPTER_DESCRIPTION_LENGTH (along with the other definitions in this
  83  * ifndef block). Therefore if MAX_ADAPTER_DESCRIPTION_LENGTH is defined we can
  84  * be sure that the other definitions are also defined */
  85 #ifndef MAX_ADAPTER_DESCRIPTION_LENGTH
  86 
  87 /*
  88  * Following includes come from iptypes.h
  89  */
  90 
  91 #pragma warning(push)
  92 #pragma warning(disable:4201)
  93 
  94 #include <time.h>
  95 
  96 // Definitions and structures used by getnetworkparams and getadaptersinfo apis
  97 
  98 #define MAX_ADAPTER_DESCRIPTION_LENGTH  128 // arb.
  99 #define MAX_ADAPTER_NAME_LENGTH         256 // arb.
 100 #define MAX_ADAPTER_ADDRESS_LENGTH      8   // arb.
 101 #define DEFAULT_MINIMUM_ENTITIES        32  // arb.
 102 #define MAX_HOSTNAME_LEN                128 // arb.
 103 #define MAX_DOMAIN_NAME_LEN             128 // arb.
 104 #define MAX_SCOPE_ID_LEN                256 // arb.
 105 
 106 //
 107 // types
 108 //
 109 
 110 // Node Type
 111 
 112 #define BROADCAST_NODETYPE              1
 113 #define PEER_TO_PEER_NODETYPE           2
 114 #define MIXED_NODETYPE                  4
 115 #define HYBRID_NODETYPE                 8
 116 
 117 //
 118 // IP_ADDRESS_STRING - store an IP address as a dotted decimal string
 119 //
 120 
 121 typedef struct {
 122     char String[4 * 4];
 123 } IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
 124 
 125 //
 126 // IP_ADDR_STRING - store an IP address with its corresponding subnet mask,
 127 // both as dotted decimal strings
 128 //
 129 
 130 typedef struct _IP_ADDR_STRING {
 131     struct _IP_ADDR_STRING* Next;
 132     IP_ADDRESS_STRING IpAddress;
 133     IP_MASK_STRING IpMask;
 134     DWORD Context;
 135 } IP_ADDR_STRING, *PIP_ADDR_STRING;
 136 
 137 //
 138 // ADAPTER_INFO - per-adapter information. All IP addresses are stored as
 139 // strings
 140 //
 141 
 142 typedef struct _IP_ADAPTER_INFO {
 143     struct _IP_ADAPTER_INFO* Next;
 144     DWORD ComboIndex;
 145     char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
 146     char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
 147     UINT AddressLength;
 148     BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
 149     DWORD Index;
 150     UINT Type;
 151     UINT DhcpEnabled;
 152     PIP_ADDR_STRING CurrentIpAddress;
 153     IP_ADDR_STRING IpAddressList;
 154     IP_ADDR_STRING GatewayList;
 155     IP_ADDR_STRING DhcpServer;
 156     BOOL HaveWins;
 157     IP_ADDR_STRING PrimaryWinsServer;
 158     IP_ADDR_STRING SecondaryWinsServer;
 159     time_t LeaseObtained;
 160     time_t LeaseExpires;
 161 } IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
 162 
 163 #ifdef _WINSOCK2API_
 164 
 165 //
 166 // The following types require Winsock2.
 167 //
 168 
 169 typedef enum {
 170     IpPrefixOriginOther = 0,
 171     IpPrefixOriginManual,
 172     IpPrefixOriginWellKnown,
 173     IpPrefixOriginDhcp,
 174     IpPrefixOriginRouterAdvertisement,
 175 } IP_PREFIX_ORIGIN;
 176 
 177 typedef enum {
 178     IpSuffixOriginOther = 0,
 179     IpSuffixOriginManual,
 180     IpSuffixOriginWellKnown,
 181     IpSuffixOriginDhcp,
 182     IpSuffixOriginLinkLayerAddress,
 183     IpSuffixOriginRandom,
 184 } IP_SUFFIX_ORIGIN;
 185 
 186 typedef enum {
 187     IpDadStateInvalid    = 0,
 188     IpDadStateTentative,
 189     IpDadStateDuplicate,
 190     IpDadStateDeprecated,
 191     IpDadStatePreferred,
 192 } IP_DAD_STATE;
 193 
 194 typedef struct _IP_ADAPTER_UNICAST_ADDRESS {
 195     union {
 196         ULONGLONG Alignment;
 197         struct {
 198             ULONG Length;
 199             DWORD Flags;
 200         };
 201     };
 202     struct _IP_ADAPTER_UNICAST_ADDRESS *Next;
 203     SOCKET_ADDRESS Address;
 204 
 205     IP_PREFIX_ORIGIN PrefixOrigin;
 206     IP_SUFFIX_ORIGIN SuffixOrigin;
 207     IP_DAD_STATE DadState;
 208 
 209     ULONG ValidLifetime;
 210     ULONG PreferredLifetime;
 211     ULONG LeaseLifetime;
 212 } IP_ADAPTER_UNICAST_ADDRESS, *PIP_ADAPTER_UNICAST_ADDRESS;
 213 
 214 typedef struct _IP_ADAPTER_ANYCAST_ADDRESS {
 215     union {
 216         ULONGLONG Alignment;
 217         struct {
 218             ULONG Length;
 219             DWORD Flags;
 220         };
 221     };
 222     struct _IP_ADAPTER_ANYCAST_ADDRESS *Next;
 223     SOCKET_ADDRESS Address;
 224 } IP_ADAPTER_ANYCAST_ADDRESS, *PIP_ADAPTER_ANYCAST_ADDRESS;
 225 
 226 typedef struct _IP_ADAPTER_MULTICAST_ADDRESS {
 227     union {
 228         ULONGLONG Alignment;
 229         struct {
 230             ULONG Length;
 231             DWORD Flags;
 232         };
 233     };
 234     struct _IP_ADAPTER_MULTICAST_ADDRESS *Next;
 235     SOCKET_ADDRESS Address;
 236 } IP_ADAPTER_MULTICAST_ADDRESS, *PIP_ADAPTER_MULTICAST_ADDRESS;
 237 
 238 //
 239 // Per-address Flags
 240 //
 241 #define IP_ADAPTER_ADDRESS_DNS_ELIGIBLE 0x01
 242 #define IP_ADAPTER_ADDRESS_TRANSIENT    0x02
 243 
 244 typedef struct _IP_ADAPTER_DNS_SERVER_ADDRESS {
 245     union {
 246         ULONGLONG Alignment;
 247         struct {
 248             ULONG Length;
 249             DWORD Reserved;
 250         };
 251     };
 252     struct _IP_ADAPTER_DNS_SERVER_ADDRESS *Next;
 253     SOCKET_ADDRESS Address;
 254 } IP_ADAPTER_DNS_SERVER_ADDRESS, *PIP_ADAPTER_DNS_SERVER_ADDRESS;
 255 
 256 typedef struct _IP_ADAPTER_PREFIX {
 257     union {
 258         ULONGLONG Alignment;
 259         struct {
 260             ULONG Length;
 261             DWORD Flags;
 262         };
 263     };
 264     struct _IP_ADAPTER_PREFIX *Next;
 265     SOCKET_ADDRESS Address;
 266     ULONG PrefixLength;
 267 } IP_ADAPTER_PREFIX, *PIP_ADAPTER_PREFIX;
 268 
 269 //
 270 // Per-adapter Flags
 271 //
 272 #define IP_ADAPTER_DDNS_ENABLED               0x01
 273 #define IP_ADAPTER_REGISTER_ADAPTER_SUFFIX    0x02
 274 #define IP_ADAPTER_DHCP_ENABLED               0x04
 275 #define IP_ADAPTER_RECEIVE_ONLY               0x08
 276 #define IP_ADAPTER_NO_MULTICAST               0x10
 277 #define IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG 0x20
 278 
 279 //
 280 // OperStatus values from RFC 2863
 281 //
 282 typedef enum {
 283     IfOperStatusUp = 1,
 284     IfOperStatusDown,
 285     IfOperStatusTesting,
 286     IfOperStatusUnknown,
 287     IfOperStatusDormant,
 288     IfOperStatusNotPresent,
 289     IfOperStatusLowerLayerDown
 290 } IF_OPER_STATUS;
 291 
 292 //
 293 // Scope levels from RFC 2373 used with ZoneIndices array.
 294 //
 295 typedef enum {
 296     ScopeLevelInterface    = 1,
 297     ScopeLevelLink         = 2,
 298     ScopeLevelSubnet       = 3,
 299     ScopeLevelAdmin        = 4,
 300     ScopeLevelSite         = 5,
 301     ScopeLevelOrganization = 8,
 302     ScopeLevelGlobal       = 14
 303 } SCOPE_LEVEL;
 304 
 305 typedef struct _IP_ADAPTER_ADDRESSES {
 306     union {
 307         ULONGLONG Alignment;
 308         struct {
 309             ULONG Length;
 310             DWORD IfIndex;
 311         };
 312     };
 313     struct _IP_ADAPTER_ADDRESSES *Next;
 314     PCHAR AdapterName;
 315     PIP_ADAPTER_UNICAST_ADDRESS FirstUnicastAddress;
 316     PIP_ADAPTER_ANYCAST_ADDRESS FirstAnycastAddress;
 317     PIP_ADAPTER_MULTICAST_ADDRESS FirstMulticastAddress;
 318     PIP_ADAPTER_DNS_SERVER_ADDRESS FirstDnsServerAddress;
 319     PWCHAR DnsSuffix;
 320     PWCHAR Description;
 321     PWCHAR FriendlyName;
 322     BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];
 323     DWORD PhysicalAddressLength;
 324     DWORD Flags;
 325     DWORD Mtu;
 326     DWORD IfType;
 327     IF_OPER_STATUS OperStatus;
 328     DWORD Ipv6IfIndex;
 329     DWORD ZoneIndices[16];
 330     PIP_ADAPTER_PREFIX FirstPrefix;
 331 } IP_ADAPTER_ADDRESSES, *PIP_ADAPTER_ADDRESSES;
 332 
 333 //
 334 // Flags used as argument to GetAdaptersAddresses().
 335 // "SKIP" flags are added when the default is to include the information.
 336 // "INCLUDE" flags are added when the default is to skip the information.
 337 //
 338 #define GAA_FLAG_SKIP_UNICAST       0x0001
 339 #define GAA_FLAG_SKIP_ANYCAST       0x0002
 340 #define GAA_FLAG_SKIP_MULTICAST     0x0004
 341 #define GAA_FLAG_SKIP_DNS_SERVER    0x0008
 342 #define GAA_FLAG_INCLUDE_PREFIX     0x0010
 343 #define GAA_FLAG_SKIP_FRIENDLY_NAME 0x0020
 344 
 345 #endif /* _WINSOCK2API_ */
 346 
 347 //
 348 // IP_PER_ADAPTER_INFO - per-adapter IP information such as DNS server list.
 349 //
 350 
 351 typedef struct _IP_PER_ADAPTER_INFO {
 352     UINT AutoconfigEnabled;
 353     UINT AutoconfigActive;
 354     PIP_ADDR_STRING CurrentDnsServer;
 355     IP_ADDR_STRING DnsServerList;
 356 } IP_PER_ADAPTER_INFO, *PIP_PER_ADAPTER_INFO;
 357 
 358 //
 359 // FIXED_INFO - the set of IP-related information which does not depend on DHCP
 360 //
 361 
 362 typedef struct {
 363     char HostName[MAX_HOSTNAME_LEN + 4] ;
 364     char DomainName[MAX_DOMAIN_NAME_LEN + 4];
 365     PIP_ADDR_STRING CurrentDnsServer;
 366     IP_ADDR_STRING DnsServerList;
 367     UINT NodeType;
 368     char ScopeId[MAX_SCOPE_ID_LEN + 4];
 369     UINT EnableRouting;
 370     UINT EnableProxy;
 371     UINT EnableDns;
 372 } FIXED_INFO, *PFIXED_INFO;
 373 
 374 #pragma warning(pop)
 375 
 376 #endif /*!MAX_ADAPTER_DESCRIPTION_LENGTH*/
 377 
 378 #ifndef IP_INTERFACE_NAME_INFO_DEFINED
 379 #define IP_INTERFACE_NAME_INFO_DEFINED
 380 
 381 typedef struct ip_interface_name_info {
 382     ULONG           Index;      // Interface Index
 383     ULONG           MediaType;  // Interface Types - see ipifcons.h
 384     UCHAR           ConnectionType;
 385     UCHAR           AccessType;
 386     GUID            DeviceGuid; // Device GUID is the guid of the device
 387                                 // that IP exposes
 388     GUID            InterfaceGuid; // Interface GUID, if not GUID_NULL is the
 389                                 // GUID for the interface mapped to the device.
 390 } IP_INTERFACE_NAME_INFO, *PIP_INTERFACE_NAME_INFO;
 391 
 392 #endif
 393 
 394 
 395 /* from ipifcons.h */
 396 
 397 #ifndef IF_TYPE_PPP
 398 #define IF_TYPE_PPP 23
 399 #endif
 400 
 401 #ifndef IF_TYPE_SOFTWARE_LOOPBACK
 402 #define IF_TYPE_SOFTWARE_LOOPBACK 24
 403 #endif
 404 
 405 #ifndef IF_TYPE_SLIP
 406 #define IF_TYPE_SLIP 28
 407 #endif
 408 
 409 #ifndef IF_TYPE_TUNNEL
 410 #define IF_TYPE_TUNNEL 131
 411 #endif
 412 
 413 #endif
--- EOF ---