blob: 2a84b98a3cf502b8435e014c7084622299f615d8 [file] [log] [blame]
Thieu Le3426c8f2012-01-11 17:35:11 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Thieu Le48e6d6d2011-12-06 00:40:27 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Wade Guthrie60a37062013-04-02 11:39:09 -07005#ifndef SHILL_METRICS_H_
6#define SHILL_METRICS_H_
Thieu Le48e6d6d2011-12-06 00:40:27 +00007
8#include <list>
Alex Vakulenko8a532292014-06-16 17:18:44 -07009#include <map>
10#include <string>
Thieu Le48e6d6d2011-12-06 00:40:27 +000011
Thieu Le48e6d6d2011-12-06 00:40:27 +000012#include <base/memory/scoped_vector.h>
13#include <metrics/metrics_library.h>
14#include <metrics/timer.h>
15
Thieu Le6c1e3bb2013-02-06 15:20:35 -080016#include "shill/event_dispatcher.h"
Wade Guthried4977f22012-08-22 12:37:54 -070017#include "shill/ieee80211.h"
Thieu Le85e050b2012-03-13 15:04:38 -070018#include "shill/portal_detector.h"
Thieu Leb84ba342012-03-02 15:15:19 -080019#include "shill/power_manager.h"
Thieu Le48e6d6d2011-12-06 00:40:27 +000020#include "shill/refptr_types.h"
21#include "shill/service.h"
22
23namespace shill {
24
Gaurav Shah6d2c72d2012-10-16 16:30:44 -070025class WiFiMainTest;
Thieu Le48e6d6d2011-12-06 00:40:27 +000026class WiFiService;
27
28class Metrics {
29 public:
30 enum WiFiChannel {
31 kWiFiChannelUndef = 0,
32 kWiFiChannel2412 = 1,
33 kWiFiChannel2417 = 2,
34 kWiFiChannel2422 = 3,
35 kWiFiChannel2427 = 4,
36 kWiFiChannel2432 = 5,
37 kWiFiChannel2437 = 6,
38 kWiFiChannel2442 = 7,
39 kWiFiChannel2447 = 8,
40 kWiFiChannel2452 = 9,
41 kWiFiChannel2457 = 10,
42 kWiFiChannel2462 = 11,
43 kWiFiChannel2467 = 12,
44 kWiFiChannel2472 = 13,
45 kWiFiChannel2484 = 14,
46
47 kWiFiChannel5180 = 15,
48 kWiFiChannel5200 = 16,
49 kWiFiChannel5220 = 17,
50 kWiFiChannel5240 = 18,
51 kWiFiChannel5260 = 19,
52 kWiFiChannel5280 = 20,
53 kWiFiChannel5300 = 21,
54 kWiFiChannel5320 = 22,
55
56 kWiFiChannel5500 = 23,
57 kWiFiChannel5520 = 24,
58 kWiFiChannel5540 = 25,
59 kWiFiChannel5560 = 26,
60 kWiFiChannel5580 = 27,
61 kWiFiChannel5600 = 28,
62 kWiFiChannel5620 = 29,
63 kWiFiChannel5640 = 30,
64 kWiFiChannel5660 = 31,
65 kWiFiChannel5680 = 32,
66 kWiFiChannel5700 = 33,
67
68 kWiFiChannel5745 = 34,
69 kWiFiChannel5765 = 35,
70 kWiFiChannel5785 = 36,
71 kWiFiChannel5805 = 37,
72 kWiFiChannel5825 = 38,
73
74 kWiFiChannel5170 = 39,
75 kWiFiChannel5190 = 40,
76 kWiFiChannel5210 = 41,
77 kWiFiChannel5230 = 42,
78
79 /* NB: ignore old 11b bands 2312..2372 and 2512..2532 */
80 /* NB: ignore regulated bands 4920..4980 and 5020..5160 */
81 kWiFiChannelMax
82 };
83
Thieu Lead1ec2c2012-01-05 23:39:48 +000084 enum WiFiNetworkPhyMode {
85 kWiFiNetworkPhyModeUndef = 0, // Unknown/undefined
86 kWiFiNetworkPhyMode11a = 1, // 802.11a
87 kWiFiNetworkPhyMode11b = 2, // 802.11b
88 kWiFiNetworkPhyMode11g = 3, // 802.11g
89 kWiFiNetworkPhyMode11n = 4, // 802.11n
90 kWiFiNetworkPhyModeHalf = 5, // PSB Half-width
91 kWiFiNetworkPhyModeQuarter = 6, // PSB Quarter-width
92 kWiFiNetworkPhyModeTurbo = 7, // Atheros Turbo mode
93
94 kWiFiNetworkPhyModeMax
95 };
96
Paul Stewart21f40962013-03-01 14:27:28 -080097 enum EapOuterProtocol {
98 kEapOuterProtocolUnknown = 0,
99 kEapOuterProtocolLeap = 1,
100 kEapOuterProtocolPeap = 2,
101 kEapOuterProtocolTls = 3,
102 kEapOuterProtocolTtls = 4,
103
104 kEapOuterProtocolMax
105 };
106
107 enum EapInnerProtocol {
108 kEapInnerProtocolUnknown = 0,
109 kEapInnerProtocolNone = 1,
110 kEapInnerProtocolPeapMd5 = 2,
111 kEapInnerProtocolPeapMschapv2 = 3,
112 kEapInnerProtocolTtlsEapMd5 = 4,
113 kEapInnerProtocolTtlsEapMschapv2 = 5,
114 kEapInnerProtocolTtlsMschapv2 = 6,
115 kEapInnerProtocolTtlsMschap = 7,
116 kEapInnerProtocolTtlsPap = 8,
117 kEapInnerProtocolTtlsChap = 9,
118
119 kEapInnerProtocolMax
120 };
121
Thieu Lead1ec2c2012-01-05 23:39:48 +0000122 enum WiFiSecurity {
123 kWiFiSecurityUnknown = 0,
124 kWiFiSecurityNone = 1,
125 kWiFiSecurityWep = 2,
126 kWiFiSecurityWpa = 3,
127 kWiFiSecurityRsn = 4,
128 kWiFiSecurity8021x = 5,
129 kWiFiSecurityPsk = 6,
130
131 kWiFiSecurityMax
132 };
133
Paul Stewarte4cedde2013-07-17 08:56:44 -0700134 enum WiFiApMode {
135 kWiFiApModeUnknown = 0,
136 kWiFiApModeManaged = 1,
137 kWiFiApModeAdHoc = 2,
138
139 kWiFiApModeMax
140 };
141
Thieu Le85e050b2012-03-13 15:04:38 -0700142 enum PortalResult {
143 kPortalResultSuccess = 0,
144 kPortalResultDNSFailure = 1,
145 kPortalResultDNSTimeout = 2,
146 kPortalResultConnectionFailure = 3,
147 kPortalResultConnectionTimeout = 4,
148 kPortalResultHTTPFailure = 5,
149 kPortalResultHTTPTimeout = 6,
150 kPortalResultContentFailure = 7,
151 kPortalResultContentTimeout = 8,
152 kPortalResultUnknown = 9,
153
154 kPortalResultMax
155 };
156
Paul Stewartff845fc2012-08-07 07:28:44 -0700157 enum LinkMonitorFailure {
158 kLinkMonitorMacAddressNotFound = 0,
159 kLinkMonitorClientStartFailure = 1,
160 kLinkMonitorTransmitFailure = 2,
161 kLinkMonitorFailureThresholdReached = 3,
162
163 kLinkMonitorFailureMax
164 };
165
Wade Guthried4977f22012-08-22 12:37:54 -0700166 enum WiFiStatusType {
167 kStatusCodeTypeByAp,
168 kStatusCodeTypeByClient,
169 kStatusCodeTypeByUser,
170 kStatusCodeTypeConsideredDead,
171 kStatusCodeTypeMax
172 };
173
174 enum WiFiDisconnectByWhom {
175 kDisconnectedByAp,
176 kDisconnectedNotByAp
177 };
178
Wade Guthrieb9e0ee72013-05-31 09:23:30 -0700179 enum WiFiScanResult {
180 kScanResultProgressiveConnected,
181 kScanResultProgressiveErrorAndFullFoundNothing,
182 kScanResultProgressiveErrorButFullConnected,
183 kScanResultProgressiveAndFullFoundNothing,
184 kScanResultProgressiveAndFullConnected,
185 kScanResultFullScanFoundNothing,
186 kScanResultFullScanConnected,
187 kScanResultInternalError,
188 kScanResultMax
189 };
190
Paul Stewart85aea152013-01-22 09:31:56 -0800191 enum ServiceFixupProfileType {
192 kMetricServiceFixupDefaultProfile,
193 kMetricServiceFixupUserProfile,
194 kMetricServiceFixupMax
195 };
196
Arman Uguray6d528f12012-09-13 13:44:55 -0700197 enum TerminationActionResult {
Arman Ugurayab22c162012-10-08 19:08:38 -0700198 kTerminationActionResultSuccess,
199 kTerminationActionResultFailure,
Arman Uguray6d528f12012-09-13 13:44:55 -0700200 kTerminationActionResultMax
201 };
202
Arman Ugurayab22c162012-10-08 19:08:38 -0700203 enum TerminationActionReason {
204 kTerminationActionReasonSuspend,
205 kTerminationActionReasonTerminate
206 };
207
Prathmesh Prabhu08757aa2013-05-15 17:17:33 -0700208 enum Cellular3GPPRegistrationDelayedDrop {
209 kCellular3GPPRegistrationDelayedDropPosted = 0,
210 kCellular3GPPRegistrationDelayedDropCanceled = 1,
211 kCellular3GPPRegistrationDelayedDropMax
212 };
213
Thieu Le26fc01b2013-01-28 12:08:48 -0800214 enum CellularDropTechnology {
215 kCellularDropTechnology1Xrtt = 0,
216 kCellularDropTechnologyEdge = 1,
217 kCellularDropTechnologyEvdo = 2,
218 kCellularDropTechnologyGprs = 3,
219 kCellularDropTechnologyGsm = 4,
220 kCellularDropTechnologyHspa = 5,
221 kCellularDropTechnologyHspaPlus = 6,
222 kCellularDropTechnologyLte = 7,
223 kCellularDropTechnologyUmts = 8,
224 kCellularDropTechnologyUnknown = 9,
225 kCellularDropTechnologyMax
226 };
227
Thieu Le91fccf62013-04-22 15:23:16 -0700228 enum CellularOutOfCreditsReason {
229 kCellularOutOfCreditsReasonConnectDisconnectLoop = 0,
230 kCellularOutOfCreditsReasonTxCongested = 1,
231 kCellularOutOfCreditsReasonElongatedTimeWait = 2,
232 kCellularOutOfCreditsReasonMax
233 };
234
Thieu Le5133b712013-02-19 14:47:21 -0800235 enum CorruptedProfile {
236 kCorruptedProfile = 1,
237 kCorruptedProfileMax
238 };
239
Paul Stewart91a43cb2013-03-02 21:34:15 -0800240 enum VpnDriver {
241 kVpnDriverOpenVpn = 0,
242 kVpnDriverL2tpIpsec = 1,
243 kVpnDriverMax
244 };
245
246 enum VpnRemoteAuthenticationType {
247 kVpnRemoteAuthenticationTypeOpenVpnDefault = 0,
248 kVpnRemoteAuthenticationTypeOpenVpnCertificate = 1,
249 kVpnRemoteAuthenticationTypeL2tpIpsecDefault = 2,
250 kVpnRemoteAuthenticationTypeL2tpIpsecCertificate = 3,
251 kVpnRemoteAuthenticationTypeL2tpIpsecPsk = 4,
252 kVpnRemoteAuthenticationTypeMax
253 };
254
255 enum VpnUserAuthenticationType {
256 kVpnUserAuthenticationTypeOpenVpnNone = 0,
257 kVpnUserAuthenticationTypeOpenVpnCertificate = 1,
258 kVpnUserAuthenticationTypeOpenVpnUsernamePassword = 2,
259 kVpnUserAuthenticationTypeOpenVpnUsernamePasswordOtp = 3,
Paul Stewartb5768232014-02-27 07:21:34 -0800260 kVpnUserAuthenticationTypeOpenVpnUsernameToken = 7,
Paul Stewart91a43cb2013-03-02 21:34:15 -0800261 kVpnUserAuthenticationTypeL2tpIpsecNone = 4,
262 kVpnUserAuthenticationTypeL2tpIpsecCertificate = 5,
263 kVpnUserAuthenticationTypeL2tpIpsecUsernamePassword = 6,
264 kVpnUserAuthenticationTypeMax
265 };
266
Peter Qiue783f1c2014-05-02 11:42:33 -0700267 enum UserInitiatedEvent {
268 kUserInitiatedEventWifiScan = 0,
Peter Qiu6b56cad2014-08-06 14:11:19 -0700269 kUserInitiatedEventReserved,
Peter Qiue783f1c2014-05-02 11:42:33 -0700270 kUserInitiatedEventMax
Paul Stewartdded0072013-10-24 12:38:54 -0700271 };
272
Peter Qiudc4e0992014-05-01 10:02:52 -0700273 enum UserInitiatedConnectionResult {
274 kUserInitiatedConnectionResultSuccess = 0,
275 kUserInitiatedConnectionResultFailure = 1,
276 kUserInitiatedConnectionResultAborted = 2,
277 kUserInitiatedConnectionResultMax
278 };
279
Peter Qiub9256f32014-05-09 15:27:29 -0700280 enum DNSTestResult {
Peter Qiuf18e7712014-05-20 09:59:46 -0700281 kFallbackDNSTestResultSuccess = 0,
282 kFallbackDNSTestResultFailure,
283 kFallbackDNSTestResultMax
Peter Qiub9256f32014-05-09 15:27:29 -0700284 };
285
Peter Qiudc335f82014-05-15 10:33:17 -0700286 // Network problem detected by traffic monitor.
287 enum NetworkProblem {
288 kNetworkProblemCongestedTCPTxQueue = 0,
289 kNetworkProblemDNSFailure,
290 kNetworkProblemMax
291 };
292
Peter Qiu700de642014-07-14 16:31:30 -0700293 // Device's connection status.
294 enum ConnectionStatus {
295 kConnectionStatusOffline = 0,
296 kConnectionStatusConnected = 1,
297 kConnectionStatusOnline = 2,
298 kConnectionStatusMax
299 };
300
Peter Qiud87179e2014-07-10 18:29:22 -0700301 enum UserInitiatedConnectionFailureReason {
302 kUserInitiatedConnectionFailureReasonUnknown = 0,
303 kUserInitiatedConnectionFailureReasonBadPassphrase = 1,
304 kUserInitiatedConnectionFailureReasonBadWEPKey = 2,
305 kUserInitiatedConnectionFailureReasonConnect = 3,
306 kUserInitiatedConnectionFailureReasonDHCP = 4,
307 kUserInitiatedConnectionFailureReasonDNSLookup = 5,
308 kUserInitiatedConnectionFailureReasonEAPAuthentication = 6,
309 kUserInitiatedConnectionFailureReasonEAPLocalTLS = 7,
310 kUserInitiatedConnectionFailureReasonEAPRemoteTLS = 8,
311 kUserInitiatedConnectionFailureReasonOutOfRange = 9,
312 kUserInitiatedConnectionFailureReasonPinMissing = 10,
313 kUserInitiatedConnectionFailureReasonMax
314 };
315
Paul Stewart3bdf1ab2014-07-17 19:22:26 -0700316 enum DhcpClientStatus {
Paul Stewarta72a79c2014-07-21 13:52:03 -0700317 kDhcpClientStatusArpGateway = 0,
318 kDhcpClientStatusArpSelf = 1,
319 kDhcpClientStatusBound = 2,
320 kDhcpClientStatusDiscover = 3,
321 kDhcpClientStatusIgnoreAdditionalOffer = 4,
322 kDhcpClientStatusIgnoreFailedOffer = 5,
323 kDhcpClientStatusIgnoreInvalidOffer = 6,
324 kDhcpClientStatusIgnoreNonOffer = 7,
325 kDhcpClientStatusInform = 8,
326 kDhcpClientStatusInit = 9,
327 kDhcpClientStatusNakDefer = 10,
328 kDhcpClientStatusRebind = 11,
329 kDhcpClientStatusReboot = 12,
330 kDhcpClientStatusRelease = 13,
331 kDhcpClientStatusRenew = 14,
332 kDhcpClientStatusRequest = 15,
Paul Stewart3bdf1ab2014-07-17 19:22:26 -0700333 kDhcpClientStatusMax
334 };
335
mukesh agrawal132e96f2014-04-24 11:49:42 -0700336 static const char kMetricDisconnectSuffix[];
Thieu Le67370f62012-02-14 23:01:42 +0000337 static const int kMetricDisconnectMax;
338 static const int kMetricDisconnectMin;
339 static const int kMetricDisconnectNumBuckets;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700340 static const char kMetricSignalAtDisconnectSuffix[];
Wade Guthrie9ec08062013-09-25 15:22:24 -0700341 static const int kMetricSignalAtDisconnectMin;
342 static const int kMetricSignalAtDisconnectMax;
343 static const int kMetricSignalAtDisconnectNumBuckets;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700344 static const char kMetricNetworkApModeSuffix[];
345 static const char kMetricNetworkChannelSuffix[];
Thieu Le48e6d6d2011-12-06 00:40:27 +0000346 static const int kMetricNetworkChannelMax;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700347 static const char kMetricNetworkEapInnerProtocolSuffix[];
Paul Stewart21f40962013-03-01 14:27:28 -0800348 static const int kMetricNetworkEapInnerProtocolMax;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700349 static const char kMetricNetworkEapOuterProtocolSuffix[];
Paul Stewart21f40962013-03-01 14:27:28 -0800350 static const int kMetricNetworkEapOuterProtocolMax;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700351 static const char kMetricNetworkPhyModeSuffix[];
Thieu Lead1ec2c2012-01-05 23:39:48 +0000352 static const int kMetricNetworkPhyModeMax;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700353 static const char kMetricNetworkSecuritySuffix[];
Thieu Lead1ec2c2012-01-05 23:39:48 +0000354 static const int kMetricNetworkSecurityMax;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000355 static const char kMetricNetworkServiceErrors[];
356 static const int kMetricNetworkServiceErrorsMax;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700357 static const char kMetricNetworkSignalStrengthSuffix[];
Paul Stewart23b393a2012-09-25 21:21:06 -0700358 static const int kMetricNetworkSignalStrengthMin;
359 static const int kMetricNetworkSignalStrengthMax;
360 static const int kMetricNetworkSignalStrengthNumBuckets;
Paul Stewart4ef524d2014-07-23 13:11:29 -0700361 static const char kMetricRememberedWiFiNetworkCount[];
362 static const int kMetricRememberedWiFiNetworkCountMin;
363 static const int kMetricRememberedWiFiNetworkCountMax;
364 static const int kMetricRememberedWiFiNetworkCountNumBuckets;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700365 static const char kMetricTimeOnlineSecondsSuffix[];
Thieu Lea20cbc22012-01-09 22:01:43 +0000366 static const int kMetricTimeOnlineSecondsMax;
367 static const int kMetricTimeOnlineSecondsMin;
368 static const int kMetricTimeOnlineSecondsNumBuckets;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700369 static const char kMetricTimeResumeToReadyMillisecondsSuffix[];
370 static const char kMetricTimeToConfigMillisecondsSuffix[];
371 static const char kMetricTimeToConnectMillisecondsSuffix[];
Thieu Lecdb5a212013-01-25 11:17:18 -0800372 static const int kMetricTimeToConnectMillisecondsMax;
373 static const int kMetricTimeToConnectMillisecondsMin;
374 static const int kMetricTimeToConnectMillisecondsNumBuckets;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700375 static const char kMetricTimeToScanAndConnectMillisecondsSuffix[];
Thieu Lea20cbc22012-01-09 22:01:43 +0000376 static const char kMetricTimeToDropSeconds[];
377 static const int kMetricTimeToDropSecondsMax;
378 static const int kMetricTimeToDropSecondsMin;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700379 static const char kMetricTimeToDisableMillisecondsSuffix[];
Thieu Lea2519bf2013-01-23 16:51:54 -0800380 static const int kMetricTimeToDisableMillisecondsMax;
381 static const int kMetricTimeToDisableMillisecondsMin;
382 static const int kMetricTimeToDisableMillisecondsNumBuckets;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700383 static const char kMetricTimeToEnableMillisecondsSuffix[];
Thieu Lece4483e2013-01-23 15:12:03 -0800384 static const int kMetricTimeToEnableMillisecondsMax;
385 static const int kMetricTimeToEnableMillisecondsMin;
386 static const int kMetricTimeToEnableMillisecondsNumBuckets;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700387 static const char kMetricTimeToInitializeMillisecondsSuffix[];
Thieu Lec8078a62013-01-22 18:01:12 -0800388 static const int kMetricTimeToInitializeMillisecondsMax;
Thieu Lece4483e2013-01-23 15:12:03 -0800389 static const int kMetricTimeToInitializeMillisecondsMin;
Thieu Lec8078a62013-01-22 18:01:12 -0800390 static const int kMetricTimeToInitializeMillisecondsNumBuckets;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700391 static const char kMetricTimeToJoinMillisecondsSuffix[];
392 static const char kMetricTimeToOnlineMillisecondsSuffix[];
393 static const char kMetricTimeToPortalMillisecondsSuffix[];
394 static const char kMetricTimeToScanMillisecondsSuffix[];
Thieu Le18c11072013-01-28 17:21:37 -0800395 static const int kMetricTimeToScanMillisecondsMax;
396 static const int kMetricTimeToScanMillisecondsMin;
397 static const int kMetricTimeToScanMillisecondsNumBuckets;
Thieu Lea20cbc22012-01-09 22:01:43 +0000398 static const int kTimerHistogramMillisecondsMax;
399 static const int kTimerHistogramMillisecondsMin;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000400 static const int kTimerHistogramNumBuckets;
401
Thieu Le85e050b2012-03-13 15:04:38 -0700402 // The number of portal detections attempted for each pass.
403 // This includes both failure/timeout attempts and successful attempt
404 // (if any).
mukesh agrawal132e96f2014-04-24 11:49:42 -0700405 static const char kMetricPortalAttemptsSuffix[];
Thieu Le85e050b2012-03-13 15:04:38 -0700406 static const int kMetricPortalAttemptsMax;
407 static const int kMetricPortalAttemptsMin;
408 static const int kMetricPortalAttemptsNumBuckets;
409
410 // The total number of portal detections attempted between the Connected
411 // state and the Online state. This includes both failure/timeout attempts
412 // and the final successful attempt.
mukesh agrawal132e96f2014-04-24 11:49:42 -0700413 static const char kMetricPortalAttemptsToOnlineSuffix[];
Thieu Le85e050b2012-03-13 15:04:38 -0700414 static const int kMetricPortalAttemptsToOnlineMax;
415 static const int kMetricPortalAttemptsToOnlineMin;
416 static const int kMetricPortalAttemptsToOnlineNumBuckets;
417
418 // The result of the portal detection.
mukesh agrawal132e96f2014-04-24 11:49:42 -0700419 static const char kMetricPortalResultSuffix[];
Thieu Le85e050b2012-03-13 15:04:38 -0700420
Wade Guthrie60a37062013-04-02 11:39:09 -0700421 // Wifi connection frequencies.
422 static const char kMetricFrequenciesConnectedEver[];
423 static const int kMetricFrequenciesConnectedMax;
424 static const int kMetricFrequenciesConnectedMin;
425 static const int kMetricFrequenciesConnectedNumBuckets;
426
Wade Guthrieb9e0ee72013-05-31 09:23:30 -0700427 static const char kMetricScanResult[];
Wade Guthrief22681f2013-05-31 11:46:31 -0700428 static const char kMetricWiFiScanTimeInEbusyMilliseconds[];
429
Thieu Leb84ba342012-03-02 15:15:19 -0800430 static const char kMetricPowerManagerKey[];
431
Paul Stewartff845fc2012-08-07 07:28:44 -0700432 // LinkMonitor statistics.
mukesh agrawal132e96f2014-04-24 11:49:42 -0700433 static const char kMetricLinkMonitorFailureSuffix[];
434 static const char kMetricLinkMonitorResponseTimeSampleSuffix[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700435 static const int kMetricLinkMonitorResponseTimeSampleMin;
436 static const int kMetricLinkMonitorResponseTimeSampleMax;
Paul Stewartff845fc2012-08-07 07:28:44 -0700437 static const int kMetricLinkMonitorResponseTimeSampleNumBuckets;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700438 static const char kMetricLinkMonitorSecondsToFailureSuffix[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700439 static const int kMetricLinkMonitorSecondsToFailureMin;
440 static const int kMetricLinkMonitorSecondsToFailureMax;
Paul Stewart0443aa52012-08-09 10:43:50 -0700441 static const int kMetricLinkMonitorSecondsToFailureNumBuckets;
mukesh agrawal132e96f2014-04-24 11:49:42 -0700442 static const char kMetricLinkMonitorBroadcastErrorsAtFailureSuffix[];
443 static const char kMetricLinkMonitorUnicastErrorsAtFailureSuffix[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700444 static const int kMetricLinkMonitorErrorCountMin;
445 static const int kMetricLinkMonitorErrorCountMax;
Paul Stewart0443aa52012-08-09 10:43:50 -0700446 static const int kMetricLinkMonitorErrorCountNumBuckets;
Paul Stewartff845fc2012-08-07 07:28:44 -0700447
Wade Guthried4977f22012-08-22 12:37:54 -0700448 static const char kMetricLinkClientDisconnectReason[];
449 static const char kMetricLinkApDisconnectReason[];
450 static const char kMetricLinkClientDisconnectType[];
451 static const char kMetricLinkApDisconnectType[];
452
Arman Uguray6d528f12012-09-13 13:44:55 -0700453 // Shill termination action statistics.
Arman Ugurayab22c162012-10-08 19:08:38 -0700454 static const char kMetricTerminationActionTimeOnTerminate[];
455 static const char kMetricTerminationActionResultOnTerminate[];
456 static const char kMetricTerminationActionTimeOnSuspend[];
457 static const char kMetricTerminationActionResultOnSuspend[];
458 static const int kMetricTerminationActionTimeMillisecondsMax;
459 static const int kMetricTerminationActionTimeMillisecondsMin;
Arman Uguray6d528f12012-09-13 13:44:55 -0700460
Paul Stewart85aea152013-01-22 09:31:56 -0800461 // WiFiService Entry Fixup.
mukesh agrawal132e96f2014-04-24 11:49:42 -0700462 static const char kMetricServiceFixupEntriesSuffix[];
Paul Stewart85aea152013-01-22 09:31:56 -0800463
Thieu Le26fc01b2013-01-28 12:08:48 -0800464 // Cellular specific statistics.
Prathmesh Prabhu08757aa2013-05-15 17:17:33 -0700465 static const char kMetricCellular3GPPRegistrationDelayedDrop[];
Thieu Le7cf36b02013-01-30 17:15:56 -0800466 static const char kMetricCellularAutoConnectTries[];
467 static const int kMetricCellularAutoConnectTriesMax;
468 static const int kMetricCellularAutoConnectTriesMin;
469 static const int kMetricCellularAutoConnectTriesNumBuckets;
470 static const char kMetricCellularAutoConnectTotalTime[];
471 static const int kMetricCellularAutoConnectTotalTimeMax;
472 static const int kMetricCellularAutoConnectTotalTimeMin;
473 static const int kMetricCellularAutoConnectTotalTimeNumBuckets;
Thieu Le91fccf62013-04-22 15:23:16 -0700474 static const char kMetricCellularDrop[];
475 static const char kMetricCellularDropsPerHour[];
476 static const int kMetricCellularDropsPerHourMax;
477 static const int kMetricCellularDropsPerHourMin;
478 static const int kMetricCellularDropsPerHourNumBuckets;
479 static const char kMetricCellularFailureReason[];
480 static const char kMetricCellularOutOfCreditsReason[];
481 static const char kMetricCellularSignalStrengthBeforeDrop[];
482 static const int kMetricCellularSignalStrengthBeforeDropMax;
483 static const int kMetricCellularSignalStrengthBeforeDropMin;
484 static const int kMetricCellularSignalStrengthBeforeDropNumBuckets;
Thieu Le26fc01b2013-01-28 12:08:48 -0800485
Thieu Le5133b712013-02-19 14:47:21 -0800486 // Profile statistics.
487 static const char kMetricCorruptedProfile[];
488
Paul Stewart91a43cb2013-03-02 21:34:15 -0800489 // VPN connection statistics.
490 static const char kMetricVpnDriver[];
491 static const int kMetricVpnDriverMax;
492 static const char kMetricVpnRemoteAuthenticationType[];
493 static const int kMetricVpnRemoteAuthenticationTypeMax;
494 static const char kMetricVpnUserAuthenticationType[];
495 static const int kMetricVpnUserAuthenticationTypeMax;
496
Paul Stewart1f916e42013-12-23 09:52:54 -0800497 // The length in seconds of a lease that has expired while the DHCP
498 // client was attempting to renew the lease..
mukesh agrawal132e96f2014-04-24 11:49:42 -0700499 static const char kMetricExpiredLeaseLengthSecondsSuffix[];
Paul Stewart1f916e42013-12-23 09:52:54 -0800500 static const int kMetricExpiredLeaseLengthSecondsMax;
501 static const int kMetricExpiredLeaseLengthSecondsMin;
502 static const int kMetricExpiredLeaseLengthSecondsNumBuckets;
503
Peter Qiu574996a2014-04-04 10:55:47 -0700504 // Number of wifi services available when auto-connect is initiated.
505 static const char kMetricWifiAutoConnectableServices[];
506 static const int kMetricWifiAutoConnectableServicesMax;
507 static const int kMetricWifiAutoConnectableServicesMin;
508 static const int kMetricWifiAutoConnectableServicesNumBuckets;
509
510 // Number of BSSes available for a wifi service when we attempt to connect
511 // to that service.
512 static const char kMetricWifiAvailableBSSes[];
513 static const int kMetricWifiAvailableBSSesMax;
514 static const int kMetricWifiAvailableBSSesMin;
515 static const int kMetricWifiAvailableBSSesNumBuckets;
516
mukesh agrawalf7348732014-08-06 18:08:56 -0700517 // Reason that the mac80211 TX queue is stopped.
518 static const char kMetricWifiStoppedTxQueueReason[];
519
520 // Maximal queue length amongst all stopped mac80211 TX queues.
521 static const char kMetricWifiStoppedTxQueueLength[];
522 static const int kMetricWifiStoppedTxQueueLengthMax;
523 static const int kMetricWifiStoppedTxQueueLengthMin;
524 static const int kMetricWifiStoppedTxQueueLengthNumBuckets;
525
Peter Qiu39d4af02014-04-14 12:24:01 -0700526 // Number of services associated with currently connected network.
527 static const char kMetricServicesOnSameNetwork[];
528 static const int kMetricServicesOnSameNetworkMax;
529 static const int kMetricServicesOnSameNetworkMin;
530 static const int kMetricServicesOnSameNetworkNumBuckets;
531
Peter Qiue783f1c2014-05-02 11:42:33 -0700532 // Metric for user-initiated events.
533 static const char kMetricUserInitiatedEvents[];
534
Peter Qiu8e430582014-04-30 14:12:37 -0700535 // Wifi TX bitrate in Mbps.
536 static const char kMetricWifiTxBitrate[];
537 static const int kMetricWifiTxBitrateMax;
538 static const int kMetricWifiTxBitrateMin;
539 static const int kMetricWifiTxBitrateNumBuckets;
540
Peter Qiudc4e0992014-05-01 10:02:52 -0700541 // User-initiated wifi connection attempt result.
542 static const char kMetricWifiUserInitiatedConnectionResult[];
543
Peter Qiud87179e2014-07-10 18:29:22 -0700544 // The reason of failed user-initiated wifi connection attempt.
545 static const char kMetricWifiUserInitiatedConnectionFailureReason[];
546
Peter Qiub9256f32014-05-09 15:27:29 -0700547 // DNS test result.
Peter Qiuf18e7712014-05-20 09:59:46 -0700548 static const char kMetricFallbackDNSTestResultSuffix[];
Peter Qiub9256f32014-05-09 15:27:29 -0700549
Peter Qiudc335f82014-05-15 10:33:17 -0700550 // Network problem detected by traffic monitor
551 static const char kMetricNetworkProblemDetectedSuffix[];
552
Peter Qiu700de642014-07-14 16:31:30 -0700553 // Device's connection status.
554 static const char kMetricDeviceConnectionStatus[];
555
Paul Stewart3bdf1ab2014-07-17 19:22:26 -0700556 // DHCP client status.
557 static const char kMetricDhcpClientStatus[];
558
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800559 explicit Metrics(EventDispatcher *dispatcher);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000560 virtual ~Metrics();
561
Thieu Le48e6d6d2011-12-06 00:40:27 +0000562 // Converts the WiFi frequency into the associated UMA channel enumerator.
Ben Chan7fab8972014-08-10 17:14:46 -0700563 static WiFiChannel WiFiFrequencyToChannel(uint16_t frequency);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000564
Thieu Lead1ec2c2012-01-05 23:39:48 +0000565 // Converts a flimflam security string into its UMA security enumerator.
566 static WiFiSecurity WiFiSecurityStringToEnum(const std::string &security);
567
Paul Stewarte4cedde2013-07-17 08:56:44 -0700568 // Converts a flimflam AP mode string into its UMA AP mode enumerator.
569 static WiFiApMode WiFiApModeStringToEnum(const std::string &ap_mode);
570
Paul Stewart21f40962013-03-01 14:27:28 -0800571 // Converts a flimflam EAP outer protocol string into its UMA enumerator.
572 static EapOuterProtocol EapOuterProtocolStringToEnum(
573 const std::string &outer);
574
575 // Converts a flimflam EAP inner protocol string into its UMA enumerator.
576 static EapInnerProtocol EapInnerProtocolStringToEnum(
577 const std::string &inner);
578
Thieu Le85e050b2012-03-13 15:04:38 -0700579 // Converts portal detection result to UMA portal result enumerator.
580 static PortalResult PortalDetectionResultToEnum(
581 const PortalDetector::Result &result);
582
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800583 // Starts this object. Call this during initialization.
584 virtual void Start();
585
586 // Stops this object. Call this during cleanup.
587 virtual void Stop();
588
Thieu Le48e6d6d2011-12-06 00:40:27 +0000589 // Registers a service with this object so it can use the timers to track
590 // state transition metrics.
Wade Guthrie7ac610b2013-10-01 17:48:14 -0700591 void RegisterService(const Service &service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000592
593 // Deregisters the service from this class. All state transition timers
594 // will be removed.
Wade Guthrie7ac610b2013-10-01 17:48:14 -0700595 void DeregisterService(const Service &service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000596
597 // Tracks the time it takes |service| to go from |start_state| to
598 // |stop_state|. When |stop_state| is reached, the time is sent to UMA.
mukesh agrawal6cfe53f2013-08-13 13:39:01 -0700599 virtual void AddServiceStateTransitionTimer(
Wade Guthrie7ac610b2013-10-01 17:48:14 -0700600 const Service &service, const std::string &histogram_name,
mukesh agrawal6cfe53f2013-08-13 13:39:01 -0700601 Service::ConnectState start_state, Service::ConnectState stop_state);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000602
mukesh agrawal132e96f2014-04-24 11:49:42 -0700603 // Specializes |metric_suffix| for the specified |technology_id|.
604 std::string GetFullMetricName(const char *metric_suffix,
Thieu Le48e6d6d2011-12-06 00:40:27 +0000605 Technology::Identifier technology_id);
606
607 // Notifies this object that the default service has changed.
608 // |service| is the new default service.
Thieu Lea20cbc22012-01-09 22:01:43 +0000609 virtual void NotifyDefaultServiceChanged(const Service *service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000610
611 // Notifies this object that |service| state has changed.
Wade Guthrie7ac610b2013-10-01 17:48:14 -0700612 virtual void NotifyServiceStateChanged(const Service &service,
Thieu Le48e6d6d2011-12-06 00:40:27 +0000613 Service::ConnectState new_state);
614
Thieu Le67370f62012-02-14 23:01:42 +0000615 // Notifies this object that |service| has been disconnected.
Wade Guthrie7ac610b2013-10-01 17:48:14 -0700616 void NotifyServiceDisconnect(const Service &service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000617
Wade Guthrie9ec08062013-09-25 15:22:24 -0700618 // Notifies this object of power at disconnect.
619 void NotifySignalAtDisconnect(const Service &service,
620 int16_t signal_strength);
621
Daniel Eratfac09532014-04-17 20:25:59 -0700622 // Notifies this object of the end of a suspend attempt.
623 void NotifySuspendDone();
Thieu Le48e6d6d2011-12-06 00:40:27 +0000624
Arman Ugurayab22c162012-10-08 19:08:38 -0700625 // Notifies this object that termination actions started executing.
626 void NotifyTerminationActionsStarted(TerminationActionReason reason);
627
628 // Notifies this object that termination actions have been completed.
629 // |success| is true, if the termination actions completed successfully.
630 void NotifyTerminationActionsCompleted(
631 TerminationActionReason reason, bool success);
632
Paul Stewartff845fc2012-08-07 07:28:44 -0700633 // Notifies this object of a failure in LinkMonitor.
634 void NotifyLinkMonitorFailure(
Paul Stewart0443aa52012-08-09 10:43:50 -0700635 Technology::Identifier technology,
636 LinkMonitorFailure failure,
Paul Stewartf1961f82012-09-11 20:45:39 -0700637 int seconds_to_failure,
638 int broadcast_error_count,
639 int unicast_error_count);
Paul Stewartff845fc2012-08-07 07:28:44 -0700640
641 // Notifies this object that LinkMonitor has added a response time sample
642 // for |connection| with a value of |response_time_milliseconds|.
643 void NotifyLinkMonitorResponseTimeSampleAdded(
644 Technology::Identifier technology,
Paul Stewartf1961f82012-09-11 20:45:39 -0700645 int response_time_milliseconds);
Paul Stewartff845fc2012-08-07 07:28:44 -0700646
Wade Guthried4977f22012-08-22 12:37:54 -0700647 // Notifies this object of WiFi disconnect.
Wade Guthriec2728962013-07-10 09:32:16 -0700648 virtual void Notify80211Disconnect(WiFiDisconnectByWhom by_whom,
649 IEEE_80211::WiFiReasonCode reason);
Wade Guthried4977f22012-08-22 12:37:54 -0700650
Thieu Lec8078a62013-01-22 18:01:12 -0800651 // Registers a device with this object so the device can use the timers to
652 // track state transition metrics.
653 void RegisterDevice(int interface_index,
654 Technology::Identifier technology);
655
Thieu Le9abd6742013-01-23 23:35:37 -0800656 // Checks to see if the device has already been registered.
657 bool IsDeviceRegistered(int interface_index,
658 Technology::Identifier technology);
659
Thieu Lec8078a62013-01-22 18:01:12 -0800660 // Deregisters the device from this class. All state transition timers
661 // will be removed.
662 void DeregisterDevice(int interface_index);
663
664 // Notifies this object that a device has been initialized.
665 void NotifyDeviceInitialized(int interface_index);
666
Thieu Lece4483e2013-01-23 15:12:03 -0800667 // Notifies this object that a device has started the enable process.
668 void NotifyDeviceEnableStarted(int interface_index);
669
670 // Notifies this object that a device has completed the enable process.
671 void NotifyDeviceEnableFinished(int interface_index);
672
Thieu Lea2519bf2013-01-23 16:51:54 -0800673 // Notifies this object that a device has started the disable process.
674 void NotifyDeviceDisableStarted(int interface_index);
675
676 // Notifies this object that a device has completed the disable process.
677 void NotifyDeviceDisableFinished(int interface_index);
678
Thieu Le18c11072013-01-28 17:21:37 -0800679 // Notifies this object that a device has started the scanning process.
Wade Guthrie44f290d2013-05-28 10:16:25 -0700680 virtual void NotifyDeviceScanStarted(int interface_index);
Thieu Le18c11072013-01-28 17:21:37 -0800681
682 // Notifies this object that a device has completed the scanning process.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700683 virtual void NotifyDeviceScanFinished(int interface_index);
Thieu Le18c11072013-01-28 17:21:37 -0800684
Wade Guthrie9ec08062013-09-25 15:22:24 -0700685 // Terminates an underway scan (does nothing if a scan wasn't underway).
Wade Guthriea5995cf2013-07-30 09:31:16 -0700686 virtual void ResetScanTimer(int interface_index);
Wade Guthrie44f290d2013-05-28 10:16:25 -0700687
Thieu Lecdb5a212013-01-25 11:17:18 -0800688 // Notifies this object that a device has started the connect process.
Wade Guthrie44f290d2013-05-28 10:16:25 -0700689 virtual void NotifyDeviceConnectStarted(int interface_index,
690 bool is_auto_connecting);
Thieu Lecdb5a212013-01-25 11:17:18 -0800691
692 // Notifies this object that a device has completed the connect process.
Wade Guthrie44f290d2013-05-28 10:16:25 -0700693 virtual void NotifyDeviceConnectFinished(int interface_index);
694
695 // Resets both the connect_timer and the scan_connect_timer the timer (the
696 // latter so that a future connect will not erroneously be associated with
697 // the previous scan).
698 virtual void ResetConnectTimer(int interface_index);
Thieu Lecdb5a212013-01-25 11:17:18 -0800699
Thieu Le26fc01b2013-01-28 12:08:48 -0800700 // Notifies this object that a cellular device has been dropped by the
701 // network.
mukesh agrawal09e08112013-08-16 13:26:44 -0700702 void NotifyCellularDeviceDrop(const std::string &network_technology,
Ben Chan7fab8972014-08-10 17:14:46 -0700703 uint16_t signal_strength);
Thieu Le26fc01b2013-01-28 12:08:48 -0800704
Prathmesh Prabhu08757aa2013-05-15 17:17:33 -0700705 // Notifies this object about 3GPP registration drop events.
706 virtual void Notify3GPPRegistrationDelayedDropPosted();
707 virtual void Notify3GPPRegistrationDelayedDropCanceled();
708
Thieu Leb7aa5f72013-01-31 15:57:48 -0800709 // Notifies this object about a cellular device failure code.
710 void NotifyCellularDeviceFailure(const Error &error);
711
Thieu Le91fccf62013-04-22 15:23:16 -0700712 // Notifies this object that a cellular service has been marked as
713 // out-of-credits.
714 void NotifyCellularOutOfCredits(Metrics::CellularOutOfCreditsReason reason);
715
Peter Qiu574996a2014-04-04 10:55:47 -0700716 // Notifies this object about number of wifi services available for auto
717 // connect when auto-connect is initiated.
718 virtual void NotifyWifiAutoConnectableServices(int num_services);
719
720 // Notifies this object about number of BSSes available for a wifi service
721 // when attempt to connect to that service.
722 virtual void NotifyWifiAvailableBSSes(int num_services);
723
Peter Qiu39d4af02014-04-14 12:24:01 -0700724 // Notifies this object about number of services associated to the
725 // currently connected network.
726 virtual void NotifyServicesOnSameNetwork(int num_services);
727
Peter Qiu8e430582014-04-30 14:12:37 -0700728 // Notifies this object about WIFI TX bitrate in Mbps.
729 virtual void NotifyWifiTxBitrate(int bitrate);
730
Peter Qiudc4e0992014-05-01 10:02:52 -0700731 // Notifies this object about the result of user-initiated connection
732 // attempt.
733 virtual void NotifyUserInitiatedConnectionResult(const std::string &name,
734 int result);
735
Peter Qiud87179e2014-07-10 18:29:22 -0700736 // Notifies this object about the reason of failed user-initiated connection
737 // attempt.
738 virtual void NotifyUserInitiatedConnectionFailureReason(
739 const std::string &name, const Service::ConnectFailure failure);
740
Thieu Le5133b712013-02-19 14:47:21 -0800741 // Notifies this object about a corrupted profile.
742 virtual void NotifyCorruptedProfile();
743
Peter Qiue783f1c2014-05-02 11:42:33 -0700744 // Notifies this object about user-initiated event.
745 virtual void NotifyUserInitiatedEvent(int event);
746
Peter Qiub9256f32014-05-09 15:27:29 -0700747 // Notifies this object about the result of the fallback DNS test.
Peter Qiuf18e7712014-05-20 09:59:46 -0700748 virtual void NotifyFallbackDNSTestResult(Technology::Identifier technology_id,
749 int result);
Peter Qiub9256f32014-05-09 15:27:29 -0700750
Peter Qiudc335f82014-05-15 10:33:17 -0700751 // Notifies this object about a network problem detected on the currently
752 // connected network.
753 virtual void NotifyNetworkProblemDetected(
754 Technology::Identifier technology_id, int reason);
755
Peter Qiu700de642014-07-14 16:31:30 -0700756 // Notifies this object about current connection status (online vs offline).
757 virtual void NotifyDeviceConnectionStatus(Metrics::ConnectionStatus status);
758
Paul Stewart3bdf1ab2014-07-17 19:22:26 -0700759 // Notifies this object about the DHCP client status.
760 virtual void NotifyDhcpClientStatus(Metrics::DhcpClientStatus status);
761
Thieu Le48e6d6d2011-12-06 00:40:27 +0000762 // Sends linear histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700763 virtual bool SendEnumToUMA(const std::string &name, int sample, int max);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000764
Thieu Lea20cbc22012-01-09 22:01:43 +0000765 // Send histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700766 virtual bool SendToUMA(const std::string &name, int sample, int min,
767 int max, int num_buckets);
Thieu Lea20cbc22012-01-09 22:01:43 +0000768
Thieu Le48e6d6d2011-12-06 00:40:27 +0000769 private:
Thieu Le48e6d6d2011-12-06 00:40:27 +0000770 friend class MetricsTest;
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800771 FRIEND_TEST(MetricsTest, CellularDropsPerHour);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000772 FRIEND_TEST(MetricsTest, FrequencyToChannel);
Wade Guthrie44f290d2013-05-28 10:16:25 -0700773 FRIEND_TEST(MetricsTest, ResetConnectTimer);
Thieu Leb84ba342012-03-02 15:15:19 -0800774 FRIEND_TEST(MetricsTest, ServiceFailure);
Thieu Lea20cbc22012-01-09 22:01:43 +0000775 FRIEND_TEST(MetricsTest, TimeOnlineTimeToDrop);
Thieu Leb84ba342012-03-02 15:15:19 -0800776 FRIEND_TEST(MetricsTest, TimeToConfig);
777 FRIEND_TEST(MetricsTest, TimeToOnline);
778 FRIEND_TEST(MetricsTest, TimeToPortal);
Thieu Le18c11072013-01-28 17:21:37 -0800779 FRIEND_TEST(MetricsTest, TimeToScanIgnore);
Thieu Leb84ba342012-03-02 15:15:19 -0800780 FRIEND_TEST(MetricsTest, WiFiServiceChannel);
781 FRIEND_TEST(MetricsTest, WiFiServicePostReady);
Gaurav Shah6d2c72d2012-10-16 16:30:44 -0700782 FRIEND_TEST(WiFiMainTest, GetGeolocationObjects);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000783
784 typedef ScopedVector<chromeos_metrics::TimerReporter> TimerReporters;
785 typedef std::list<chromeos_metrics::TimerReporter *> TimerReportersList;
786 typedef std::map<Service::ConnectState, TimerReportersList>
787 TimerReportersByState;
788 struct ServiceMetrics {
Thieu Le48e6d6d2011-12-06 00:40:27 +0000789 // All TimerReporter objects are stored in |timers| which owns the objects.
790 // |start_on_state| and |stop_on_state| contain pointers to the
791 // TimerReporter objects and control when to start and stop the timers.
792 TimerReporters timers;
793 TimerReportersByState start_on_state;
794 TimerReportersByState stop_on_state;
795 };
Alex Vakulenko8a532292014-06-16 17:18:44 -0700796 typedef std::map<const Service *, std::shared_ptr<ServiceMetrics> >
Thieu Le48e6d6d2011-12-06 00:40:27 +0000797 ServiceMetricsLookupMap;
798
Thieu Lec8078a62013-01-22 18:01:12 -0800799 struct DeviceMetrics {
mukesh agrawal09e08112013-08-16 13:26:44 -0700800 DeviceMetrics() : auto_connect_tries(0) {}
Thieu Le9abd6742013-01-23 23:35:37 -0800801 Technology::Identifier technology;
Thieu Lec8078a62013-01-22 18:01:12 -0800802 scoped_ptr<chromeos_metrics::TimerReporter> initialization_timer;
Thieu Lece4483e2013-01-23 15:12:03 -0800803 scoped_ptr<chromeos_metrics::TimerReporter> enable_timer;
Thieu Lea2519bf2013-01-23 16:51:54 -0800804 scoped_ptr<chromeos_metrics::TimerReporter> disable_timer;
Thieu Le18c11072013-01-28 17:21:37 -0800805 scoped_ptr<chromeos_metrics::TimerReporter> scan_timer;
Thieu Lecdb5a212013-01-25 11:17:18 -0800806 scoped_ptr<chromeos_metrics::TimerReporter> connect_timer;
Wade Guthrie44f290d2013-05-28 10:16:25 -0700807 scoped_ptr<chromeos_metrics::TimerReporter> scan_connect_timer;
Thieu Le7cf36b02013-01-30 17:15:56 -0800808 scoped_ptr<chromeos_metrics::TimerReporter> auto_connect_timer;
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800809 int auto_connect_tries;
Thieu Lec8078a62013-01-22 18:01:12 -0800810 };
Alex Vakulenko8a532292014-06-16 17:18:44 -0700811 typedef std::map<const int, std::shared_ptr<DeviceMetrics> >
Thieu Lec8078a62013-01-22 18:01:12 -0800812 DeviceMetricsLookupMap;
813
Ben Chan7fab8972014-08-10 17:14:46 -0700814 static const uint16_t kWiFiBandwidth5MHz;
815 static const uint16_t kWiFiBandwidth20MHz;
816 static const uint16_t kWiFiFrequency2412;
817 static const uint16_t kWiFiFrequency2472;
818 static const uint16_t kWiFiFrequency2484;
819 static const uint16_t kWiFiFrequency5170;
820 static const uint16_t kWiFiFrequency5180;
821 static const uint16_t kWiFiFrequency5230;
822 static const uint16_t kWiFiFrequency5240;
823 static const uint16_t kWiFiFrequency5320;
824 static const uint16_t kWiFiFrequency5500;
825 static const uint16_t kWiFiFrequency5700;
826 static const uint16_t kWiFiFrequency5745;
827 static const uint16_t kWiFiFrequency5825;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000828
Wade Guthrie7ac610b2013-10-01 17:48:14 -0700829 void InitializeCommonServiceMetrics(const Service &service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000830 void UpdateServiceStateTransitionMetrics(ServiceMetrics *service_metrics,
831 Service::ConnectState new_state);
Wade Guthrie7ac610b2013-10-01 17:48:14 -0700832 void SendServiceFailure(const Service &service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000833
Wade Guthrie60a37062013-04-02 11:39:09 -0700834 DeviceMetrics *GetDeviceMetrics(int interface_index) const;
Thieu Le7cf36b02013-01-30 17:15:56 -0800835 void AutoConnectMetricsReset(DeviceMetrics *device_metrics);
Thieu Lece4483e2013-01-23 15:12:03 -0800836
Thieu Le48e6d6d2011-12-06 00:40:27 +0000837 // For unit test purposes.
838 void set_library(MetricsLibraryInterface *library);
Thieu Lea20cbc22012-01-09 22:01:43 +0000839 void set_time_online_timer(chromeos_metrics::Timer *timer) {
840 time_online_timer_.reset(timer); // Passes ownership
841 }
842 void set_time_to_drop_timer(chromeos_metrics::Timer *timer) {
843 time_to_drop_timer_.reset(timer); // Passes ownership
844 }
Thieu Leb84ba342012-03-02 15:15:19 -0800845 void set_time_resume_to_ready_timer(chromeos_metrics::Timer *timer) {
846 time_resume_to_ready_timer_.reset(timer); // Passes ownership
847 }
Arman Ugurayab22c162012-10-08 19:08:38 -0700848 void set_time_termination_actions_timer(
849 chromeos_metrics::Timer *timer) {
850 time_termination_actions_timer.reset(timer); // Passes ownership
851 }
Thieu Le18c11072013-01-28 17:21:37 -0800852 void set_time_to_scan_timer(int interface_index,
853 chromeos_metrics::TimerReporter *timer) {
854 DeviceMetrics *device_metrics = GetDeviceMetrics(interface_index);
855 device_metrics->scan_timer.reset(timer); // Passes ownership
856 }
Wade Guthrie44f290d2013-05-28 10:16:25 -0700857 void set_time_to_connect_timer(int interface_index,
858 chromeos_metrics::TimerReporter *timer) {
859 DeviceMetrics *device_metrics = GetDeviceMetrics(interface_index);
860 device_metrics->connect_timer.reset(timer); // Passes ownership
861 }
862 void set_time_to_scan_connect_timer(int interface_index,
863 chromeos_metrics::TimerReporter *timer) {
864 DeviceMetrics *device_metrics = GetDeviceMetrics(interface_index);
865 device_metrics->scan_connect_timer.reset(timer); // Passes ownership
866 }
Thieu Le48e6d6d2011-12-06 00:40:27 +0000867
868 // |library_| points to |metrics_library_| when shill runs normally.
869 // However, in order to allow for unit testing, we point |library_| to a
870 // MetricsLibraryMock object instead.
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800871 EventDispatcher *dispatcher_;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000872 MetricsLibrary metrics_library_;
873 MetricsLibraryInterface *library_;
874 ServiceMetricsLookupMap services_metrics_;
Thieu Lea20cbc22012-01-09 22:01:43 +0000875 Technology::Identifier last_default_technology_;
876 bool was_online_;
877 scoped_ptr<chromeos_metrics::Timer> time_online_timer_;
878 scoped_ptr<chromeos_metrics::Timer> time_to_drop_timer_;
Thieu Leb84ba342012-03-02 15:15:19 -0800879 scoped_ptr<chromeos_metrics::Timer> time_resume_to_ready_timer_;
Arman Ugurayab22c162012-10-08 19:08:38 -0700880 scoped_ptr<chromeos_metrics::Timer> time_termination_actions_timer;
Darin Petkov58f0b6d2012-06-12 12:52:30 +0200881 bool collect_bootstats_;
Thieu Lec8078a62013-01-22 18:01:12 -0800882 DeviceMetricsLookupMap devices_metrics_;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000883
884 DISALLOW_COPY_AND_ASSIGN(Metrics);
885};
886
887} // namespace shill
888
Wade Guthrie60a37062013-04-02 11:39:09 -0700889#endif // SHILL_METRICS_H_