X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem%2FSystem.Net.NetworkInformation%2FIPv4InterfaceProperties.cs;h=21356e88c3f67e0a8a8fadd3bc20dd4e37f389dc;hb=0717f141b92db56481cc09af70c026d7ffad8921;hp=b3d3817e951bc0c68f57b6e16a443545162ad9e6;hpb=1c14f1ee6d701510c15499d71fc2b324151a8629;p=mono.git diff --git a/mcs/class/System/System.Net.NetworkInformation/IPv4InterfaceProperties.cs b/mcs/class/System/System.Net.NetworkInformation/IPv4InterfaceProperties.cs index b3d3817e951..21356e88c3f 100644 --- a/mcs/class/System/System.Net.NetworkInformation/IPv4InterfaceProperties.cs +++ b/mcs/class/System/System.Net.NetworkInformation/IPv4InterfaceProperties.cs @@ -1,10 +1,12 @@ // // System.Net.NetworkInformation.IPv4InterfaceProperties // -// Author: +// Authors: // Gonzalo Paniagua Javier (gonzalo@novell.com) +// Atsushi Enomoto (atsushi@ximian.com) +// Marek Habersack (mhabersack@novell.com) // -// Copyright (c) 2006 Novell, Inc. (http://www.novell.com) +// Copyright (c) 2006-2007 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 @@ -26,6 +28,9 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if NET_2_0 +using System.IO; +using System.Runtime.InteropServices; + namespace System.Net.NetworkInformation { public abstract class IPv4InterfaceProperties { protected IPv4InterfaceProperties () @@ -40,6 +45,160 @@ namespace System.Net.NetworkInformation { public abstract int Mtu { get; } public abstract bool UsesWins { get; } } + + abstract class UnixIPv4InterfaceProperties : IPv4InterfaceProperties + { + protected UnixNetworkInterface iface; + + public UnixIPv4InterfaceProperties (UnixNetworkInterface iface) + { + this.iface = iface; + } + + public override int Index { + get { return UnixNetworkInterface.IfNameToIndex (iface.Name); } + } + + // TODO: how to discover that? + public override bool IsAutomaticPrivateAddressingActive { + get { return false; } + } + + // TODO: how to discover that? + public override bool IsAutomaticPrivateAddressingEnabled { + get { return false; } + } + + // TODO: how to discover that? The only way is distribution-specific... + public override bool IsDhcpEnabled { + 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"; + + if (File.Exists (iface_path)) { + string val = NetworkInterface.ReadLine (iface_path); + + return val != "0"; + } + + return false; + } + } + + public override int Mtu { + get { + string iface_path = (iface as LinuxNetworkInterface).IfacePath + "mtu"; + int ret = 0; + + if (File.Exists (iface_path)) { + string val = NetworkInterface.ReadLine (iface_path); + + try { + ret = Int32.Parse (val); + } catch { + } + } + + return ret; + + } + } + } + + 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 + { + [DllImport ("iphlpapi.dll")] + static extern int GetPerAdapterInfo (int IfIndex, Win32_IP_PER_ADAPTER_INFO pPerAdapterInfo, ref int pOutBufLen); + + Win32_IP_ADAPTER_INFO ainfo; + Win32_IP_PER_ADAPTER_INFO painfo; + Win32_MIB_IFROW mib; + + public Win32IPv4InterfaceProperties (Win32_IP_ADAPTER_INFO ainfo, Win32_MIB_IFROW mib) + { + this.ainfo = ainfo; + this.mib = mib; + + // get per-adapter info. + int size = 0; + GetPerAdapterInfo (mib.Index, null, ref size); + painfo = new Win32_IP_PER_ADAPTER_INFO (); + int ret = GetPerAdapterInfo (mib.Index, painfo, ref size); + if (ret != 0) + throw new NetworkInformationException (ret); + } + + public override int Index { + get { return mib.Index; } + } + + public override bool IsAutomaticPrivateAddressingActive { + get { return painfo.AutoconfigActive != 0; } + } + + public override bool IsAutomaticPrivateAddressingEnabled { + get { return painfo.AutoconfigEnabled != 0; } + } + + public override bool IsDhcpEnabled { + get { return ainfo.DhcpEnabled != 0; } + } + + public override bool IsForwardingEnabled { + // Is it the right answer? In Vista there is MIB_IPINTERFACEROW.ForwardingEnabled, but not in former versions. + get { return Win32_FIXED_INFO.Instance.EnableRouting != 0; } + } + + public override int Mtu { + get { return mib.Mtu; } + } + + public override bool UsesWins { + get { return ainfo.HaveWins; } + } + } + + [StructLayout (LayoutKind.Sequential)] + class Win32_IP_PER_ADAPTER_INFO + { + public uint AutoconfigEnabled; + public uint AutoconfigActive; + public IntPtr CurrentDnsServer; // to Win32_IP_ADDR_STRING + public Win32_IP_ADDR_STRING DnsServerList; + } } #endif