| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724 |
- //
- // System.Net.NetworkInformation.NetworkInterface
- //
- // Authors:
- // Gonzalo Paniagua Javier ([email protected])
- // Atsushi Enomoto ([email protected])
- // Miguel de Icaza ([email protected])
- // Eric Butler ([email protected])
- // Marek Habersack ([email protected])
- //
- // Copyright (c) 2006-2008 Novell, Inc. (http://www.novell.com)
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- using System;
- using System.Collections.Generic;
- using System.Collections;
- using System.Net;
- using System.Net.Sockets;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.IO;
- using System.Globalization;
- namespace System.Net.NetworkInformation {
- public abstract class NetworkInterface {
- #if MONOTOUCH
- internal const bool runningOnUnix = true;
- #else
- static Version windowsVer51 = new Version (5, 1);
- static internal readonly bool runningOnUnix = (Environment.OSVersion.Platform == PlatformID.Unix);
- #endif
- protected NetworkInterface ()
- {
- }
- public static NetworkInterface [] GetAllNetworkInterfaces ()
- {
- #if MONOTOUCH
- return MacOsNetworkInterface.ImplGetAllNetworkInterfaces ();
- #else
- if (runningOnUnix) {
- try {
- if (Platform.IsMacOS)
- return MacOsNetworkInterface.ImplGetAllNetworkInterfaces ();
- else
- return LinuxNetworkInterface.ImplGetAllNetworkInterfaces ();
- } catch (SystemException ex) {
- throw ex;
- } catch {
- return new NetworkInterface [0];
- }
- } else {
- if (Environment.OSVersion.Version >= windowsVer51)
- return Win32NetworkInterface2.ImplGetAllNetworkInterfaces ();
- return new NetworkInterface [0];
- }
- #endif
- }
- [MonoTODO("Always returns true")]
- public static bool GetIsNetworkAvailable ()
- {
- return true;
- }
- internal static string ReadLine (string path)
- {
- using (FileStream fs = File.OpenRead (path)){
- using (StreamReader sr = new StreamReader (fs)){
- return sr.ReadLine ();
- }
- }
- }
-
- [MonoTODO("Only works on Linux. Returns 0 on other systems.")]
- public static int LoopbackInterfaceIndex {
- get {
- // Disable warning for code not reachable, due to runningOnUnix being always true on Monotouch
- #pragma warning disable 162
- if (runningOnUnix) {
- try {
- return UnixNetworkInterface.IfNameToIndex ("lo");
- } catch {
- return 0;
- }
- } else
- return 0;
- #pragma warning restore 162
- }
- }
- public abstract IPInterfaceProperties GetIPProperties ();
- public abstract IPv4InterfaceStatistics GetIPv4Statistics ();
- public abstract PhysicalAddress GetPhysicalAddress ();
- public abstract bool Supports (NetworkInterfaceComponent networkInterfaceComponent);
- public abstract string Description { get; }
- public abstract string Id { get; }
- public abstract bool IsReceiveOnly { get; }
- public abstract string Name { get; }
- public abstract NetworkInterfaceType NetworkInterfaceType { get; }
- public abstract OperationalStatus OperationalStatus { get; }
- public abstract long Speed { get; }
- public abstract bool SupportsMulticast { get; }
- }
- abstract class UnixNetworkInterface : NetworkInterface
- {
- [DllImport("libc")]
- static extern int if_nametoindex(string ifname);
- protected IPv4InterfaceStatistics ipv4stats;
- protected IPInterfaceProperties ipproperties;
-
- string name;
- //int index;
- protected List <IPAddress> addresses;
- byte[] macAddress;
- NetworkInterfaceType type;
-
- internal UnixNetworkInterface (string name)
- {
- this.name = name;
- addresses = new List<IPAddress> ();
- }
- public static int IfNameToIndex (string ifname)
- {
- return if_nametoindex(ifname);
- }
-
- internal void AddAddress (IPAddress address)
- {
- addresses.Add (address);
- }
- internal void SetLinkLayerInfo (int index, byte[] macAddress, NetworkInterfaceType type)
- {
- //this.index = index;
- this.macAddress = macAddress;
- this.type = type;
- }
- public override PhysicalAddress GetPhysicalAddress ()
- {
- if (macAddress != null)
- return new PhysicalAddress (macAddress);
- else
- return PhysicalAddress.None;
- }
- public override bool Supports (NetworkInterfaceComponent networkInterfaceComponent)
- {
- bool wantIPv4 = networkInterfaceComponent == NetworkInterfaceComponent.IPv4;
- bool wantIPv6 = wantIPv4 ? false : networkInterfaceComponent == NetworkInterfaceComponent.IPv6;
-
- foreach (IPAddress address in addresses) {
- if (wantIPv4 && address.AddressFamily == AddressFamily.InterNetwork)
- return true;
- else if (wantIPv6 && address.AddressFamily == AddressFamily.InterNetworkV6)
- return true;
- }
-
- return false;
- }
- public override string Description {
- get { return name; }
- }
- public override string Id {
- get { return name; }
- }
- public override bool IsReceiveOnly {
- get { return false; }
- }
- public override string Name {
- get { return name; }
- }
-
- public override NetworkInterfaceType NetworkInterfaceType {
- get { return type; }
- }
-
- [MonoTODO ("Parse dmesg?")]
- public override long Speed {
- get {
- // Bits/s
- return 1000000;
- }
- }
- }
- //
- // This class needs support from the libsupport.so library to fetch the
- // data using arch-specific ioctls.
- //
- // For this to work, we have to create this on the factory above.
- //
- class LinuxNetworkInterface : UnixNetworkInterface
- {
- [DllImport ("libc")]
- static extern int getifaddrs (out IntPtr ifap);
- [DllImport ("libc")]
- static extern void freeifaddrs (IntPtr ifap);
- const int AF_INET = 2;
- const int AF_INET6 = 10;
- const int AF_PACKET = 17;
-
- //NetworkInterfaceType type;
- string iface_path;
- string iface_operstate_path;
- string iface_flags_path;
- internal string IfacePath {
- get { return iface_path; }
- }
-
- public static NetworkInterface [] ImplGetAllNetworkInterfaces ()
- {
- var interfaces = new Dictionary <string, LinuxNetworkInterface> ();
- IntPtr ifap;
- if (getifaddrs (out ifap) != 0)
- throw new SystemException ("getifaddrs() failed");
- try {
- IntPtr next = ifap;
- while (next != IntPtr.Zero) {
- ifaddrs addr = (ifaddrs) Marshal.PtrToStructure (next, typeof (ifaddrs));
- IPAddress address = IPAddress.None;
- string name = addr.ifa_name;
- int index = -1;
- byte[] macAddress = null;
- NetworkInterfaceType type = NetworkInterfaceType.Unknown;
- if (addr.ifa_addr != IntPtr.Zero) {
- sockaddr_in sockaddr = (sockaddr_in) Marshal.PtrToStructure (addr.ifa_addr, typeof (sockaddr_in));
- if (sockaddr.sin_family == AF_INET6) {
- sockaddr_in6 sockaddr6 = (sockaddr_in6) Marshal.PtrToStructure (addr.ifa_addr, typeof (sockaddr_in6));
- address = new IPAddress (sockaddr6.sin6_addr.u6_addr8, sockaddr6.sin6_scope_id);
- } else if (sockaddr.sin_family == AF_INET) {
- address = new IPAddress (sockaddr.sin_addr);
- } else if (sockaddr.sin_family == AF_PACKET) {
- sockaddr_ll sockaddrll = (sockaddr_ll) Marshal.PtrToStructure (addr.ifa_addr, typeof (sockaddr_ll));
- if (((int)sockaddrll.sll_halen) > sockaddrll.sll_addr.Length){
- Console.Error.WriteLine ("Got a bad hardware address length for an AF_PACKET {0} {1}",
- sockaddrll.sll_halen, sockaddrll.sll_addr.Length);
- next = addr.ifa_next;
- continue;
- }
-
- macAddress = new byte [(int) sockaddrll.sll_halen];
- Array.Copy (sockaddrll.sll_addr, 0, macAddress, 0, macAddress.Length);
- index = sockaddrll.sll_ifindex;
- int hwtype = (int)sockaddrll.sll_hatype;
- if (Enum.IsDefined (typeof (LinuxArpHardware), hwtype)) {
- switch ((LinuxArpHardware)hwtype) {
- case LinuxArpHardware.EETHER:
- goto case LinuxArpHardware.ETHER;
-
- case LinuxArpHardware.ETHER:
- type = NetworkInterfaceType.Ethernet;
- break;
- case LinuxArpHardware.PRONET:
- type = NetworkInterfaceType.TokenRing;
- break;
- case LinuxArpHardware.ATM:
- type = NetworkInterfaceType.Atm;
- break;
-
- case LinuxArpHardware.SLIP:
- type = NetworkInterfaceType.Slip;
- break;
-
- case LinuxArpHardware.PPP:
- type = NetworkInterfaceType.Ppp;
- break;
-
- case LinuxArpHardware.LOOPBACK:
- type = NetworkInterfaceType.Loopback;
- macAddress = null;
- break;
- case LinuxArpHardware.FDDI:
- type = NetworkInterfaceType.Fddi;
- break;
- case LinuxArpHardware.TUNNEL6:
- goto case LinuxArpHardware.TUNNEL;
-
- case LinuxArpHardware.TUNNEL:
- type = NetworkInterfaceType.Tunnel;
- break;
- }
- }
- }
- }
- LinuxNetworkInterface iface = null;
- if (!interfaces.TryGetValue (name, out iface)) {
- iface = new LinuxNetworkInterface (name);
- interfaces.Add (name, iface);
- }
- if (!address.Equals (IPAddress.None))
- iface.AddAddress (address);
- if (macAddress != null || type == NetworkInterfaceType.Loopback) {
- if (type == NetworkInterfaceType.Ethernet) {
- if (Directory.Exists(iface.IfacePath + "wireless")) {
- type = NetworkInterfaceType.Wireless80211;
- }
- }
- iface.SetLinkLayerInfo (index, macAddress, type);
- }
- next = addr.ifa_next;
- }
- } finally {
- freeifaddrs (ifap);
- }
- NetworkInterface [] result = new NetworkInterface [interfaces.Count];
- int x = 0;
- foreach (NetworkInterface thisInterface in interfaces.Values) {
- result [x] = thisInterface;
- x++;
- }
- return result;
- }
-
- LinuxNetworkInterface (string name)
- : base (name)
- {
- iface_path = "/sys/class/net/" + name + "/";
- iface_operstate_path = iface_path + "operstate";
- iface_flags_path = iface_path + "flags";
- }
- public override IPInterfaceProperties GetIPProperties ()
- {
- if (ipproperties == null)
- ipproperties = new LinuxIPInterfaceProperties (this, addresses);
- return ipproperties;
- }
- public override IPv4InterfaceStatistics GetIPv4Statistics ()
- {
- if (ipv4stats == null)
- ipv4stats = new LinuxIPv4InterfaceStatistics (this);
- return ipv4stats;
- }
- public override OperationalStatus OperationalStatus {
- get {
- if (!Directory.Exists (iface_path))
- return OperationalStatus.Unknown;
-
- try {
- string s = ReadLine (iface_operstate_path);
- switch (s){
- case "unknown":
- return OperationalStatus.Unknown;
-
- case "notpresent":
- return OperationalStatus.NotPresent;
- case "down":
- return OperationalStatus.Down;
- case "lowerlayerdown":
- return OperationalStatus.LowerLayerDown;
- case "testing":
- return OperationalStatus.Testing;
- case "dormant":
- return OperationalStatus.Dormant;
- case "up":
- return OperationalStatus.Up;
- }
- } catch {
- }
- return OperationalStatus.Unknown;
- }
- }
- public override bool SupportsMulticast {
- get {
- if (!Directory.Exists (iface_path))
- return false;
-
- try {
- string s = ReadLine (iface_flags_path);
- if (s.Length > 2 && s [0] == '0' && s [1] == 'x')
- s = s.Substring (2);
-
- ulong f = UInt64.Parse (s, NumberStyles.HexNumber);
- // Hardcoded, only useful for Linux.
- return ((f & 0x1000) == 0x1000);
- } catch {
- return false;
- }
- }
- }
- }
- class MacOsNetworkInterface : UnixNetworkInterface
- {
- [DllImport ("libc")]
- static extern int getifaddrs (out IntPtr ifap);
- [DllImport ("libc")]
- static extern void freeifaddrs (IntPtr ifap);
- const int AF_INET = 2;
- const int AF_INET6 = 30;
- const int AF_LINK = 18;
-
- public static NetworkInterface [] ImplGetAllNetworkInterfaces ()
- {
- var interfaces = new Dictionary <string, MacOsNetworkInterface> ();
- IntPtr ifap;
- if (getifaddrs (out ifap) != 0)
- throw new SystemException ("getifaddrs() failed");
- try {
- IntPtr next = ifap;
- while (next != IntPtr.Zero) {
- MacOsStructs.ifaddrs addr = (MacOsStructs.ifaddrs) Marshal.PtrToStructure (next, typeof (MacOsStructs.ifaddrs));
- IPAddress address = IPAddress.None;
- string name = addr.ifa_name;
- int index = -1;
- byte[] macAddress = null;
- NetworkInterfaceType type = NetworkInterfaceType.Unknown;
- if (addr.ifa_addr != IntPtr.Zero) {
- MacOsStructs.sockaddr sockaddr = (MacOsStructs.sockaddr) Marshal.PtrToStructure (addr.ifa_addr, typeof (MacOsStructs.sockaddr));
- if (sockaddr.sa_family == AF_INET6) {
- MacOsStructs.sockaddr_in6 sockaddr6 = (MacOsStructs.sockaddr_in6) Marshal.PtrToStructure (addr.ifa_addr, typeof (MacOsStructs.sockaddr_in6));
- address = new IPAddress (sockaddr6.sin6_addr.u6_addr8, sockaddr6.sin6_scope_id);
- } else if (sockaddr.sa_family == AF_INET) {
- MacOsStructs.sockaddr_in sockaddrin = (MacOsStructs.sockaddr_in) Marshal.PtrToStructure (addr.ifa_addr, typeof (MacOsStructs.sockaddr_in));
- address = new IPAddress (sockaddrin.sin_addr);
- } else if (sockaddr.sa_family == AF_LINK) {
- MacOsStructs.sockaddr_dl sockaddrdl = new MacOsStructs.sockaddr_dl ();
- sockaddrdl.Read (addr.ifa_addr);
- macAddress = new byte [(int) sockaddrdl.sdl_alen];
- Array.Copy (sockaddrdl.sdl_data, sockaddrdl.sdl_nlen, macAddress, 0, Math.Min (macAddress.Length, sockaddrdl.sdl_data.Length - sockaddrdl.sdl_nlen));
- index = sockaddrdl.sdl_index;
- int hwtype = (int) sockaddrdl.sdl_type;
- if (Enum.IsDefined (typeof (MacOsArpHardware), hwtype)) {
- switch ((MacOsArpHardware) hwtype) {
- case MacOsArpHardware.ETHER:
- type = NetworkInterfaceType.Ethernet;
- break;
- case MacOsArpHardware.ATM:
- type = NetworkInterfaceType.Atm;
- break;
-
- case MacOsArpHardware.SLIP:
- type = NetworkInterfaceType.Slip;
- break;
-
- case MacOsArpHardware.PPP:
- type = NetworkInterfaceType.Ppp;
- break;
-
- case MacOsArpHardware.LOOPBACK:
- type = NetworkInterfaceType.Loopback;
- macAddress = null;
- break;
- case MacOsArpHardware.FDDI:
- type = NetworkInterfaceType.Fddi;
- break;
- }
- }
- }
- }
- MacOsNetworkInterface iface = null;
- if (!interfaces.TryGetValue (name, out iface)) {
- iface = new MacOsNetworkInterface (name);
- interfaces.Add (name, iface);
- }
- if (!address.Equals (IPAddress.None))
- iface.AddAddress (address);
- if (macAddress != null || type == NetworkInterfaceType.Loopback)
- iface.SetLinkLayerInfo (index, macAddress, type);
- next = addr.ifa_next;
- }
- } finally {
- freeifaddrs (ifap);
- }
- NetworkInterface [] result = new NetworkInterface [interfaces.Count];
- int x = 0;
- foreach (NetworkInterface thisInterface in interfaces.Values) {
- result [x] = thisInterface;
- x++;
- }
- return result;
- }
-
- MacOsNetworkInterface (string name)
- : base (name)
- {
- }
- public override IPInterfaceProperties GetIPProperties ()
- {
- if (ipproperties == null)
- ipproperties = new MacOsIPInterfaceProperties (this, addresses);
- return ipproperties;
- }
- public override IPv4InterfaceStatistics GetIPv4Statistics ()
- {
- if (ipv4stats == null)
- ipv4stats = new MacOsIPv4InterfaceStatistics (this);
- return ipv4stats;
- }
- public override OperationalStatus OperationalStatus {
- get {
- return OperationalStatus.Unknown;
- }
- }
- public override bool SupportsMulticast {
- get {
- return false;
- }
- }
- }
- class Win32NetworkInterface2 : NetworkInterface
- {
- [DllImport ("iphlpapi.dll", SetLastError = true)]
- static extern int GetAdaptersInfo (byte [] info, ref int size);
- [DllImport ("iphlpapi.dll", SetLastError = true)]
- static extern int GetAdaptersAddresses (uint family, uint flags, IntPtr reserved, byte [] info, ref int size);
- [DllImport ("iphlpapi.dll", SetLastError = true)]
- static extern int GetIfEntry (ref Win32_MIB_IFROW row);
- public static NetworkInterface [] ImplGetAllNetworkInterfaces ()
- {
- // Win32_IP_ADAPTER_INFO [] ai = GetAdaptersInfo ();
- Win32_IP_ADAPTER_ADDRESSES [] aa = GetAdaptersAddresses ();
- NetworkInterface [] ret = new NetworkInterface [aa.Length];
- for (int i = 0; i < ret.Length; i++)
- ret [i] = new Win32NetworkInterface2 (aa [i]);
- return ret;
- }
- public static Win32_IP_ADAPTER_INFO GetAdapterInfoByIndex (int index)
- {
- foreach (Win32_IP_ADAPTER_INFO info in GetAdaptersInfo ())
- if (info.Index == index)
- return info;
- return null;
- }
- unsafe static Win32_IP_ADAPTER_INFO [] GetAdaptersInfo ()
- {
- byte [] bytes = null;
- int len = 0;
- GetAdaptersInfo (bytes, ref len);
- bytes = new byte [len];
- int ret = GetAdaptersInfo (bytes, ref len);
- if (ret != 0)
- throw new NetworkInformationException (ret);
- List<Win32_IP_ADAPTER_INFO> l = new List<Win32_IP_ADAPTER_INFO> ();
- fixed (byte* ptr = bytes) {
- Win32_IP_ADAPTER_INFO info;
- for (IntPtr p = (IntPtr) ptr; p != IntPtr.Zero; p = info.Next) {
- info = new Win32_IP_ADAPTER_INFO ();
- Marshal.PtrToStructure (p, info);
- l.Add (info);
- }
- }
- return l.ToArray ();
- }
- unsafe static Win32_IP_ADAPTER_ADDRESSES [] GetAdaptersAddresses ()
- {
- byte [] bytes = null;
- int len = 0;
- GetAdaptersAddresses (0, 0, IntPtr.Zero, bytes, ref len);
- bytes = new byte [len];
- int ret = GetAdaptersAddresses (0, 0, IntPtr.Zero, bytes, ref len);
- if (ret != 0)
- throw new NetworkInformationException (ret);
- List<Win32_IP_ADAPTER_ADDRESSES> l = new List<Win32_IP_ADAPTER_ADDRESSES> ();
- fixed (byte* ptr = bytes) {
- Win32_IP_ADAPTER_ADDRESSES info;
- for (IntPtr p = (IntPtr) ptr; p != IntPtr.Zero; p = info.Next) {
- info = new Win32_IP_ADAPTER_ADDRESSES ();
- Marshal.PtrToStructure (p, info);
- l.Add (info);
- }
- }
- return l.ToArray ();
- }
- Win32_IP_ADAPTER_ADDRESSES addr;
- Win32_MIB_IFROW mib4, mib6;
- Win32IPv4InterfaceStatistics ip4stats;
- IPInterfaceProperties ip_if_props;
- Win32NetworkInterface2 (Win32_IP_ADAPTER_ADDRESSES addr)
- {
- this.addr = addr;
- mib4 = default (Win32_MIB_IFROW);
- mib4.Index = addr.Alignment.IfIndex;
- if (GetIfEntry (ref mib4) != 0)
- mib4.Index = -1; // unavailable;
- mib6 = default (Win32_MIB_IFROW);
- mib6.Index = addr.Ipv6IfIndex;
- if (GetIfEntry (ref mib6) != 0)
- mib6.Index = -1; // unavailable;
- ip4stats = new Win32IPv4InterfaceStatistics (mib4);
- ip_if_props = new Win32IPInterfaceProperties2 (addr, mib4, mib6);
- }
- public override IPInterfaceProperties GetIPProperties ()
- {
- return ip_if_props;
- }
- public override IPv4InterfaceStatistics GetIPv4Statistics ()
- {
- return ip4stats;
- }
- public override PhysicalAddress GetPhysicalAddress ()
- {
- byte [] bytes = new byte [addr.PhysicalAddressLength];
- Array.Copy (addr.PhysicalAddress, 0, bytes, 0, bytes.Length);
- return new PhysicalAddress (bytes);
- }
- public override bool Supports (NetworkInterfaceComponent networkInterfaceComponent)
- {
- switch (networkInterfaceComponent) {
- case NetworkInterfaceComponent.IPv4:
- return mib4.Index >= 0;
- case NetworkInterfaceComponent.IPv6:
- return mib6.Index >= 0;
- }
- return false;
- }
- public override string Description {
- get { return addr.Description; }
- }
- public override string Id {
- get { return addr.AdapterName; }
- }
- public override bool IsReceiveOnly {
- get { return addr.IsReceiveOnly; }
- }
- public override string Name {
- get { return addr.FriendlyName; }
- }
- public override NetworkInterfaceType NetworkInterfaceType {
- get { return addr.IfType; }
- }
- public override OperationalStatus OperationalStatus {
- get { return addr.OperStatus; }
- }
- public override long Speed {
- get { return mib6.Index >= 0 ? mib6.Speed : mib4.Speed; }
- }
- public override bool SupportsMulticast {
- get { return !addr.NoMulticast; }
- }
- }
- }
|