1 // 2 // System.Net.NetworkInformation.IPv4InterfaceProperties 3 // 4 // Authors: 5 // Gonzalo Paniagua Javier (gonzalo@novell.com) 6 // Atsushi Enomoto (atsushi@ximian.com) 7 // Marek Habersack (mhabersack@novell.com) 8 // 9 // Copyright (c) 2006-2007 Novell, Inc. (http://www.novell.com) 10 // 11 // Permission is hereby granted, free of charge, to any person obtaining 12 // a copy of this software and associated documentation files (the 13 // "Software"), to deal in the Software without restriction, including 14 // without limitation the rights to use, copy, modify, merge, publish, 15 // distribute, sublicense, and/or sell copies of the Software, and to 16 // permit persons to whom the Software is furnished to do so, subject to 17 // the following conditions: 18 // 19 // The above copyright notice and this permission notice shall be 20 // included in all copies or substantial portions of the Software. 21 // 22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 29 // 30 using System.IO; 31 using System.Runtime.InteropServices; 32 33 namespace System.Net.NetworkInformation { 34 abstract class UnixIPv4InterfaceProperties : IPv4InterfaceProperties 35 { 36 protected UnixNetworkInterface iface; 37 UnixIPv4InterfaceProperties(UnixNetworkInterface iface)38 public UnixIPv4InterfaceProperties (UnixNetworkInterface iface) 39 { 40 this.iface = iface; 41 } 42 43 public override int Index { 44 get { return iface.NameIndex; } 45 } 46 47 // TODO: how to discover that? 48 public override bool IsAutomaticPrivateAddressingActive { 49 get { return false; } 50 } 51 52 // TODO: how to discover that? 53 public override bool IsAutomaticPrivateAddressingEnabled { 54 get { return false; } 55 } 56 57 // TODO: how to discover that? The only way is distribution-specific... 58 public override bool IsDhcpEnabled { 59 get { return false; } 60 } 61 62 public override bool UsesWins { 63 get { return false; } 64 } 65 } 66 67 sealed class LinuxIPv4InterfaceProperties : UnixIPv4InterfaceProperties 68 { LinuxIPv4InterfaceProperties(LinuxNetworkInterface iface)69 public LinuxIPv4InterfaceProperties (LinuxNetworkInterface iface) 70 : base (iface) 71 { 72 } 73 74 public override bool IsForwardingEnabled { 75 get { 76 string iface_path = "/proc/sys/net/ipv4/conf/" + iface.Name + "/forwarding"; 77 78 if (File.Exists (iface_path)) { 79 string val = LinuxNetworkInterface.ReadLine (iface_path); 80 81 return val != "0"; 82 } 83 84 return false; 85 } 86 } 87 88 public override int Mtu { 89 get { 90 string iface_path = (iface as LinuxNetworkInterface).IfacePath + "mtu"; 91 int ret = 0; 92 93 if (File.Exists (iface_path)) { 94 string val = LinuxNetworkInterface.ReadLine (iface_path); 95 96 try { 97 ret = Int32.Parse (val); 98 } catch { 99 } 100 } 101 102 return ret; 103 104 } 105 } 106 } 107 108 sealed class MacOsIPv4InterfaceProperties : UnixIPv4InterfaceProperties 109 { MacOsIPv4InterfaceProperties(MacOsNetworkInterface iface)110 public MacOsIPv4InterfaceProperties (MacOsNetworkInterface iface) 111 : base (iface) 112 { 113 } 114 115 // dummy 116 public override bool IsForwardingEnabled { 117 get { return false; } 118 } 119 120 // dummy 121 public override int Mtu { 122 get { return 0; } 123 } 124 } 125 126 #if WIN_PLATFORM 127 sealed class Win32IPv4InterfaceProperties : IPv4InterfaceProperties 128 { 129 [DllImport ("iphlpapi.dll")] GetPerAdapterInfo(int IfIndex, Win32_IP_PER_ADAPTER_INFO pPerAdapterInfo, ref int pOutBufLen)130 static extern int GetPerAdapterInfo (int IfIndex, Win32_IP_PER_ADAPTER_INFO pPerAdapterInfo, ref int pOutBufLen); 131 132 Win32_IP_ADAPTER_INFO ainfo; 133 Win32_IP_PER_ADAPTER_INFO painfo; 134 Win32_MIB_IFROW mib; 135 Win32IPv4InterfaceProperties(Win32_IP_ADAPTER_INFO ainfo, Win32_MIB_IFROW mib)136 public Win32IPv4InterfaceProperties (Win32_IP_ADAPTER_INFO ainfo, Win32_MIB_IFROW mib) 137 { 138 this.ainfo = ainfo; 139 this.mib = mib; 140 141 // get per-adapter info. 142 int size = 0; 143 GetPerAdapterInfo (mib.Index, null, ref size); 144 painfo = new Win32_IP_PER_ADAPTER_INFO (); 145 int ret = GetPerAdapterInfo (mib.Index, painfo, ref size); 146 if (ret != 0) 147 throw new NetworkInformationException (ret); 148 } 149 150 public override int Index { 151 get { return mib.Index; } 152 } 153 154 public override bool IsAutomaticPrivateAddressingActive { 155 get { return painfo.AutoconfigActive != 0; } 156 } 157 158 public override bool IsAutomaticPrivateAddressingEnabled { 159 get { return painfo.AutoconfigEnabled != 0; } 160 } 161 162 public override bool IsDhcpEnabled { 163 get { return ainfo.DhcpEnabled != 0; } 164 } 165 166 public override bool IsForwardingEnabled { 167 // Is it the right answer? In Vista there is MIB_IPINTERFACEROW.ForwardingEnabled, but not in former versions. 168 get { return Win32NetworkInterface.FixedInfo.EnableRouting != 0; } 169 } 170 171 public override int Mtu { 172 get { return mib.Mtu; } 173 } 174 175 public override bool UsesWins { 176 get { return ainfo.HaveWins; } 177 } 178 } 179 180 [StructLayout (LayoutKind.Sequential)] 181 class Win32_IP_PER_ADAPTER_INFO 182 { 183 public uint AutoconfigEnabled; 184 public uint AutoconfigActive; 185 public IntPtr CurrentDnsServer; // to Win32_IP_ADDR_STRING 186 public Win32_IP_ADDR_STRING DnsServerList; 187 } 188 #endif 189 } 190 191