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