blob: 330e0de33c8460a316422377c68c1f29a27ed9c3 [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>
9
Thieu Le48e6d6d2011-12-06 00:40:27 +000010#include <base/memory/scoped_vector.h>
11#include <metrics/metrics_library.h>
12#include <metrics/timer.h>
13
Thieu Le6c1e3bb2013-02-06 15:20:35 -080014#include "shill/event_dispatcher.h"
Wade Guthried4977f22012-08-22 12:37:54 -070015#include "shill/ieee80211.h"
Thieu Le85e050b2012-03-13 15:04:38 -070016#include "shill/portal_detector.h"
Thieu Leb84ba342012-03-02 15:15:19 -080017#include "shill/power_manager.h"
Thieu Le48e6d6d2011-12-06 00:40:27 +000018#include "shill/refptr_types.h"
19#include "shill/service.h"
20
21namespace shill {
22
Gaurav Shah6d2c72d2012-10-16 16:30:44 -070023class WiFiMainTest;
Thieu Le48e6d6d2011-12-06 00:40:27 +000024class WiFiService;
25
26class Metrics {
27 public:
28 enum WiFiChannel {
29 kWiFiChannelUndef = 0,
30 kWiFiChannel2412 = 1,
31 kWiFiChannel2417 = 2,
32 kWiFiChannel2422 = 3,
33 kWiFiChannel2427 = 4,
34 kWiFiChannel2432 = 5,
35 kWiFiChannel2437 = 6,
36 kWiFiChannel2442 = 7,
37 kWiFiChannel2447 = 8,
38 kWiFiChannel2452 = 9,
39 kWiFiChannel2457 = 10,
40 kWiFiChannel2462 = 11,
41 kWiFiChannel2467 = 12,
42 kWiFiChannel2472 = 13,
43 kWiFiChannel2484 = 14,
44
45 kWiFiChannel5180 = 15,
46 kWiFiChannel5200 = 16,
47 kWiFiChannel5220 = 17,
48 kWiFiChannel5240 = 18,
49 kWiFiChannel5260 = 19,
50 kWiFiChannel5280 = 20,
51 kWiFiChannel5300 = 21,
52 kWiFiChannel5320 = 22,
53
54 kWiFiChannel5500 = 23,
55 kWiFiChannel5520 = 24,
56 kWiFiChannel5540 = 25,
57 kWiFiChannel5560 = 26,
58 kWiFiChannel5580 = 27,
59 kWiFiChannel5600 = 28,
60 kWiFiChannel5620 = 29,
61 kWiFiChannel5640 = 30,
62 kWiFiChannel5660 = 31,
63 kWiFiChannel5680 = 32,
64 kWiFiChannel5700 = 33,
65
66 kWiFiChannel5745 = 34,
67 kWiFiChannel5765 = 35,
68 kWiFiChannel5785 = 36,
69 kWiFiChannel5805 = 37,
70 kWiFiChannel5825 = 38,
71
72 kWiFiChannel5170 = 39,
73 kWiFiChannel5190 = 40,
74 kWiFiChannel5210 = 41,
75 kWiFiChannel5230 = 42,
76
77 /* NB: ignore old 11b bands 2312..2372 and 2512..2532 */
78 /* NB: ignore regulated bands 4920..4980 and 5020..5160 */
79 kWiFiChannelMax
80 };
81
Thieu Lead1ec2c2012-01-05 23:39:48 +000082 enum WiFiNetworkPhyMode {
83 kWiFiNetworkPhyModeUndef = 0, // Unknown/undefined
84 kWiFiNetworkPhyMode11a = 1, // 802.11a
85 kWiFiNetworkPhyMode11b = 2, // 802.11b
86 kWiFiNetworkPhyMode11g = 3, // 802.11g
87 kWiFiNetworkPhyMode11n = 4, // 802.11n
88 kWiFiNetworkPhyModeHalf = 5, // PSB Half-width
89 kWiFiNetworkPhyModeQuarter = 6, // PSB Quarter-width
90 kWiFiNetworkPhyModeTurbo = 7, // Atheros Turbo mode
91
92 kWiFiNetworkPhyModeMax
93 };
94
Paul Stewart21f40962013-03-01 14:27:28 -080095 enum EapOuterProtocol {
96 kEapOuterProtocolUnknown = 0,
97 kEapOuterProtocolLeap = 1,
98 kEapOuterProtocolPeap = 2,
99 kEapOuterProtocolTls = 3,
100 kEapOuterProtocolTtls = 4,
101
102 kEapOuterProtocolMax
103 };
104
105 enum EapInnerProtocol {
106 kEapInnerProtocolUnknown = 0,
107 kEapInnerProtocolNone = 1,
108 kEapInnerProtocolPeapMd5 = 2,
109 kEapInnerProtocolPeapMschapv2 = 3,
110 kEapInnerProtocolTtlsEapMd5 = 4,
111 kEapInnerProtocolTtlsEapMschapv2 = 5,
112 kEapInnerProtocolTtlsMschapv2 = 6,
113 kEapInnerProtocolTtlsMschap = 7,
114 kEapInnerProtocolTtlsPap = 8,
115 kEapInnerProtocolTtlsChap = 9,
116
117 kEapInnerProtocolMax
118 };
119
Thieu Lead1ec2c2012-01-05 23:39:48 +0000120 enum WiFiSecurity {
121 kWiFiSecurityUnknown = 0,
122 kWiFiSecurityNone = 1,
123 kWiFiSecurityWep = 2,
124 kWiFiSecurityWpa = 3,
125 kWiFiSecurityRsn = 4,
126 kWiFiSecurity8021x = 5,
127 kWiFiSecurityPsk = 6,
128
129 kWiFiSecurityMax
130 };
131
Thieu Le85e050b2012-03-13 15:04:38 -0700132 enum PortalResult {
133 kPortalResultSuccess = 0,
134 kPortalResultDNSFailure = 1,
135 kPortalResultDNSTimeout = 2,
136 kPortalResultConnectionFailure = 3,
137 kPortalResultConnectionTimeout = 4,
138 kPortalResultHTTPFailure = 5,
139 kPortalResultHTTPTimeout = 6,
140 kPortalResultContentFailure = 7,
141 kPortalResultContentTimeout = 8,
142 kPortalResultUnknown = 9,
143
144 kPortalResultMax
145 };
146
Paul Stewartff845fc2012-08-07 07:28:44 -0700147 enum LinkMonitorFailure {
148 kLinkMonitorMacAddressNotFound = 0,
149 kLinkMonitorClientStartFailure = 1,
150 kLinkMonitorTransmitFailure = 2,
151 kLinkMonitorFailureThresholdReached = 3,
152
153 kLinkMonitorFailureMax
154 };
155
Wade Guthried4977f22012-08-22 12:37:54 -0700156 enum WiFiStatusType {
157 kStatusCodeTypeByAp,
158 kStatusCodeTypeByClient,
159 kStatusCodeTypeByUser,
160 kStatusCodeTypeConsideredDead,
161 kStatusCodeTypeMax
162 };
163
164 enum WiFiDisconnectByWhom {
165 kDisconnectedByAp,
166 kDisconnectedNotByAp
167 };
168
Wade Guthrieb9e0ee72013-05-31 09:23:30 -0700169 enum WiFiScanResult {
170 kScanResultProgressiveConnected,
171 kScanResultProgressiveErrorAndFullFoundNothing,
172 kScanResultProgressiveErrorButFullConnected,
173 kScanResultProgressiveAndFullFoundNothing,
174 kScanResultProgressiveAndFullConnected,
175 kScanResultFullScanFoundNothing,
176 kScanResultFullScanConnected,
177 kScanResultInternalError,
178 kScanResultMax
179 };
180
Paul Stewart85aea152013-01-22 09:31:56 -0800181 enum ServiceFixupProfileType {
182 kMetricServiceFixupDefaultProfile,
183 kMetricServiceFixupUserProfile,
184 kMetricServiceFixupMax
185 };
186
Arman Uguray6d528f12012-09-13 13:44:55 -0700187 enum TerminationActionResult {
Arman Ugurayab22c162012-10-08 19:08:38 -0700188 kTerminationActionResultSuccess,
189 kTerminationActionResultFailure,
Arman Uguray6d528f12012-09-13 13:44:55 -0700190 kTerminationActionResultMax
191 };
192
Arman Ugurayab22c162012-10-08 19:08:38 -0700193 enum TerminationActionReason {
194 kTerminationActionReasonSuspend,
195 kTerminationActionReasonTerminate
196 };
197
Thieu Le26fc01b2013-01-28 12:08:48 -0800198 enum CellularDropTechnology {
199 kCellularDropTechnology1Xrtt = 0,
200 kCellularDropTechnologyEdge = 1,
201 kCellularDropTechnologyEvdo = 2,
202 kCellularDropTechnologyGprs = 3,
203 kCellularDropTechnologyGsm = 4,
204 kCellularDropTechnologyHspa = 5,
205 kCellularDropTechnologyHspaPlus = 6,
206 kCellularDropTechnologyLte = 7,
207 kCellularDropTechnologyUmts = 8,
208 kCellularDropTechnologyUnknown = 9,
209 kCellularDropTechnologyMax
210 };
211
Thieu Le91fccf62013-04-22 15:23:16 -0700212 enum CellularOutOfCreditsReason {
213 kCellularOutOfCreditsReasonConnectDisconnectLoop = 0,
214 kCellularOutOfCreditsReasonTxCongested = 1,
215 kCellularOutOfCreditsReasonElongatedTimeWait = 2,
216 kCellularOutOfCreditsReasonMax
217 };
218
Thieu Le5133b712013-02-19 14:47:21 -0800219 enum CorruptedProfile {
220 kCorruptedProfile = 1,
221 kCorruptedProfileMax
222 };
223
Paul Stewart91a43cb2013-03-02 21:34:15 -0800224 enum VpnDriver {
225 kVpnDriverOpenVpn = 0,
226 kVpnDriverL2tpIpsec = 1,
227 kVpnDriverMax
228 };
229
230 enum VpnRemoteAuthenticationType {
231 kVpnRemoteAuthenticationTypeOpenVpnDefault = 0,
232 kVpnRemoteAuthenticationTypeOpenVpnCertificate = 1,
233 kVpnRemoteAuthenticationTypeL2tpIpsecDefault = 2,
234 kVpnRemoteAuthenticationTypeL2tpIpsecCertificate = 3,
235 kVpnRemoteAuthenticationTypeL2tpIpsecPsk = 4,
236 kVpnRemoteAuthenticationTypeMax
237 };
238
239 enum VpnUserAuthenticationType {
240 kVpnUserAuthenticationTypeOpenVpnNone = 0,
241 kVpnUserAuthenticationTypeOpenVpnCertificate = 1,
242 kVpnUserAuthenticationTypeOpenVpnUsernamePassword = 2,
243 kVpnUserAuthenticationTypeOpenVpnUsernamePasswordOtp = 3,
244 kVpnUserAuthenticationTypeL2tpIpsecNone = 4,
245 kVpnUserAuthenticationTypeL2tpIpsecCertificate = 5,
246 kVpnUserAuthenticationTypeL2tpIpsecUsernamePassword = 6,
247 kVpnUserAuthenticationTypeMax
248 };
249
Thieu Le67370f62012-02-14 23:01:42 +0000250 static const char kMetricDisconnect[];
251 static const int kMetricDisconnectMax;
252 static const int kMetricDisconnectMin;
253 static const int kMetricDisconnectNumBuckets;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000254 static const char kMetricNetworkChannel[];
255 static const int kMetricNetworkChannelMax;
Paul Stewart21f40962013-03-01 14:27:28 -0800256 static const char kMetricNetworkEapInnerProtocol[];
257 static const int kMetricNetworkEapInnerProtocolMax;
258 static const char kMetricNetworkEapOuterProtocol[];
259 static const int kMetricNetworkEapOuterProtocolMax;
Thieu Lead1ec2c2012-01-05 23:39:48 +0000260 static const char kMetricNetworkPhyMode[];
261 static const int kMetricNetworkPhyModeMax;
262 static const char kMetricNetworkSecurity[];
263 static const int kMetricNetworkSecurityMax;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000264 static const char kMetricNetworkServiceErrors[];
265 static const int kMetricNetworkServiceErrorsMax;
Paul Stewart23b393a2012-09-25 21:21:06 -0700266 static const char kMetricNetworkSignalStrength[];
267 static const int kMetricNetworkSignalStrengthMin;
268 static const int kMetricNetworkSignalStrengthMax;
269 static const int kMetricNetworkSignalStrengthNumBuckets;
Thieu Lea20cbc22012-01-09 22:01:43 +0000270 static const char kMetricTimeOnlineSeconds[];
271 static const int kMetricTimeOnlineSecondsMax;
272 static const int kMetricTimeOnlineSecondsMin;
273 static const int kMetricTimeOnlineSecondsNumBuckets;
Thieu Leb84ba342012-03-02 15:15:19 -0800274 static const char kMetricTimeResumeToReadyMilliseconds[];
Thieu Le48e6d6d2011-12-06 00:40:27 +0000275 static const char kMetricTimeToConfigMilliseconds[];
Thieu Lecdb5a212013-01-25 11:17:18 -0800276 static const char kMetricTimeToConnectMilliseconds[];
277 static const int kMetricTimeToConnectMillisecondsMax;
278 static const int kMetricTimeToConnectMillisecondsMin;
279 static const int kMetricTimeToConnectMillisecondsNumBuckets;
Wade Guthrie44f290d2013-05-28 10:16:25 -0700280 static const char kMetricTimeToScanAndConnectMilliseconds[];
Thieu Lea20cbc22012-01-09 22:01:43 +0000281 static const char kMetricTimeToDropSeconds[];
282 static const int kMetricTimeToDropSecondsMax;
283 static const int kMetricTimeToDropSecondsMin;
Thieu Lea2519bf2013-01-23 16:51:54 -0800284 static const char kMetricTimeToDisableMilliseconds[];
285 static const int kMetricTimeToDisableMillisecondsMax;
286 static const int kMetricTimeToDisableMillisecondsMin;
287 static const int kMetricTimeToDisableMillisecondsNumBuckets;
Thieu Lece4483e2013-01-23 15:12:03 -0800288 static const char kMetricTimeToEnableMilliseconds[];
289 static const int kMetricTimeToEnableMillisecondsMax;
290 static const int kMetricTimeToEnableMillisecondsMin;
291 static const int kMetricTimeToEnableMillisecondsNumBuckets;
Thieu Lec8078a62013-01-22 18:01:12 -0800292 static const char kMetricTimeToInitializeMilliseconds[];
Thieu Lec8078a62013-01-22 18:01:12 -0800293 static const int kMetricTimeToInitializeMillisecondsMax;
Thieu Lece4483e2013-01-23 15:12:03 -0800294 static const int kMetricTimeToInitializeMillisecondsMin;
Thieu Lec8078a62013-01-22 18:01:12 -0800295 static const int kMetricTimeToInitializeMillisecondsNumBuckets;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000296 static const char kMetricTimeToJoinMilliseconds[];
297 static const char kMetricTimeToOnlineMilliseconds[];
298 static const char kMetricTimeToPortalMilliseconds[];
Thieu Le18c11072013-01-28 17:21:37 -0800299 static const char kMetricTimeToScanMilliseconds[];
300 static const int kMetricTimeToScanMillisecondsMax;
301 static const int kMetricTimeToScanMillisecondsMin;
302 static const int kMetricTimeToScanMillisecondsNumBuckets;
Thieu Lea20cbc22012-01-09 22:01:43 +0000303 static const int kTimerHistogramMillisecondsMax;
304 static const int kTimerHistogramMillisecondsMin;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000305 static const int kTimerHistogramNumBuckets;
306
Thieu Le85e050b2012-03-13 15:04:38 -0700307 // The number of portal detections attempted for each pass.
308 // This includes both failure/timeout attempts and successful attempt
309 // (if any).
310 static const char kMetricPortalAttempts[];
311 static const int kMetricPortalAttemptsMax;
312 static const int kMetricPortalAttemptsMin;
313 static const int kMetricPortalAttemptsNumBuckets;
314
315 // The total number of portal detections attempted between the Connected
316 // state and the Online state. This includes both failure/timeout attempts
317 // and the final successful attempt.
318 static const char kMetricPortalAttemptsToOnline[];
319 static const int kMetricPortalAttemptsToOnlineMax;
320 static const int kMetricPortalAttemptsToOnlineMin;
321 static const int kMetricPortalAttemptsToOnlineNumBuckets;
322
323 // The result of the portal detection.
324 static const char kMetricPortalResult[];
325
Wade Guthrie60a37062013-04-02 11:39:09 -0700326 // Wifi connection frequencies.
327 static const char kMetricFrequenciesConnectedEver[];
328 static const int kMetricFrequenciesConnectedMax;
329 static const int kMetricFrequenciesConnectedMin;
330 static const int kMetricFrequenciesConnectedNumBuckets;
331
Wade Guthrieb9e0ee72013-05-31 09:23:30 -0700332 static const char kMetricScanResult[];
Wade Guthrief22681f2013-05-31 11:46:31 -0700333 static const char kMetricWiFiScanTimeInEbusyMilliseconds[];
334
Thieu Leb84ba342012-03-02 15:15:19 -0800335 static const char kMetricPowerManagerKey[];
336
Paul Stewartff845fc2012-08-07 07:28:44 -0700337 // LinkMonitor statistics.
338 static const char kMetricLinkMonitorFailure[];
339 static const char kMetricLinkMonitorResponseTimeSample[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700340 static const int kMetricLinkMonitorResponseTimeSampleMin;
341 static const int kMetricLinkMonitorResponseTimeSampleMax;
Paul Stewartff845fc2012-08-07 07:28:44 -0700342 static const int kMetricLinkMonitorResponseTimeSampleNumBuckets;
Paul Stewart0443aa52012-08-09 10:43:50 -0700343 static const char kMetricLinkMonitorSecondsToFailure[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700344 static const int kMetricLinkMonitorSecondsToFailureMin;
345 static const int kMetricLinkMonitorSecondsToFailureMax;
Paul Stewart0443aa52012-08-09 10:43:50 -0700346 static const int kMetricLinkMonitorSecondsToFailureNumBuckets;
347 static const char kMetricLinkMonitorBroadcastErrorsAtFailure[];
348 static const char kMetricLinkMonitorUnicastErrorsAtFailure[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700349 static const int kMetricLinkMonitorErrorCountMin;
350 static const int kMetricLinkMonitorErrorCountMax;
Paul Stewart0443aa52012-08-09 10:43:50 -0700351 static const int kMetricLinkMonitorErrorCountNumBuckets;
Paul Stewartff845fc2012-08-07 07:28:44 -0700352
Wade Guthried4977f22012-08-22 12:37:54 -0700353 static const char kMetricLinkClientDisconnectReason[];
354 static const char kMetricLinkApDisconnectReason[];
355 static const char kMetricLinkClientDisconnectType[];
356 static const char kMetricLinkApDisconnectType[];
357
Arman Uguray6d528f12012-09-13 13:44:55 -0700358 // Shill termination action statistics.
Arman Ugurayab22c162012-10-08 19:08:38 -0700359 static const char kMetricTerminationActionTimeOnTerminate[];
360 static const char kMetricTerminationActionResultOnTerminate[];
361 static const char kMetricTerminationActionTimeOnSuspend[];
362 static const char kMetricTerminationActionResultOnSuspend[];
363 static const int kMetricTerminationActionTimeMillisecondsMax;
364 static const int kMetricTerminationActionTimeMillisecondsMin;
Arman Uguray6d528f12012-09-13 13:44:55 -0700365
Paul Stewart85aea152013-01-22 09:31:56 -0800366 // WiFiService Entry Fixup.
367 static const char kMetricServiceFixupEntries[];
368
Thieu Le26fc01b2013-01-28 12:08:48 -0800369 // Cellular specific statistics.
Thieu Le7cf36b02013-01-30 17:15:56 -0800370 static const char kMetricCellularAutoConnectTries[];
371 static const int kMetricCellularAutoConnectTriesMax;
372 static const int kMetricCellularAutoConnectTriesMin;
373 static const int kMetricCellularAutoConnectTriesNumBuckets;
374 static const char kMetricCellularAutoConnectTotalTime[];
375 static const int kMetricCellularAutoConnectTotalTimeMax;
376 static const int kMetricCellularAutoConnectTotalTimeMin;
377 static const int kMetricCellularAutoConnectTotalTimeNumBuckets;
Thieu Le91fccf62013-04-22 15:23:16 -0700378 static const char kMetricCellularDrop[];
379 static const char kMetricCellularDropsPerHour[];
380 static const int kMetricCellularDropsPerHourMax;
381 static const int kMetricCellularDropsPerHourMin;
382 static const int kMetricCellularDropsPerHourNumBuckets;
383 static const char kMetricCellularFailureReason[];
384 static const char kMetricCellularOutOfCreditsReason[];
385 static const char kMetricCellularSignalStrengthBeforeDrop[];
386 static const int kMetricCellularSignalStrengthBeforeDropMax;
387 static const int kMetricCellularSignalStrengthBeforeDropMin;
388 static const int kMetricCellularSignalStrengthBeforeDropNumBuckets;
Thieu Le26fc01b2013-01-28 12:08:48 -0800389
Thieu Le5133b712013-02-19 14:47:21 -0800390 // Profile statistics.
391 static const char kMetricCorruptedProfile[];
392
Paul Stewart91a43cb2013-03-02 21:34:15 -0800393 // VPN connection statistics.
394 static const char kMetricVpnDriver[];
395 static const int kMetricVpnDriverMax;
396 static const char kMetricVpnRemoteAuthenticationType[];
397 static const int kMetricVpnRemoteAuthenticationTypeMax;
398 static const char kMetricVpnUserAuthenticationType[];
399 static const int kMetricVpnUserAuthenticationTypeMax;
400
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800401 explicit Metrics(EventDispatcher *dispatcher);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000402 virtual ~Metrics();
403
Thieu Le48e6d6d2011-12-06 00:40:27 +0000404 // Converts the WiFi frequency into the associated UMA channel enumerator.
405 static WiFiChannel WiFiFrequencyToChannel(uint16 frequency);
406
Thieu Lead1ec2c2012-01-05 23:39:48 +0000407 // Converts a flimflam security string into its UMA security enumerator.
408 static WiFiSecurity WiFiSecurityStringToEnum(const std::string &security);
409
Paul Stewart21f40962013-03-01 14:27:28 -0800410 // Converts a flimflam EAP outer protocol string into its UMA enumerator.
411 static EapOuterProtocol EapOuterProtocolStringToEnum(
412 const std::string &outer);
413
414 // Converts a flimflam EAP inner protocol string into its UMA enumerator.
415 static EapInnerProtocol EapInnerProtocolStringToEnum(
416 const std::string &inner);
417
Thieu Le85e050b2012-03-13 15:04:38 -0700418 // Converts portal detection result to UMA portal result enumerator.
419 static PortalResult PortalDetectionResultToEnum(
420 const PortalDetector::Result &result);
421
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800422 // Starts this object. Call this during initialization.
423 virtual void Start();
424
425 // Stops this object. Call this during cleanup.
426 virtual void Stop();
427
Thieu Le48e6d6d2011-12-06 00:40:27 +0000428 // Registers a service with this object so it can use the timers to track
429 // state transition metrics.
430 void RegisterService(const Service *service);
431
432 // Deregisters the service from this class. All state transition timers
433 // will be removed.
434 void DeregisterService(const Service *service);
435
436 // Tracks the time it takes |service| to go from |start_state| to
437 // |stop_state|. When |stop_state| is reached, the time is sent to UMA.
438 void AddServiceStateTransitionTimer(const Service *service,
439 const std::string &histogram_name,
440 Service::ConnectState start_state,
441 Service::ConnectState stop_state);
442
443 // Specializes |metric_name| for the specified |technology_id|.
444 std::string GetFullMetricName(const char *metric_name,
445 Technology::Identifier technology_id);
446
447 // Notifies this object that the default service has changed.
448 // |service| is the new default service.
Thieu Lea20cbc22012-01-09 22:01:43 +0000449 virtual void NotifyDefaultServiceChanged(const Service *service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000450
451 // Notifies this object that |service| state has changed.
452 virtual void NotifyServiceStateChanged(const Service *service,
453 Service::ConnectState new_state);
454
Thieu Le67370f62012-02-14 23:01:42 +0000455 // Notifies this object that |service| has been disconnected.
456 void NotifyServiceDisconnect(const Service *service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000457
Thieu Leb84ba342012-03-02 15:15:19 -0800458 // Notifies this object of a power management state change.
459 void NotifyPowerStateChange(PowerManager::SuspendState new_state);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000460
Arman Ugurayab22c162012-10-08 19:08:38 -0700461 // Notifies this object that termination actions started executing.
462 void NotifyTerminationActionsStarted(TerminationActionReason reason);
463
464 // Notifies this object that termination actions have been completed.
465 // |success| is true, if the termination actions completed successfully.
466 void NotifyTerminationActionsCompleted(
467 TerminationActionReason reason, bool success);
468
Paul Stewartff845fc2012-08-07 07:28:44 -0700469 // Notifies this object of a failure in LinkMonitor.
470 void NotifyLinkMonitorFailure(
Paul Stewart0443aa52012-08-09 10:43:50 -0700471 Technology::Identifier technology,
472 LinkMonitorFailure failure,
Paul Stewartf1961f82012-09-11 20:45:39 -0700473 int seconds_to_failure,
474 int broadcast_error_count,
475 int unicast_error_count);
Paul Stewartff845fc2012-08-07 07:28:44 -0700476
477 // Notifies this object that LinkMonitor has added a response time sample
478 // for |connection| with a value of |response_time_milliseconds|.
479 void NotifyLinkMonitorResponseTimeSampleAdded(
480 Technology::Identifier technology,
Paul Stewartf1961f82012-09-11 20:45:39 -0700481 int response_time_milliseconds);
Paul Stewartff845fc2012-08-07 07:28:44 -0700482
Wade Guthried4977f22012-08-22 12:37:54 -0700483 // Notifies this object of WiFi disconnect.
484 void Notify80211Disconnect(WiFiDisconnectByWhom by_whom,
485 IEEE_80211::WiFiReasonCode reason);
486
Thieu Lec8078a62013-01-22 18:01:12 -0800487 // Registers a device with this object so the device can use the timers to
488 // track state transition metrics.
489 void RegisterDevice(int interface_index,
490 Technology::Identifier technology);
491
Thieu Le9abd6742013-01-23 23:35:37 -0800492 // Checks to see if the device has already been registered.
493 bool IsDeviceRegistered(int interface_index,
494 Technology::Identifier technology);
495
Thieu Lec8078a62013-01-22 18:01:12 -0800496 // Deregisters the device from this class. All state transition timers
497 // will be removed.
498 void DeregisterDevice(int interface_index);
499
500 // Notifies this object that a device has been initialized.
501 void NotifyDeviceInitialized(int interface_index);
502
Thieu Lece4483e2013-01-23 15:12:03 -0800503 // Notifies this object that a device has started the enable process.
504 void NotifyDeviceEnableStarted(int interface_index);
505
506 // Notifies this object that a device has completed the enable process.
507 void NotifyDeviceEnableFinished(int interface_index);
508
Thieu Lea2519bf2013-01-23 16:51:54 -0800509 // Notifies this object that a device has started the disable process.
510 void NotifyDeviceDisableStarted(int interface_index);
511
512 // Notifies this object that a device has completed the disable process.
513 void NotifyDeviceDisableFinished(int interface_index);
514
Thieu Le18c11072013-01-28 17:21:37 -0800515 // Notifies this object that a device has started the scanning process.
Wade Guthrie44f290d2013-05-28 10:16:25 -0700516 virtual void NotifyDeviceScanStarted(int interface_index);
Thieu Le18c11072013-01-28 17:21:37 -0800517
518 // Notifies this object that a device has completed the scanning process.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700519 virtual void NotifyDeviceScanFinished(int interface_index);
Thieu Le18c11072013-01-28 17:21:37 -0800520
Wade Guthrie44f290d2013-05-28 10:16:25 -0700521 // Terminates an underay scan (does nothing if a scan wasn't underay).
522 void ResetScanTimer(int interface_index);
523
Thieu Lecdb5a212013-01-25 11:17:18 -0800524 // Notifies this object that a device has started the connect process.
Wade Guthrie44f290d2013-05-28 10:16:25 -0700525 virtual void NotifyDeviceConnectStarted(int interface_index,
526 bool is_auto_connecting);
Thieu Lecdb5a212013-01-25 11:17:18 -0800527
528 // Notifies this object that a device has completed the connect process.
Wade Guthrie44f290d2013-05-28 10:16:25 -0700529 virtual void NotifyDeviceConnectFinished(int interface_index);
530
531 // Resets both the connect_timer and the scan_connect_timer the timer (the
532 // latter so that a future connect will not erroneously be associated with
533 // the previous scan).
534 virtual void ResetConnectTimer(int interface_index);
Thieu Lecdb5a212013-01-25 11:17:18 -0800535
Thieu Le26fc01b2013-01-28 12:08:48 -0800536 // Notifies this object that a cellular device has been dropped by the
537 // network.
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800538 void NotifyCellularDeviceDrop(int interface_index,
539 const std::string &network_technology,
Thieu Le26fc01b2013-01-28 12:08:48 -0800540 uint16 signal_strength);
541
Thieu Leb7aa5f72013-01-31 15:57:48 -0800542 // Notifies this object about a cellular device failure code.
543 void NotifyCellularDeviceFailure(const Error &error);
544
Thieu Le91fccf62013-04-22 15:23:16 -0700545 // Notifies this object that a cellular service has been marked as
546 // out-of-credits.
547 void NotifyCellularOutOfCredits(Metrics::CellularOutOfCreditsReason reason);
548
Thieu Le5133b712013-02-19 14:47:21 -0800549 // Notifies this object about a corrupted profile.
550 virtual void NotifyCorruptedProfile();
551
Thieu Le48e6d6d2011-12-06 00:40:27 +0000552 // Sends linear histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700553 virtual bool SendEnumToUMA(const std::string &name, int sample, int max);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000554
Thieu Lea20cbc22012-01-09 22:01:43 +0000555 // Send histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700556 virtual bool SendToUMA(const std::string &name, int sample, int min,
557 int max, int num_buckets);
Thieu Lea20cbc22012-01-09 22:01:43 +0000558
Thieu Le48e6d6d2011-12-06 00:40:27 +0000559 private:
Thieu Le48e6d6d2011-12-06 00:40:27 +0000560 friend class MetricsTest;
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800561 FRIEND_TEST(MetricsTest, CellularDropsPerHour);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000562 FRIEND_TEST(MetricsTest, FrequencyToChannel);
Wade Guthrie44f290d2013-05-28 10:16:25 -0700563 FRIEND_TEST(MetricsTest, ResetConnectTimer);
Thieu Leb84ba342012-03-02 15:15:19 -0800564 FRIEND_TEST(MetricsTest, ServiceFailure);
Thieu Lea20cbc22012-01-09 22:01:43 +0000565 FRIEND_TEST(MetricsTest, TimeOnlineTimeToDrop);
Thieu Leb84ba342012-03-02 15:15:19 -0800566 FRIEND_TEST(MetricsTest, TimeToConfig);
567 FRIEND_TEST(MetricsTest, TimeToOnline);
568 FRIEND_TEST(MetricsTest, TimeToPortal);
Thieu Le18c11072013-01-28 17:21:37 -0800569 FRIEND_TEST(MetricsTest, TimeToScanIgnore);
Thieu Leb84ba342012-03-02 15:15:19 -0800570 FRIEND_TEST(MetricsTest, WiFiServiceChannel);
571 FRIEND_TEST(MetricsTest, WiFiServicePostReady);
Gaurav Shah6d2c72d2012-10-16 16:30:44 -0700572 FRIEND_TEST(WiFiMainTest, GetGeolocationObjects);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000573
574 typedef ScopedVector<chromeos_metrics::TimerReporter> TimerReporters;
575 typedef std::list<chromeos_metrics::TimerReporter *> TimerReportersList;
576 typedef std::map<Service::ConnectState, TimerReportersList>
577 TimerReportersByState;
578 struct ServiceMetrics {
579 ServiceMetrics() : service(NULL) {}
580 // The service is registered/deregistered in the Service
581 // constructor/destructor, therefore there is no need to keep a ref count.
582 const Service *service;
583 // All TimerReporter objects are stored in |timers| which owns the objects.
584 // |start_on_state| and |stop_on_state| contain pointers to the
585 // TimerReporter objects and control when to start and stop the timers.
586 TimerReporters timers;
587 TimerReportersByState start_on_state;
588 TimerReportersByState stop_on_state;
589 };
590 typedef std::map<const Service *, std::tr1::shared_ptr<ServiceMetrics> >
591 ServiceMetricsLookupMap;
592
Thieu Lec8078a62013-01-22 18:01:12 -0800593 struct DeviceMetrics {
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800594 DeviceMetrics() : auto_connect_tries(0), num_drops(0) {}
Thieu Le9abd6742013-01-23 23:35:37 -0800595 Technology::Identifier technology;
Thieu Lec8078a62013-01-22 18:01:12 -0800596 scoped_ptr<chromeos_metrics::TimerReporter> initialization_timer;
Thieu Lece4483e2013-01-23 15:12:03 -0800597 scoped_ptr<chromeos_metrics::TimerReporter> enable_timer;
Thieu Lea2519bf2013-01-23 16:51:54 -0800598 scoped_ptr<chromeos_metrics::TimerReporter> disable_timer;
Thieu Le18c11072013-01-28 17:21:37 -0800599 scoped_ptr<chromeos_metrics::TimerReporter> scan_timer;
Thieu Lecdb5a212013-01-25 11:17:18 -0800600 scoped_ptr<chromeos_metrics::TimerReporter> connect_timer;
Wade Guthrie44f290d2013-05-28 10:16:25 -0700601 scoped_ptr<chromeos_metrics::TimerReporter> scan_connect_timer;
Thieu Le7cf36b02013-01-30 17:15:56 -0800602 scoped_ptr<chromeos_metrics::TimerReporter> auto_connect_timer;
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800603 int auto_connect_tries;
604 int num_drops;
Thieu Lec8078a62013-01-22 18:01:12 -0800605 };
606 typedef std::map<const int, std::tr1::shared_ptr<DeviceMetrics> >
607 DeviceMetricsLookupMap;
608
Thieu Le48e6d6d2011-12-06 00:40:27 +0000609 static const uint16 kWiFiBandwidth5MHz;
610 static const uint16 kWiFiBandwidth20MHz;
611 static const uint16 kWiFiFrequency2412;
612 static const uint16 kWiFiFrequency2472;
613 static const uint16 kWiFiFrequency2484;
614 static const uint16 kWiFiFrequency5170;
615 static const uint16 kWiFiFrequency5180;
616 static const uint16 kWiFiFrequency5230;
617 static const uint16 kWiFiFrequency5240;
618 static const uint16 kWiFiFrequency5320;
619 static const uint16 kWiFiFrequency5500;
620 static const uint16 kWiFiFrequency5700;
621 static const uint16 kWiFiFrequency5745;
622 static const uint16 kWiFiFrequency5825;
623
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800624 static const int kHourlyTimeoutMilliseconds;
625
Thieu Le48e6d6d2011-12-06 00:40:27 +0000626 void InitializeCommonServiceMetrics(const Service *service);
627 void UpdateServiceStateTransitionMetrics(ServiceMetrics *service_metrics,
628 Service::ConnectState new_state);
629 void SendServiceFailure(const Service *service);
630
Wade Guthrie60a37062013-04-02 11:39:09 -0700631 DeviceMetrics *GetDeviceMetrics(int interface_index) const;
Thieu Le7cf36b02013-01-30 17:15:56 -0800632 void AutoConnectMetricsReset(DeviceMetrics *device_metrics);
Thieu Lece4483e2013-01-23 15:12:03 -0800633
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800634 void HourlyTimeoutHandler();
635
Thieu Le48e6d6d2011-12-06 00:40:27 +0000636 // For unit test purposes.
637 void set_library(MetricsLibraryInterface *library);
Thieu Lea20cbc22012-01-09 22:01:43 +0000638 void set_time_online_timer(chromeos_metrics::Timer *timer) {
639 time_online_timer_.reset(timer); // Passes ownership
640 }
641 void set_time_to_drop_timer(chromeos_metrics::Timer *timer) {
642 time_to_drop_timer_.reset(timer); // Passes ownership
643 }
Thieu Leb84ba342012-03-02 15:15:19 -0800644 void set_time_resume_to_ready_timer(chromeos_metrics::Timer *timer) {
645 time_resume_to_ready_timer_.reset(timer); // Passes ownership
646 }
Arman Ugurayab22c162012-10-08 19:08:38 -0700647 void set_time_termination_actions_timer(
648 chromeos_metrics::Timer *timer) {
649 time_termination_actions_timer.reset(timer); // Passes ownership
650 }
Thieu Le18c11072013-01-28 17:21:37 -0800651 void set_time_to_scan_timer(int interface_index,
652 chromeos_metrics::TimerReporter *timer) {
653 DeviceMetrics *device_metrics = GetDeviceMetrics(interface_index);
654 device_metrics->scan_timer.reset(timer); // Passes ownership
655 }
Wade Guthrie44f290d2013-05-28 10:16:25 -0700656 void set_time_to_connect_timer(int interface_index,
657 chromeos_metrics::TimerReporter *timer) {
658 DeviceMetrics *device_metrics = GetDeviceMetrics(interface_index);
659 device_metrics->connect_timer.reset(timer); // Passes ownership
660 }
661 void set_time_to_scan_connect_timer(int interface_index,
662 chromeos_metrics::TimerReporter *timer) {
663 DeviceMetrics *device_metrics = GetDeviceMetrics(interface_index);
664 device_metrics->scan_connect_timer.reset(timer); // Passes ownership
665 }
Thieu Le48e6d6d2011-12-06 00:40:27 +0000666
667 // |library_| points to |metrics_library_| when shill runs normally.
668 // However, in order to allow for unit testing, we point |library_| to a
669 // MetricsLibraryMock object instead.
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800670 EventDispatcher *dispatcher_;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000671 MetricsLibrary metrics_library_;
672 MetricsLibraryInterface *library_;
673 ServiceMetricsLookupMap services_metrics_;
Thieu Lea20cbc22012-01-09 22:01:43 +0000674 Technology::Identifier last_default_technology_;
675 bool was_online_;
676 scoped_ptr<chromeos_metrics::Timer> time_online_timer_;
677 scoped_ptr<chromeos_metrics::Timer> time_to_drop_timer_;
Thieu Leb84ba342012-03-02 15:15:19 -0800678 scoped_ptr<chromeos_metrics::Timer> time_resume_to_ready_timer_;
Arman Ugurayab22c162012-10-08 19:08:38 -0700679 scoped_ptr<chromeos_metrics::Timer> time_termination_actions_timer;
Darin Petkov58f0b6d2012-06-12 12:52:30 +0200680 bool collect_bootstats_;
Thieu Lec8078a62013-01-22 18:01:12 -0800681 DeviceMetricsLookupMap devices_metrics_;
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800682 base::CancelableClosure hourly_timeout_handler_;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000683
684 DISALLOW_COPY_AND_ASSIGN(Metrics);
685};
686
687} // namespace shill
688
Wade Guthrie60a37062013-04-02 11:39:09 -0700689#endif // SHILL_METRICS_H_