Merge pull request #1504 from madrang/SafeHandle.SetInvalidRelease
[mono.git] / mcs / class / System / System.Net.NetworkInformation / IPv4InterfaceStatistics.cs
1 //
2 // System.Net.NetworkInformation.IPv4InterfaceStatistics
3 //
4 // Authors:
5 //      Gonzalo Paniagua Javier (gonzalo@novell.com)
6 //      Atsushi Enomoto (atsushi@ximian.com)
7 //      Miguel de Icaza (miguel@ximian.com)
8 //
9 // Copyright (c) 2006-2008 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 namespace System.Net.NetworkInformation {
31         public abstract class IPv4InterfaceStatistics {
32                 protected IPv4InterfaceStatistics ()
33                 {
34                 }
35                 
36                 public abstract long BytesReceived { get; }
37                 public abstract long BytesSent { get; }
38                 public abstract long IncomingPacketsDiscarded { get; }
39                 public abstract long IncomingPacketsWithErrors { get; }
40                 public abstract long IncomingUnknownProtocolPackets { get; }
41                 public abstract long NonUnicastPacketsReceived { get; }
42                 public abstract long NonUnicastPacketsSent { get; }
43                 public abstract long OutgoingPacketsDiscarded { get; }
44                 public abstract long OutgoingPacketsWithErrors { get; }
45
46                 [MonoTODO("Not implemented for Linux")]
47                 public abstract long OutputQueueLength { get; }
48                 public abstract long UnicastPacketsReceived { get; }
49                 public abstract long UnicastPacketsSent { get; }
50         }
51
52         class Win32IPv4InterfaceStatistics : IPv4InterfaceStatistics
53         {
54                 Win32_MIB_IFROW info;
55
56                 public Win32IPv4InterfaceStatistics (Win32_MIB_IFROW info)
57                 {
58                         this.info = info;
59                 }
60
61                 public override long BytesReceived {
62                         get { return info.InOctets; }
63                 }
64
65                 public override long BytesSent {
66                         get { return info.OutOctets; }
67                 }
68
69                 public override long IncomingPacketsDiscarded {
70                         get { return info.InDiscards; }
71                 }
72
73                 public override long IncomingPacketsWithErrors {
74                         get { return info.InErrors; }
75                 }
76
77                 public override long IncomingUnknownProtocolPackets {
78                         get { return info.InUnknownProtos; }
79                 }
80
81                 public override long NonUnicastPacketsReceived {
82                         get { return info.InNUcastPkts; }
83                 }
84
85                 public override long NonUnicastPacketsSent {
86                         get { return info.OutNUcastPkts; }
87                 }
88
89                 public override long OutgoingPacketsDiscarded {
90                         get { return info.OutDiscards; }
91                 }
92
93                 public override long OutgoingPacketsWithErrors {
94                         get { return info.OutErrors; }
95                 }
96
97                 public override long OutputQueueLength {
98                         get { return info.OutQLen; }
99                 }
100
101                 public override long UnicastPacketsReceived {
102                         get { return info.InUcastPkts; }
103                 }
104
105                 public override long UnicastPacketsSent {
106                         get { return info.OutUcastPkts; }
107                 }
108         
109         }
110
111         class LinuxIPv4InterfaceStatistics : IPv4InterfaceStatistics
112         {
113                 LinuxNetworkInterface linux;
114                 
115                 public LinuxIPv4InterfaceStatistics (LinuxNetworkInterface parent)
116                 {
117                         linux = parent;
118                 }
119
120                 long Read (string file)
121                 {
122                         try {
123                                 return long.Parse (LinuxNetworkInterface.ReadLine (linux.IfacePath + file));
124                         } catch {
125                                 return 0;
126                         }
127                 }
128                 
129                 public override long BytesReceived {
130                         get {
131                                 return Read ("statistics/rx_bytes");
132                         }
133                 }
134
135                 public override long BytesSent {
136                         get {
137                                 return Read ("statistics/tx_bytes");
138                         }
139                 }
140
141                 public override long IncomingPacketsDiscarded {
142                         get {
143                                 return Read ("statistics/rx_dropped");
144                         }
145                 }
146
147                 public override long IncomingPacketsWithErrors {
148                         get {
149                                 return Read ("statistics/rx_errors");
150                         }
151                 }
152
153                 public override long IncomingUnknownProtocolPackets {
154                         get {
155                                 // TODO
156                                 return 0;
157                         }
158                 }
159
160                 public override long NonUnicastPacketsReceived {
161                         get {
162                                 // We cant distinguish these
163                                 return Read ("statistics/multicast");
164                         }
165                 }
166
167                 public override long NonUnicastPacketsSent {
168                         get {
169                                 // We cant distinguish these
170                                 return Read ("statistics/multicast");
171                         }
172                 }
173
174                 public override long OutgoingPacketsDiscarded {
175                         get {
176                                 return Read ("statistics/tx_dropped");
177                         }
178                 }
179
180                 public override long OutgoingPacketsWithErrors {
181                         get {
182                                 return Read ("statistics/tx_errors");
183                         }
184                 }
185
186                 public override long OutputQueueLength {
187                         get {
188                                 return 1024;
189                         }
190                 }
191
192                 public override long UnicastPacketsReceived {
193                         get {
194                                 return Read ("statistics/rx_packets");
195                         }
196                 }
197
198                 public override long UnicastPacketsSent {
199                         get {
200                                 return Read ("statistics/tx_packets");
201                         }
202                 }
203         }
204
205         // dummy class
206         class MacOsIPv4InterfaceStatistics : IPv4InterfaceStatistics
207         {
208                 //MacOsNetworkInterface macos;
209                 
210                 public MacOsIPv4InterfaceStatistics (MacOsNetworkInterface parent)
211                 {
212                         //macos = parent;
213                 }
214
215                 public override long BytesReceived {
216                         get { return 0; }
217                 }
218
219                 public override long BytesSent {
220                         get { return 0; }
221                 }
222
223                 public override long IncomingPacketsDiscarded {
224                         get { return 0; }
225                 }
226
227                 public override long IncomingPacketsWithErrors {
228                         get { return 0; }
229                 }
230
231                 public override long IncomingUnknownProtocolPackets {
232                         get { return 0; }
233                 }
234
235                 public override long NonUnicastPacketsReceived {
236                         get { return 0; }
237                 }
238
239                 public override long NonUnicastPacketsSent {
240                         get { return 0; }
241                 }
242
243                 public override long OutgoingPacketsDiscarded {
244                         get { return 0; }
245                 }
246
247                 public override long OutgoingPacketsWithErrors {
248                         get { return 0; }
249                 }
250
251                 public override long OutputQueueLength {
252                         get { return 0; }
253                 }
254
255                 public override long UnicastPacketsReceived {
256                         get { return 0; }
257                 }
258
259                 public override long UnicastPacketsSent {
260                         get { return 0; }
261                 }
262         }
263         
264 }
265