2 // System.Net.NetworkInformation.NetworkInterface
5 // Gonzalo Paniagua Javier (gonzalo@novell.com)
6 // Atsushi Enomoto (atsushi@ximian.com)
7 // Miguel de Icaza (miguel@novell.com)
8 // Eric Butler (eric@extremeboredom.net)
9 // Marek Habersack (mhabersack@novell.com)
10 // Marek Safar (marek.safar@gmail.com)
12 // Copyright (c) 2006-2008 Novell, Inc. (http://www.novell.com)
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Collections.Generic;
35 using System.Collections;
37 using System.Net.Sockets;
38 using System.Runtime.InteropServices;
41 using System.Globalization;
43 namespace System.Net.NetworkInformation {
44 static class SystemNetworkInterface {
46 static readonly NetworkInterfaceFactory nif = NetworkInterfaceFactory.Create ();
48 public static NetworkInterface [] GetNetworkInterfaces ()
51 return nif.GetAllNetworkInterfaces ();
53 return new NetworkInterface [0];
57 public static bool InternalGetIsNetworkAvailable ()
63 public static int InternalLoopbackInterfaceIndex {
65 return nif.GetLoopbackInterfaceIndex ();
69 public static int InternalIPv6LoopbackInterfaceIndex {
71 throw new NotImplementedException ();
75 public static IPAddress GetNetMask (IPAddress address)
77 return nif.GetNetMask (address);
81 abstract class NetworkInterfaceFactory
83 internal abstract class UnixNetworkInterfaceAPI : NetworkInterfaceFactory
86 public static extern int if_nametoindex(string ifname);
89 protected static extern int getifaddrs (out IntPtr ifap);
92 protected static extern void freeifaddrs (IntPtr ifap);
95 class MacOsNetworkInterfaceAPI : UnixNetworkInterfaceAPI
97 const int AF_INET = 2;
98 const int AF_INET6 = 30;
99 const int AF_LINK = 18;
101 public override NetworkInterface [] GetAllNetworkInterfaces ()
103 var interfaces = new Dictionary <string, MacOsNetworkInterface> ();
105 if (getifaddrs (out ifap) != 0)
106 throw new SystemException ("getifaddrs() failed");
110 while (next != IntPtr.Zero) {
111 MacOsStructs.ifaddrs addr = (MacOsStructs.ifaddrs) Marshal.PtrToStructure (next, typeof (MacOsStructs.ifaddrs));
112 IPAddress address = IPAddress.None;
113 string name = addr.ifa_name;
115 byte[] macAddress = null;
116 NetworkInterfaceType type = NetworkInterfaceType.Unknown;
118 if (addr.ifa_addr != IntPtr.Zero) {
120 MacOsStructs.sockaddr sockaddr = (MacOsStructs.sockaddr) Marshal.PtrToStructure (addr.ifa_addr, typeof (MacOsStructs.sockaddr));
122 if (sockaddr.sa_family == AF_INET6) {
123 MacOsStructs.sockaddr_in6 sockaddr6 = (MacOsStructs.sockaddr_in6) Marshal.PtrToStructure (addr.ifa_addr, typeof (MacOsStructs.sockaddr_in6));
124 address = new IPAddress (sockaddr6.sin6_addr.u6_addr8, sockaddr6.sin6_scope_id);
125 } else if (sockaddr.sa_family == AF_INET) {
126 MacOsStructs.sockaddr_in sockaddrin = (MacOsStructs.sockaddr_in) Marshal.PtrToStructure (addr.ifa_addr, typeof (MacOsStructs.sockaddr_in));
127 address = new IPAddress (sockaddrin.sin_addr);
128 } else if (sockaddr.sa_family == AF_LINK) {
129 MacOsStructs.sockaddr_dl sockaddrdl = new MacOsStructs.sockaddr_dl ();
130 sockaddrdl.Read (addr.ifa_addr);
132 macAddress = new byte [(int) sockaddrdl.sdl_alen];
133 // copy mac address from sdl_data field starting at last index pos of interface name into array macaddress, starting
135 Array.Copy (sockaddrdl.sdl_data, sockaddrdl.sdl_nlen, macAddress, 0, Math.Min (macAddress.Length, sockaddrdl.sdl_data.Length - sockaddrdl.sdl_nlen));
137 index = sockaddrdl.sdl_index;
139 int hwtype = (int) sockaddrdl.sdl_type;
140 if (Enum.IsDefined (typeof (MacOsArpHardware), hwtype)) {
141 switch ((MacOsArpHardware) hwtype) {
142 case MacOsArpHardware.ETHER:
143 type = NetworkInterfaceType.Ethernet;
146 case MacOsArpHardware.ATM:
147 type = NetworkInterfaceType.Atm;
150 case MacOsArpHardware.SLIP:
151 type = NetworkInterfaceType.Slip;
154 case MacOsArpHardware.PPP:
155 type = NetworkInterfaceType.Ppp;
158 case MacOsArpHardware.LOOPBACK:
159 type = NetworkInterfaceType.Loopback;
163 case MacOsArpHardware.FDDI:
164 type = NetworkInterfaceType.Fddi;
171 MacOsNetworkInterface iface = null;
173 // create interface if not already present
174 if (!interfaces.TryGetValue (name, out iface)) {
175 iface = new MacOsNetworkInterface (name, addr.ifa_flags);
176 interfaces.Add (name, iface);
179 // if a new address has been found, add it
180 if (!address.Equals (IPAddress.None))
181 iface.AddAddress (address);
183 // set link layer info, if iface has macaddress or is loopback device
184 if (macAddress != null || type == NetworkInterfaceType.Loopback)
185 iface.SetLinkLayerInfo (index, macAddress, type);
187 next = addr.ifa_next;
193 NetworkInterface [] result = new NetworkInterface [interfaces.Count];
195 foreach (NetworkInterface thisInterface in interfaces.Values) {
196 result [x] = thisInterface;
202 public override int GetLoopbackInterfaceIndex ()
204 return if_nametoindex ("lo0");
207 public override IPAddress GetNetMask (IPAddress address)
210 if (getifaddrs (out ifap) != 0)
211 throw new SystemException ("getifaddrs() failed");
215 while (next != IntPtr.Zero) {
216 MacOsStructs.ifaddrs addr = (MacOsStructs.ifaddrs) Marshal.PtrToStructure (next, typeof (MacOsStructs.ifaddrs));
218 if (addr.ifa_addr != IntPtr.Zero) {
220 MacOsStructs.sockaddr sockaddr = (MacOsStructs.sockaddr) Marshal.PtrToStructure (addr.ifa_addr, typeof (MacOsStructs.sockaddr));
222 if (sockaddr.sa_family == AF_INET) {
223 MacOsStructs.sockaddr_in sockaddrin = (MacOsStructs.sockaddr_in) Marshal.PtrToStructure (addr.ifa_addr, typeof (MacOsStructs.sockaddr_in));
224 var saddress = new IPAddress (sockaddrin.sin_addr);
225 if (address.Equals (saddress))
226 return new IPAddress(((sockaddr_in)Marshal.PtrToStructure(addr.ifa_netmask, typeof(sockaddr_in))).sin_addr);
229 next = addr.ifa_next;
239 class LinuxNetworkInterfaceAPI : UnixNetworkInterfaceAPI
241 const int AF_INET = 2;
242 const int AF_INET6 = 10;
243 const int AF_PACKET = 17;
245 static void FreeInterfaceAddresses (IntPtr ifap)
248 AndroidPlatform.FreeInterfaceAddresses (ifap);
254 static int GetInterfaceAddresses (out IntPtr ifap)
257 return AndroidPlatform.GetInterfaceAddresses (out ifap);
259 return getifaddrs (out ifap);
263 public override NetworkInterface [] GetAllNetworkInterfaces ()
266 var interfaces = new Dictionary <string, LinuxNetworkInterface> ();
268 if (GetInterfaceAddresses (out ifap) != 0)
269 throw new SystemException ("getifaddrs() failed");
273 while (next != IntPtr.Zero) {
274 ifaddrs addr = (ifaddrs) Marshal.PtrToStructure (next, typeof (ifaddrs));
275 IPAddress address = IPAddress.None;
276 string name = addr.ifa_name;
278 byte[] macAddress = null;
279 NetworkInterfaceType type = NetworkInterfaceType.Unknown;
280 int nullNameCount = 0;
282 if (addr.ifa_addr != IntPtr.Zero) {
283 sockaddr_in sockaddr = (sockaddr_in) Marshal.PtrToStructure (addr.ifa_addr, typeof (sockaddr_in));
285 if (sockaddr.sin_family == AF_INET6) {
286 sockaddr_in6 sockaddr6 = (sockaddr_in6) Marshal.PtrToStructure (addr.ifa_addr, typeof (sockaddr_in6));
287 address = new IPAddress (sockaddr6.sin6_addr.u6_addr8, sockaddr6.sin6_scope_id);
288 } else if (sockaddr.sin_family == AF_INET) {
289 address = new IPAddress (sockaddr.sin_addr);
290 } else if (sockaddr.sin_family == AF_PACKET) {
291 sockaddr_ll sockaddrll = (sockaddr_ll) Marshal.PtrToStructure (addr.ifa_addr, typeof (sockaddr_ll));
292 if (((int)sockaddrll.sll_halen) > sockaddrll.sll_addr.Length){
293 Console.Error.WriteLine ("Got a bad hardware address length for an AF_PACKET {0} {1}",
294 sockaddrll.sll_halen, sockaddrll.sll_addr.Length);
295 next = addr.ifa_next;
299 macAddress = new byte [(int) sockaddrll.sll_halen];
300 Array.Copy (sockaddrll.sll_addr, 0, macAddress, 0, macAddress.Length);
301 index = sockaddrll.sll_ifindex;
303 int hwtype = (int)sockaddrll.sll_hatype;
304 if (Enum.IsDefined (typeof (LinuxArpHardware), hwtype)) {
305 switch ((LinuxArpHardware)hwtype) {
306 case LinuxArpHardware.EETHER:
307 goto case LinuxArpHardware.ETHER;
309 case LinuxArpHardware.ETHER:
310 type = NetworkInterfaceType.Ethernet;
313 case LinuxArpHardware.PRONET:
314 type = NetworkInterfaceType.TokenRing;
317 case LinuxArpHardware.ATM:
318 type = NetworkInterfaceType.Atm;
321 case LinuxArpHardware.SLIP:
322 case LinuxArpHardware.CSLIP:
323 case LinuxArpHardware.SLIP6:
324 case LinuxArpHardware.CSLIP6:
325 type = NetworkInterfaceType.Slip;
328 case LinuxArpHardware.PPP:
329 type = NetworkInterfaceType.Ppp;
332 case LinuxArpHardware.LOOPBACK:
333 type = NetworkInterfaceType.Loopback;
337 case LinuxArpHardware.FDDI:
338 type = NetworkInterfaceType.Fddi;
341 case LinuxArpHardware.SIT:
342 case LinuxArpHardware.IPDDP:
343 case LinuxArpHardware.IPGRE:
344 case LinuxArpHardware.IP6GRE:
345 case LinuxArpHardware.TUNNEL6:
346 case LinuxArpHardware.TUNNEL:
347 type = NetworkInterfaceType.Tunnel;
354 LinuxNetworkInterface iface = null;
356 if (String.IsNullOrEmpty (name))
357 name = "\0" + (++nullNameCount).ToString ();
359 if (!interfaces.TryGetValue (name, out iface)) {
360 iface = new LinuxNetworkInterface (name);
361 interfaces.Add (name, iface);
364 if (!address.Equals (IPAddress.None))
365 iface.AddAddress (address);
367 if (macAddress != null || type == NetworkInterfaceType.Loopback) {
368 if (type == NetworkInterfaceType.Ethernet) {
369 if (Directory.Exists(iface.IfacePath + "wireless")) {
370 type = NetworkInterfaceType.Wireless80211;
373 iface.SetLinkLayerInfo (index, macAddress, type);
376 next = addr.ifa_next;
379 FreeInterfaceAddresses (ifap);
382 NetworkInterface [] result = new NetworkInterface [interfaces.Count];
384 foreach (NetworkInterface thisInterface in interfaces.Values) {
385 result [x] = thisInterface;
391 public override int GetLoopbackInterfaceIndex ()
393 return if_nametoindex ("lo");
396 public override IPAddress GetNetMask (IPAddress address)
398 foreach (ifaddrs networkInteface in GetNetworkInterfaces()) {
399 if (networkInteface.ifa_addr == IntPtr.Zero)
402 var sockaddr = (sockaddr_in)Marshal.PtrToStructure(networkInteface.ifa_addr, typeof(sockaddr_in));
404 if (sockaddr.sin_family != AF_INET)
407 if (!address.Equals(new IPAddress(sockaddr.sin_addr)))
410 var netmask = (sockaddr_in)Marshal.PtrToStructure(networkInteface.ifa_netmask, typeof(sockaddr_in));
411 return new IPAddress(netmask.sin_addr);
417 private static IEnumerable<ifaddrs> GetNetworkInterfaces()
419 IntPtr ifap = IntPtr.Zero;
422 if (GetInterfaceAddresses(out ifap) != 0)
426 while (next != IntPtr.Zero) {
427 var addr = (ifaddrs)Marshal.PtrToStructure(next, typeof(ifaddrs));
429 next = addr.ifa_next;
432 if (ifap != IntPtr.Zero)
433 FreeInterfaceAddresses(ifap);
439 class Win32NetworkInterfaceAPI : NetworkInterfaceFactory
441 [DllImport ("iphlpapi.dll", SetLastError = true)]
442 static extern int GetAdaptersAddresses (uint family, uint flags, IntPtr reserved, byte [] info, ref int size);
444 unsafe static Win32_IP_ADAPTER_ADDRESSES [] GetAdaptersAddresses ()
446 byte [] bytes = null;
448 GetAdaptersAddresses (0, 0, IntPtr.Zero, bytes, ref len);
449 bytes = new byte [len];
450 int ret = GetAdaptersAddresses (0, 0, IntPtr.Zero, bytes, ref len);
452 throw new NetworkInformationException (ret);
454 List<Win32_IP_ADAPTER_ADDRESSES> l = new List<Win32_IP_ADAPTER_ADDRESSES> ();
455 fixed (byte* ptr = bytes) {
456 Win32_IP_ADAPTER_ADDRESSES info;
457 for (IntPtr p = (IntPtr) ptr; p != IntPtr.Zero; p = info.Next) {
458 info = new Win32_IP_ADAPTER_ADDRESSES ();
459 Marshal.PtrToStructure (p, info);
466 public override NetworkInterface [] GetAllNetworkInterfaces ()
468 // Win32_IP_ADAPTER_INFO [] ai = GetAdaptersInfo ();
469 Win32_IP_ADAPTER_ADDRESSES [] aa = GetAdaptersAddresses ();
470 NetworkInterface [] ret = new NetworkInterface [aa.Length];
471 for (int i = 0; i < ret.Length; i++)
472 ret [i] = new Win32NetworkInterface2 (aa [i]);
476 public override int GetLoopbackInterfaceIndex ()
478 throw new NotImplementedException ();
481 public override IPAddress GetNetMask (IPAddress address)
483 throw new NotImplementedException ();
488 public abstract NetworkInterface [] GetAllNetworkInterfaces ();
489 public abstract int GetLoopbackInterfaceIndex ();
490 public abstract IPAddress GetNetMask (IPAddress address);
492 public static NetworkInterfaceFactory Create ()
494 #if MONOTOUCH || XAMMAC
495 return new MacOsNetworkInterfaceAPI ();
497 Version windowsVer51 = new Version (5, 1);
498 bool runningOnUnix = (Environment.OSVersion.Platform == PlatformID.Unix);
501 if (Platform.IsMacOS || Platform.IsFreeBSD)
502 return new MacOsNetworkInterfaceAPI ();
504 return new LinuxNetworkInterfaceAPI ();
508 if (Environment.OSVersion.Version >= windowsVer51)
509 return new Win32NetworkInterfaceAPI ();
512 throw new NotImplementedException ();
517 abstract class UnixNetworkInterface : NetworkInterface
520 protected IPv4InterfaceStatistics ipv4stats;
521 protected IPInterfaceProperties ipproperties;
525 protected List <IPAddress> addresses;
527 NetworkInterfaceType type;
529 internal UnixNetworkInterface (string name)
532 addresses = new List<IPAddress> ();
535 internal void AddAddress (IPAddress address)
537 addresses.Add (address);
540 internal void SetLinkLayerInfo (int index, byte[] macAddress, NetworkInterfaceType type)
542 //this.index = index;
543 this.macAddress = macAddress;
547 public override PhysicalAddress GetPhysicalAddress ()
549 if (macAddress != null)
550 return new PhysicalAddress (macAddress);
552 return PhysicalAddress.None;
555 public override bool Supports (NetworkInterfaceComponent networkInterfaceComponent)
557 bool wantIPv4 = networkInterfaceComponent == NetworkInterfaceComponent.IPv4;
558 bool wantIPv6 = wantIPv4 ? false : networkInterfaceComponent == NetworkInterfaceComponent.IPv6;
560 foreach (IPAddress address in addresses) {
561 if (wantIPv4 && address.AddressFamily == AddressFamily.InterNetwork)
563 else if (wantIPv6 && address.AddressFamily == AddressFamily.InterNetworkV6)
570 public override string Description {
574 public override string Id {
578 public override bool IsReceiveOnly {
579 get { return false; }
582 public override string Name {
586 public override NetworkInterfaceType NetworkInterfaceType {
590 [MonoTODO ("Parse dmesg?")]
591 public override long Speed {
598 internal int NameIndex {
600 return NetworkInterfaceFactory.UnixNetworkInterfaceAPI.if_nametoindex (Name);
606 // This class needs support from the libsupport.so library to fetch the
607 // data using arch-specific ioctls.
609 // For this to work, we have to create this on the factory above.
611 sealed class LinuxNetworkInterface : UnixNetworkInterface
613 //NetworkInterfaceType type;
615 string iface_operstate_path;
616 string iface_flags_path;
618 internal string IfacePath {
619 get { return iface_path; }
622 internal LinuxNetworkInterface (string name)
625 iface_path = "/sys/class/net/" + name + "/";
626 iface_operstate_path = iface_path + "operstate";
627 iface_flags_path = iface_path + "flags";
630 public override IPInterfaceProperties GetIPProperties ()
632 if (ipproperties == null)
633 ipproperties = new LinuxIPInterfaceProperties (this, addresses);
637 public override IPv4InterfaceStatistics GetIPv4Statistics ()
639 if (ipv4stats == null)
640 ipv4stats = new LinuxIPv4InterfaceStatistics (this);
644 public override OperationalStatus OperationalStatus {
646 if (!Directory.Exists (iface_path))
647 return OperationalStatus.Unknown;
650 string s = ReadLine (iface_operstate_path);
654 return OperationalStatus.Unknown;
657 return OperationalStatus.NotPresent;
660 return OperationalStatus.Down;
662 case "lowerlayerdown":
663 return OperationalStatus.LowerLayerDown;
666 return OperationalStatus.Testing;
669 return OperationalStatus.Dormant;
672 return OperationalStatus.Up;
676 return OperationalStatus.Unknown;
680 public override bool SupportsMulticast {
682 if (!Directory.Exists (iface_path))
686 string s = ReadLine (iface_flags_path);
687 if (s.Length > 2 && s [0] == '0' && s [1] == 'x')
690 ulong f = UInt64.Parse (s, NumberStyles.HexNumber);
692 // Hardcoded, only useful for Linux.
693 return ((f & 0x1000) == 0x1000);
700 internal static string ReadLine (string path)
702 using (FileStream fs = File.OpenRead (path)){
703 using (StreamReader sr = new StreamReader (fs)){
704 return sr.ReadLine ();
710 sealed class MacOsNetworkInterface : UnixNetworkInterface
712 private uint _ifa_flags;
714 internal MacOsNetworkInterface (string name, uint ifa_flags)
717 _ifa_flags = ifa_flags;
720 public override IPInterfaceProperties GetIPProperties ()
722 if (ipproperties == null)
723 ipproperties = new MacOsIPInterfaceProperties (this, addresses);
727 public override IPv4InterfaceStatistics GetIPv4Statistics ()
729 if (ipv4stats == null)
730 ipv4stats = new MacOsIPv4InterfaceStatistics (this);
734 public override OperationalStatus OperationalStatus {
736 if(((MacOsInterfaceFlags)_ifa_flags & MacOsInterfaceFlags.IFF_UP) == MacOsInterfaceFlags.IFF_UP){
737 return OperationalStatus.Up;
739 return OperationalStatus.Unknown;
743 public override bool SupportsMulticast {
745 return ((MacOsInterfaceFlags)_ifa_flags & MacOsInterfaceFlags.IFF_MULTICAST) == MacOsInterfaceFlags.IFF_MULTICAST;
751 class Win32NetworkInterface2 : NetworkInterface
753 [DllImport ("iphlpapi.dll", SetLastError = true)]
754 static extern int GetAdaptersInfo (byte [] info, ref int size);
756 [DllImport ("iphlpapi.dll", SetLastError = true)]
757 static extern int GetIfEntry (ref Win32_MIB_IFROW row);
759 public static Win32_IP_ADAPTER_INFO GetAdapterInfoByIndex (int index)
761 foreach (Win32_IP_ADAPTER_INFO info in GetAdaptersInfo ())
762 if (info.Index == index)
767 unsafe static Win32_IP_ADAPTER_INFO [] GetAdaptersInfo ()
769 byte [] bytes = null;
771 GetAdaptersInfo (bytes, ref len);
772 bytes = new byte [len];
773 int ret = GetAdaptersInfo (bytes, ref len);
776 throw new NetworkInformationException (ret);
778 List<Win32_IP_ADAPTER_INFO> l = new List<Win32_IP_ADAPTER_INFO> ();
779 fixed (byte* ptr = bytes) {
780 Win32_IP_ADAPTER_INFO info;
781 for (IntPtr p = (IntPtr) ptr; p != IntPtr.Zero; p = info.Next) {
782 info = new Win32_IP_ADAPTER_INFO ();
783 Marshal.PtrToStructure (p, info);
790 Win32_IP_ADAPTER_ADDRESSES addr;
791 Win32_MIB_IFROW mib4, mib6;
792 Win32IPv4InterfaceStatistics ip4stats;
793 IPInterfaceProperties ip_if_props;
795 internal Win32NetworkInterface2 (Win32_IP_ADAPTER_ADDRESSES addr)
798 mib4 = default (Win32_MIB_IFROW);
799 mib4.Index = addr.Alignment.IfIndex;
800 if (GetIfEntry (ref mib4) != 0)
801 mib4.Index = -1; // unavailable;
802 mib6 = default (Win32_MIB_IFROW);
803 mib6.Index = addr.Ipv6IfIndex;
804 if (GetIfEntry (ref mib6) != 0)
805 mib6.Index = -1; // unavailable;
806 ip4stats = new Win32IPv4InterfaceStatistics (mib4);
807 ip_if_props = new Win32IPInterfaceProperties2 (addr, mib4, mib6);
810 public override IPInterfaceProperties GetIPProperties ()
815 public override IPv4InterfaceStatistics GetIPv4Statistics ()
820 public override PhysicalAddress GetPhysicalAddress ()
822 byte [] bytes = new byte [addr.PhysicalAddressLength];
823 Array.Copy (addr.PhysicalAddress, 0, bytes, 0, bytes.Length);
824 return new PhysicalAddress (bytes);
827 public override bool Supports (NetworkInterfaceComponent networkInterfaceComponent)
829 switch (networkInterfaceComponent) {
830 case NetworkInterfaceComponent.IPv4:
831 return mib4.Index >= 0;
832 case NetworkInterfaceComponent.IPv6:
833 return mib6.Index >= 0;
838 public override string Description {
839 get { return addr.Description; }
841 public override string Id {
842 get { return addr.AdapterName; }
844 public override bool IsReceiveOnly {
845 get { return addr.IsReceiveOnly; }
847 public override string Name {
848 get { return addr.FriendlyName; }
850 public override NetworkInterfaceType NetworkInterfaceType {
851 get { return addr.IfType; }
853 public override OperationalStatus OperationalStatus {
854 get { return addr.OperStatus; }
856 public override long Speed {
857 get { return mib6.Index >= 0 ? mib6.Speed : mib4.Speed; }
859 public override bool SupportsMulticast {
860 get { return !addr.NoMulticast; }