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