1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using System.Net.Sockets;
6 
7 namespace System.Net.NetworkInformation
8 {
9     internal enum IcmpV6StatType
10     {
11         DestinationUnreachable = 1,
12         PacketTooBig = 2,
13         TimeExceeded = 3,
14         ParameterProblem = 4,
15         EchoRequest = 128,
16         EchoReply = 129,
17         MembershipQuery = 130,
18         MembershipReport = 131,
19         MembershipReduction = 132,
20         RouterSolicit = 133,
21         RouterAdvertisement = 134,
22         NeighborSolict = 135,
23         NeighborAdvertisement = 136,
24         Redirect = 137,
25     }
26 
27     // ICMP statistics for Ipv6.
28     internal class SystemIcmpV6Statistics : IcmpV6Statistics
29     {
30         private readonly Interop.IpHlpApi.MibIcmpInfoEx _stats;
31 
SystemIcmpV6Statistics()32         internal SystemIcmpV6Statistics()
33         {
34             uint result = Interop.IpHlpApi.GetIcmpStatisticsEx(out _stats, AddressFamily.InterNetworkV6);
35 
36             if (result != Interop.IpHlpApi.ERROR_SUCCESS)
37             {
38                 throw new NetworkInformationException((int)result);
39             }
40         }
41 
42         public override long MessagesSent { get { return (long)_stats.outStats.dwMsgs; } }
43 
44         public override long MessagesReceived { get { return (long)_stats.inStats.dwMsgs; } }
45 
46         public override long ErrorsSent { get { return (long)_stats.outStats.dwErrors; } }
47 
48         public override long ErrorsReceived { get { return (long)_stats.inStats.dwErrors; } }
49 
50         public override long DestinationUnreachableMessagesSent
51         {
52             get
53             {
54                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.DestinationUnreachable];
55             }
56         }
57 
58         public override long DestinationUnreachableMessagesReceived
59         {
60             get
61             {
62                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.DestinationUnreachable];
63             }
64         }
65 
66         public override long PacketTooBigMessagesSent
67         {
68             get
69             {
70                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.PacketTooBig];
71             }
72         }
73 
74         public override long PacketTooBigMessagesReceived
75         {
76             get
77             {
78                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.PacketTooBig];
79             }
80         }
81 
82         public override long TimeExceededMessagesSent
83         {
84             get
85             {
86                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.TimeExceeded];
87             }
88         }
89 
90         public override long TimeExceededMessagesReceived
91         {
92             get
93             {
94                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.TimeExceeded];
95             }
96         }
97 
98         public override long ParameterProblemsSent
99         {
100             get
101             {
102                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.ParameterProblem];
103             }
104         }
105 
106         public override long ParameterProblemsReceived
107         {
108             get
109             {
110                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.ParameterProblem];
111             }
112         }
113 
114         public override long EchoRequestsSent
115         {
116             get
117             {
118                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.EchoRequest];
119             }
120         }
121 
122         public override long EchoRequestsReceived
123         {
124             get
125             {
126                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.EchoRequest];
127             }
128         }
129 
130         public override long EchoRepliesSent
131         {
132             get
133             {
134                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.EchoReply];
135             }
136         }
137 
138         public override long EchoRepliesReceived
139         {
140             get
141             {
142                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.EchoReply];
143             }
144         }
145 
146         public override long MembershipQueriesSent
147         {
148             get
149             {
150                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.MembershipQuery];
151             }
152         }
153 
154         public override long MembershipQueriesReceived
155         {
156             get
157             {
158                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.MembershipQuery];
159             }
160         }
161 
162         public override long MembershipReportsSent
163         {
164             get
165             {
166                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.MembershipReport];
167             }
168         }
169 
170         public override long MembershipReportsReceived
171         {
172             get
173             {
174                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.MembershipReport];
175             }
176         }
177 
178         public override long MembershipReductionsSent
179         {
180             get
181             {
182                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.MembershipReduction];
183             }
184         }
185 
186         public override long MembershipReductionsReceived
187         {
188             get
189             {
190                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.MembershipReduction];
191             }
192         }
193 
194         public override long RouterAdvertisementsSent
195         {
196             get
197             {
198                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.RouterAdvertisement];
199             }
200         }
201 
202         public override long RouterAdvertisementsReceived
203         {
204             get
205             {
206                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.RouterAdvertisement];
207             }
208         }
209 
210         public override long RouterSolicitsSent
211         {
212             get
213             {
214                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.RouterSolicit];
215             }
216         }
217 
218         public override long RouterSolicitsReceived
219         {
220             get
221             {
222                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.RouterSolicit];
223             }
224         }
225 
226         public override long NeighborAdvertisementsSent
227         {
228             get
229             {
230                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.NeighborAdvertisement];
231             }
232         }
233 
234         public override long NeighborAdvertisementsReceived
235         {
236             get
237             {
238                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.NeighborAdvertisement];
239             }
240         }
241 
242         public override long NeighborSolicitsSent
243         {
244             get
245             {
246                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.NeighborSolict];
247             }
248         }
249 
250         public override long NeighborSolicitsReceived
251         {
252             get
253             {
254                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.NeighborSolict];
255             }
256         }
257 
258         public override long RedirectsSent
259         {
260             get
261             {
262                 return _stats.outStats.rgdwTypeCount[(long)IcmpV6StatType.Redirect];
263             }
264         }
265 
266         public override long RedirectsReceived
267         {
268             get
269             {
270                 return _stats.inStats.rgdwTypeCount[(long)IcmpV6StatType.Redirect];
271             }
272         }
273     }
274 }
275