[Mono-dev] [Mono-osx] [PATCH] Simple implementation of network interface properties for Mac OS X

Miguel de Icaza miguel at novell.com
Sat May 16 13:25:12 EDT 2009


Hello Alex,

     Thanks for this patch submission;   I am going to test the patch  
on Mac and Linux and commit your code once it is ready.

Miguel.

On May 15, 2009, at 11:14 AM, Alex Shulgin wrote:

> Alex Shulgin wrote:
>> Hi,
>> In the current version  
>> System.Net.NetworkInformation.NetworkInterface provides limited  
>> information about network interfaces on the system (their names  
>> only).
>> The attached patch adds support for NetworkInterfaceType and  
>> GetPhysicalAddress() on Mac OS.
>
> Oops, I've almost forgot about IPv6... and missed the added file  
> MacOsNetworkInterfaceMarshal.
>
> Please see the fixed patch instead.
>
> --
> Alex
>
> Index: System.dll.sources
> ===================================================================
> --- System.dll.sources	(revision 133967)
> +++ System.dll.sources	(working copy)
> @@ -761,6 +761,7 @@
> System.Net.NetworkInformation/IPv4InterfaceStatistics.cs
> System.Net.NetworkInformation/IPv6InterfaceProperties.cs
> System.Net.NetworkInformation/LinuxNetworkInterfaceMarshal.cs
> +System.Net.NetworkInformation/MacOsNetworkInterfaceMarshal.cs
> System.Net.NetworkInformation/ 
> MulticastIPAddressInformationCollection.cs
> System.Net.NetworkInformation/MulticastIPAddressInformation.cs
> System.Net.NetworkInformation/NetBiosNodeType.cs
> Index: System.Net.NetworkInformation/IPv4InterfaceStatistics.cs
> ===================================================================
> --- System.Net.NetworkInformation/IPv4InterfaceStatistics.cs	 
> (revision 133967)
> +++ System.Net.NetworkInformation/IPv4InterfaceStatistics.cs	 
> (working copy)
> @@ -201,8 +201,65 @@
> 				return Read ("statistics/tx_packets");
> 			}
> 		}
> +	}
>
> +	// dummy class
> +	class MacOsIPv4InterfaceStatistics : IPv4InterfaceStatistics
> +	{
> +		MacOsNetworkInterface macos;
> 		
> +		public MacOsIPv4InterfaceStatistics (MacOsNetworkInterface parent)
> +		{
> +			macos = parent;
> +		}
> +
> +		public override long BytesReceived {
> +			get { return 0; }
> +		}
> +
> +		public override long BytesSent {
> +			get { return 0; }
> +		}
> +
> +		public override long IncomingPacketsDiscarded {
> +			get { return 0; }
> +		}
> +
> +		public override long IncomingPacketsWithErrors {
> +			get { return 0; }
> +		}
> +
> +		public override long IncomingUnknownProtocolPackets {
> +			get { return 0; }
> +		}
> +
> +		public override long NonUnicastPacketsReceived {
> +			get { return 0; }
> +		}
> +
> +		public override long NonUnicastPacketsSent {
> +			get { return 0; }
> +		}
> +
> +		public override long OutgoingPacketsDiscarded {
> +			get { return 0; }
> +		}
> +
> +		public override long OutgoingPacketsWithErrors {
> +			get { return 0; }
> +		}
> +
> +		public override long OutputQueueLength {
> +			get { return 0; }
> +		}
> +
> +		public override long UnicastPacketsReceived {
> +			get { return 0; }
> +		}
> +
> +		public override long UnicastPacketsSent {
> +			get { return 0; }
> +		}
> 	}
> 	
> }
> Index: System.Net.NetworkInformation/MacOsNetworkInterfaceMarshal.cs
> ===================================================================
> --- System.Net.NetworkInformation/MacOsNetworkInterfaceMarshal.cs	 
> (revision 0)
> +++ System.Net.NetworkInformation/MacOsNetworkInterfaceMarshal.cs	 
> (revision 0)
> @@ -0,0 +1,73 @@
> +#if NET_2_0
> +using System;
> +using System.Runtime.InteropServices;
> +
> +namespace System.Net.NetworkInformation {
> +	namespace MacOsStructs {
> +		internal struct ifaddrs
> +		{
> +			public IntPtr  ifa_next;
> +			public string  ifa_name;
> +			public uint    ifa_flags;
> +			public IntPtr  ifa_addr;
> +			public IntPtr  ifa_netmask;
> +			public IntPtr  ifa_dstaddr;
> +			public IntPtr  ifa_data;
> +		}
> +
> +		internal struct sockaddr
> +		{
> +			public byte  sa_len;
> +			public byte  sa_family;
> +		}
> +
> +		internal struct sockaddr_in
> +		{
> +			public byte   sin_len;
> +			public byte   sin_family;
> +			public ushort sin_port;
> +			public uint   sin_addr;
> +		}
> +
> +		internal struct in6_addr
> +		{
> +			[MarshalAs (UnmanagedType.ByValArray, SizeConst=16)]
> +			public byte[] u6_addr8;
> +		}
> +
> +		internal struct sockaddr_in6
> +		{
> +			public byte     sin6_len;
> +			public byte     sin6_family;
> +			public ushort   sin6_port;
> +			public uint     sin6_flowinfo;
> +			public in6_addr sin6_addr;
> +			public uint     sin6_scope_id;
> +		}
> +
> +		internal struct sockaddr_dl
> +		{
> +			public byte   sdl_len;
> +			public byte   sdl_family;
> +			public ushort sdl_index;
> +			public byte   sdl_type;
> +			public byte   sdl_nlen;
> +			public byte   sdl_alen;
> +			public byte   sdl_slen;
> +
> +			[MarshalAs (UnmanagedType.ByValArray, SizeConst=12)]
> +			public byte[] sdl_data;
> +		}
> +
> +	}
> +
> +	internal enum MacOsArpHardware {
> +		ETHER = 0x6,
> +		ATM = 0x25,
> +		SLIP = 0x1c,
> +		PPP = 0x17,
> +		LOOPBACK = 0x18,
> +		FDDI = 0xf
> +	}
> +}
> +#endif
> Index: System.Net.NetworkInformation/IPv4InterfaceProperties.cs
> ===================================================================
> --- System.Net.NetworkInformation/IPv4InterfaceProperties.cs	 
> (revision 133967)
> +++ System.Net.NetworkInformation/IPv4InterfaceProperties.cs	 
> (working copy)
> @@ -46,17 +46,17 @@
> 		public abstract bool UsesWins { get; }
> 	}
>
> -	sealed class LinuxIPv4InterfaceProperties : IPv4InterfaceProperties
> +	abstract class UnixIPv4InterfaceProperties : IPv4InterfaceProperties
> 	{
> -		LinuxNetworkInterface iface;
> +		protected UnixNetworkInterface iface;
> 		
> -		public LinuxIPv4InterfaceProperties (LinuxNetworkInterface iface)
> +		public UnixIPv4InterfaceProperties (UnixNetworkInterface iface)
> 		{
> 			this.iface = iface;
> 		}
> 		
> 		public override int Index {
> -			get { return LinuxNetworkInterface.IfNameToIndex (iface.Name); }
> +			get { return UnixNetworkInterface.IfNameToIndex (iface.Name); }
> 		}
>
> 		// TODO: how to discover that?
> @@ -74,6 +74,18 @@
> 			get { return false; }
> 		}
> 	
> +		public override bool UsesWins {
> +			get { return false; }
> +		}
> +	}
> +	
> +	sealed class LinuxIPv4InterfaceProperties :  
> UnixIPv4InterfaceProperties
> +	{
> +		public LinuxIPv4InterfaceProperties (LinuxNetworkInterface iface)
> +			: base (iface)
> +		{
> +		}
> +		
> 		public override bool IsForwardingEnabled {
> 			get {
> 				string iface_path = "/proc/sys/net/ipv4/conf/" + iface.Name + "/ 
> forwarding";
> @@ -87,9 +99,10 @@
> 				return false;
> 			}
> 		}
> +
> 		public override int Mtu {
> 			get {
> -				string iface_path = iface.IfacePath + "mtu";
> +				string iface_path = (iface as LinuxNetworkInterface).IfacePath  
> + "mtu";
> 				int ret = 0;
>
> 				if (File.Exists (iface_path)) {
> @@ -105,10 +118,24 @@
> 						
> 			}
> 		}
> -	
> -		public override bool UsesWins {
> +	}
> +
> +	sealed class MacOsIPv4InterfaceProperties :  
> UnixIPv4InterfaceProperties
> +	{
> +		public MacOsIPv4InterfaceProperties (MacOsNetworkInterface iface)
> +			: base (iface)
> +		{
> +		}
> +
> +		// dummy
> +		public override bool IsForwardingEnabled {
> 			get { return false; }
> 		}
> +
> +		// dummy
> +		public override int Mtu {
> +			get { return 0; }
> +		}
> 	}
> 	
> 	sealed class Win32IPv4InterfaceProperties : IPv4InterfaceProperties
> Index: System.Net.NetworkInformation/IPInterfaceProperties.cs
> ===================================================================
> --- System.Net.NetworkInformation/IPInterfaceProperties.cs	(revision  
> 133967)
> +++ System.Net.NetworkInformation/IPInterfaceProperties.cs	(working  
> copy)
> @@ -53,35 +53,26 @@
> 		public abstract IPAddressCollection WinsServersAddresses { get; }
> 	}
>
> -	class LinuxIPInterfaceProperties : IPInterfaceProperties
> +	abstract class UnixIPInterfaceProperties : IPInterfaceProperties
> 	{
> -		IPv4InterfaceProperties ipv4iface_properties;
> -		LinuxNetworkInterface iface;
> +		protected IPv4InterfaceProperties ipv4iface_properties;
> +		protected UnixNetworkInterface iface;
> 		List <IPAddress> addresses;
> 		IPAddressCollection dns_servers;
> 		string dns_suffix;
> 		DateTime last_parse;
> 		
> -		public LinuxIPInterfaceProperties (LinuxNetworkInterface iface,  
> List <IPAddress> addresses)
> +		public UnixIPInterfaceProperties (UnixNetworkInterface iface,  
> List <IPAddress> addresses)
> 		{
> 			this.iface = iface;
> 			this.addresses = addresses;
> 		}
>
> -		public override IPv4InterfaceProperties GetIPv4Properties ()
> -		{
> -			if (ipv4iface_properties == null)
> -				ipv4iface_properties = new LinuxIPv4InterfaceProperties (iface);
> -			
> -			return ipv4iface_properties;
> -		}
> -
> 		public override IPv6InterfaceProperties GetIPv6Properties ()
> 		{
> 			throw new NotImplementedException ();
> 		}
>
> -
> 		static Regex ns = new Regex (@"\s*nameserver\s+(?<address>.*)");
> 		static Regex search = new Regex (@"\s*search\s+(?<domain>.*)");
> 		void ParseResolvConf ()
> @@ -234,6 +225,38 @@
> 		}
> 	}
>
> +	class LinuxIPInterfaceProperties : UnixIPInterfaceProperties
> +	{
> +		public LinuxIPInterfaceProperties (LinuxNetworkInterface iface,  
> List <IPAddress> addresses)
> +			: base (iface, addresses)
> +		{
> +		}
> +
> +		public override IPv4InterfaceProperties GetIPv4Properties ()
> +		{
> +			if (ipv4iface_properties == null)
> +				ipv4iface_properties = new LinuxIPv4InterfaceProperties (iface  
> as LinuxNetworkInterface);
> +			
> +			return ipv4iface_properties;
> +		}
> +	}
> +
> +	class MacOsIPInterfaceProperties : UnixIPInterfaceProperties
> +	{
> +		public MacOsIPInterfaceProperties (MacOsNetworkInterface iface,  
> List <IPAddress> addresses)
> +			: base (iface, addresses)
> +		{
> +		}
> +
> +		public override IPv4InterfaceProperties GetIPv4Properties ()
> +		{
> +			if (ipv4iface_properties == null)
> +				ipv4iface_properties = new MacOsIPv4InterfaceProperties (iface  
> as MacOsNetworkInterface);
> +			
> +			return ipv4iface_properties;
> +		}
> +	}
> +
> 	class Win32IPInterfaceProperties2 : IPInterfaceProperties
> 	{
> 		readonly Win32_IP_ADAPTER_ADDRESSES addr;
> Index: System.Net.NetworkInformation/NetworkInterface.cs
> ===================================================================
> --- System.Net.NetworkInformation/NetworkInterface.cs	(revision  
> 133967)
> +++ System.Net.NetworkInformation/NetworkInterface.cs	(working copy)
> @@ -42,6 +42,9 @@
>
> namespace System.Net.NetworkInformation {
> 	public abstract class NetworkInterface {
> +		[DllImport ("libc")]
> +		static extern int uname (IntPtr buf);
> +
> 		static Version windowsVer51 = new Version (5, 1);
> 		static internal readonly bool runningOnUnix =  
> (Environment.OSVersion.Platform == PlatformID.Unix);
> 		
> @@ -53,8 +56,20 @@
> 		public static NetworkInterface [] GetAllNetworkInterfaces ()
> 		{
> 			if (runningOnUnix) {
> +				bool darwin = false;
> +				IntPtr buf = Marshal.AllocHGlobal (8192);
> +				if (uname (buf) == 0) {
> +					string os = Marshal.PtrToStringAnsi (buf);
> +					if (os == "Darwin")
> +						darwin = true;
> +				}
> +				Marshal.FreeHGlobal (buf);
> +
> 				try {
> -					return LinuxNetworkInterface.ImplGetAllNetworkInterfaces ();
> +					if (darwin)
> +						return MacOsNetworkInterface.ImplGetAllNetworkInterfaces ();
> +					else
> +						return LinuxNetworkInterface.ImplGetAllNetworkInterfaces ();
> 				} catch (SystemException ex) {
> 					throw ex;
> 				} catch {
> @@ -87,7 +102,7 @@
> 			get {
> 				if (runningOnUnix) {
> 					try {
> -						return LinuxNetworkInterface.IfNameToIndex ("lo");
> +						return UnixNetworkInterface.IfNameToIndex ("lo");
> 					} catch  {
> 						return 0;
> 					}
> @@ -111,17 +126,103 @@
> 		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 : NetworkInterface
> +	class LinuxNetworkInterface : UnixNetworkInterface
> 	{
> -		[DllImport("libc")]
> -		static extern int if_nametoindex(string ifname);
> -
> 		[DllImport ("libc")]
> 		static extern int getifaddrs (out IntPtr ifap);
>
> @@ -132,13 +233,6 @@
> 		const int AF_INET6  = 10;
> 		const int AF_PACKET = 17;
> 		
> -		IPv4InterfaceStatistics ipv4stats;
> -		IPInterfaceProperties ipproperties;
> -		
> -		string               name;
> -		int                  index;
> -		List <IPAddress>     addresses;
> -		byte[]               macAddress;
> 		NetworkInterfaceType type;
> 		string               iface_path;
> 		string               iface_operstate_path;
> @@ -148,11 +242,6 @@
> 			get { return iface_path; }
> 		}
> 		
> -		public static int IfNameToIndex (string ifname)
> -		{
> -			return if_nametoindex(ifname);
> -		}
> -		
> 		public static NetworkInterface [] ImplGetAllNetworkInterfaces ()
> 		{
> 			var interfaces = new Dictionary <string, LinuxNetworkInterface> ();
> @@ -246,8 +335,14 @@
> 					if (!address.Equals (IPAddress.None))
> 						iface.AddAddress (address);
>
> -					if (macAddress != null || type == NetworkInterfaceType.Loopback)
> +					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;
> 				}
> @@ -265,31 +360,13 @@
> 		}
> 		
> 		LinuxNetworkInterface (string name)
> +			: base (name)
> 		{
> -			this.name = name;
> -			addresses = new List<IPAddress> ();
> 			iface_path = "/sys/class/net/" + name + "/";
> 			iface_operstate_path = iface_path + "operstate";
> 			iface_flags_path = iface_path + "flags";
> 		}
>
> -		internal void AddAddress (IPAddress address)
> -		{
> -			addresses.Add (address);
> -		}
> -
> -		internal void SetLinkLayerInfo (int index, byte[] macAddress,  
> NetworkInterfaceType type)
> -		{
> -			this.index = index;
> -			this.macAddress = macAddress;
> -			if (type == NetworkInterfaceType.Ethernet) {
> -				if (Directory.Exists(iface_path + "wireless")) {
> -					type = NetworkInterfaceType.Wireless80211;
> -				}
> -			}
> -			this.type = type;
> -		}
> -
> 		public override IPInterfaceProperties GetIPProperties ()
> 		{
> 			if (ipproperties == null)
> @@ -301,53 +378,9 @@
> 		{
> 			if (ipv4stats == null)
> 				ipv4stats = new LinuxIPv4InterfaceStatistics (this);
> -			
> 			return ipv4stats;
> 		}
>
> -		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; }
> -		}
> -		
> 		public override OperationalStatus OperationalStatus {
> 			get {
> 				if (!Directory.Exists (iface_path))
> @@ -384,14 +417,6 @@
> 			}
> 		}
>
> -		[MonoTODO ("Parse dmesg?")]
> -		public override long Speed {
> -			get {
> -				// Bits/s
> -				return 1000000;
> -			}
> -		}
> -		
> 		public override bool SupportsMulticast {
> 			get {
> 				if (!Directory.Exists (iface_path))
> @@ -413,6 +438,143 @@
> 		}
> 	}
>
> +	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 =  
> (MacOsStructs.sockaddr_dl) Marshal.PtrToStructure (addr.ifa_addr,  
> typeof (MacOsStructs.sockaddr_dl));
> +
> +							macAddress = new byte [(int) sockaddrdl.sdl_alen];
> +							Array.Copy (sockaddrdl.sdl_data, sockaddrdl.sdl_nlen,  
> macAddress, 0, macAddress.Length);
> +							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)]
> _______________________________________________
> Mono-osx mailing list
> Mono-osx at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-osx



More information about the Mono-devel-list mailing list