blob: a6c8cf81a62f417b566e90f25ca39d29a2551587 [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
5#ifndef SHILL_METRICS_
6#define SHILL_METRICS_
7
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
Wade Guthried4977f22012-08-22 12:37:54 -070014#include "shill/ieee80211.h"
Thieu Le85e050b2012-03-13 15:04:38 -070015#include "shill/portal_detector.h"
Thieu Leb84ba342012-03-02 15:15:19 -080016#include "shill/power_manager.h"
Thieu Le48e6d6d2011-12-06 00:40:27 +000017#include "shill/refptr_types.h"
18#include "shill/service.h"
19
20namespace shill {
21
22class WiFiService;
23
24class Metrics {
25 public:
26 enum WiFiChannel {
27 kWiFiChannelUndef = 0,
28 kWiFiChannel2412 = 1,
29 kWiFiChannel2417 = 2,
30 kWiFiChannel2422 = 3,
31 kWiFiChannel2427 = 4,
32 kWiFiChannel2432 = 5,
33 kWiFiChannel2437 = 6,
34 kWiFiChannel2442 = 7,
35 kWiFiChannel2447 = 8,
36 kWiFiChannel2452 = 9,
37 kWiFiChannel2457 = 10,
38 kWiFiChannel2462 = 11,
39 kWiFiChannel2467 = 12,
40 kWiFiChannel2472 = 13,
41 kWiFiChannel2484 = 14,
42
43 kWiFiChannel5180 = 15,
44 kWiFiChannel5200 = 16,
45 kWiFiChannel5220 = 17,
46 kWiFiChannel5240 = 18,
47 kWiFiChannel5260 = 19,
48 kWiFiChannel5280 = 20,
49 kWiFiChannel5300 = 21,
50 kWiFiChannel5320 = 22,
51
52 kWiFiChannel5500 = 23,
53 kWiFiChannel5520 = 24,
54 kWiFiChannel5540 = 25,
55 kWiFiChannel5560 = 26,
56 kWiFiChannel5580 = 27,
57 kWiFiChannel5600 = 28,
58 kWiFiChannel5620 = 29,
59 kWiFiChannel5640 = 30,
60 kWiFiChannel5660 = 31,
61 kWiFiChannel5680 = 32,
62 kWiFiChannel5700 = 33,
63
64 kWiFiChannel5745 = 34,
65 kWiFiChannel5765 = 35,
66 kWiFiChannel5785 = 36,
67 kWiFiChannel5805 = 37,
68 kWiFiChannel5825 = 38,
69
70 kWiFiChannel5170 = 39,
71 kWiFiChannel5190 = 40,
72 kWiFiChannel5210 = 41,
73 kWiFiChannel5230 = 42,
74
75 /* NB: ignore old 11b bands 2312..2372 and 2512..2532 */
76 /* NB: ignore regulated bands 4920..4980 and 5020..5160 */
77 kWiFiChannelMax
78 };
79
Thieu Lead1ec2c2012-01-05 23:39:48 +000080 enum WiFiNetworkPhyMode {
81 kWiFiNetworkPhyModeUndef = 0, // Unknown/undefined
82 kWiFiNetworkPhyMode11a = 1, // 802.11a
83 kWiFiNetworkPhyMode11b = 2, // 802.11b
84 kWiFiNetworkPhyMode11g = 3, // 802.11g
85 kWiFiNetworkPhyMode11n = 4, // 802.11n
86 kWiFiNetworkPhyModeHalf = 5, // PSB Half-width
87 kWiFiNetworkPhyModeQuarter = 6, // PSB Quarter-width
88 kWiFiNetworkPhyModeTurbo = 7, // Atheros Turbo mode
89
90 kWiFiNetworkPhyModeMax
91 };
92
93 enum WiFiSecurity {
94 kWiFiSecurityUnknown = 0,
95 kWiFiSecurityNone = 1,
96 kWiFiSecurityWep = 2,
97 kWiFiSecurityWpa = 3,
98 kWiFiSecurityRsn = 4,
99 kWiFiSecurity8021x = 5,
100 kWiFiSecurityPsk = 6,
101
102 kWiFiSecurityMax
103 };
104
Thieu Le85e050b2012-03-13 15:04:38 -0700105 enum PortalResult {
106 kPortalResultSuccess = 0,
107 kPortalResultDNSFailure = 1,
108 kPortalResultDNSTimeout = 2,
109 kPortalResultConnectionFailure = 3,
110 kPortalResultConnectionTimeout = 4,
111 kPortalResultHTTPFailure = 5,
112 kPortalResultHTTPTimeout = 6,
113 kPortalResultContentFailure = 7,
114 kPortalResultContentTimeout = 8,
115 kPortalResultUnknown = 9,
116
117 kPortalResultMax
118 };
119
Paul Stewartff845fc2012-08-07 07:28:44 -0700120 enum LinkMonitorFailure {
121 kLinkMonitorMacAddressNotFound = 0,
122 kLinkMonitorClientStartFailure = 1,
123 kLinkMonitorTransmitFailure = 2,
124 kLinkMonitorFailureThresholdReached = 3,
125
126 kLinkMonitorFailureMax
127 };
128
Wade Guthried4977f22012-08-22 12:37:54 -0700129 enum WiFiStatusType {
130 kStatusCodeTypeByAp,
131 kStatusCodeTypeByClient,
132 kStatusCodeTypeByUser,
133 kStatusCodeTypeConsideredDead,
134 kStatusCodeTypeMax
135 };
136
137 enum WiFiDisconnectByWhom {
138 kDisconnectedByAp,
139 kDisconnectedNotByAp
140 };
141
Arman Uguray6d528f12012-09-13 13:44:55 -0700142 enum TerminationActionResult {
Arman Ugurayab22c162012-10-08 19:08:38 -0700143 kTerminationActionResultSuccess,
144 kTerminationActionResultFailure,
Arman Uguray6d528f12012-09-13 13:44:55 -0700145 kTerminationActionResultMax
146 };
147
Arman Ugurayab22c162012-10-08 19:08:38 -0700148 enum TerminationActionReason {
149 kTerminationActionReasonSuspend,
150 kTerminationActionReasonTerminate
151 };
152
Thieu Le67370f62012-02-14 23:01:42 +0000153 static const char kMetricDisconnect[];
154 static const int kMetricDisconnectMax;
155 static const int kMetricDisconnectMin;
156 static const int kMetricDisconnectNumBuckets;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000157 static const char kMetricNetworkChannel[];
158 static const int kMetricNetworkChannelMax;
Thieu Lead1ec2c2012-01-05 23:39:48 +0000159 static const char kMetricNetworkPhyMode[];
160 static const int kMetricNetworkPhyModeMax;
161 static const char kMetricNetworkSecurity[];
162 static const int kMetricNetworkSecurityMax;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000163 static const char kMetricNetworkServiceErrors[];
164 static const int kMetricNetworkServiceErrorsMax;
Paul Stewart23b393a2012-09-25 21:21:06 -0700165 static const char kMetricNetworkSignalStrength[];
166 static const int kMetricNetworkSignalStrengthMin;
167 static const int kMetricNetworkSignalStrengthMax;
168 static const int kMetricNetworkSignalStrengthNumBuckets;
Thieu Lea20cbc22012-01-09 22:01:43 +0000169 static const char kMetricTimeOnlineSeconds[];
170 static const int kMetricTimeOnlineSecondsMax;
171 static const int kMetricTimeOnlineSecondsMin;
172 static const int kMetricTimeOnlineSecondsNumBuckets;
Thieu Leb84ba342012-03-02 15:15:19 -0800173 static const char kMetricTimeResumeToReadyMilliseconds[];
Thieu Le48e6d6d2011-12-06 00:40:27 +0000174 static const char kMetricTimeToConfigMilliseconds[];
Thieu Lea20cbc22012-01-09 22:01:43 +0000175 static const char kMetricTimeToDropSeconds[];
176 static const int kMetricTimeToDropSecondsMax;
177 static const int kMetricTimeToDropSecondsMin;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000178 static const char kMetricTimeToJoinMilliseconds[];
179 static const char kMetricTimeToOnlineMilliseconds[];
180 static const char kMetricTimeToPortalMilliseconds[];
Thieu Lea20cbc22012-01-09 22:01:43 +0000181 static const int kTimerHistogramMillisecondsMax;
182 static const int kTimerHistogramMillisecondsMin;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000183 static const int kTimerHistogramNumBuckets;
184
Thieu Le85e050b2012-03-13 15:04:38 -0700185 // The number of portal detections attempted for each pass.
186 // This includes both failure/timeout attempts and successful attempt
187 // (if any).
188 static const char kMetricPortalAttempts[];
189 static const int kMetricPortalAttemptsMax;
190 static const int kMetricPortalAttemptsMin;
191 static const int kMetricPortalAttemptsNumBuckets;
192
193 // The total number of portal detections attempted between the Connected
194 // state and the Online state. This includes both failure/timeout attempts
195 // and the final successful attempt.
196 static const char kMetricPortalAttemptsToOnline[];
197 static const int kMetricPortalAttemptsToOnlineMax;
198 static const int kMetricPortalAttemptsToOnlineMin;
199 static const int kMetricPortalAttemptsToOnlineNumBuckets;
200
201 // The result of the portal detection.
202 static const char kMetricPortalResult[];
203
Thieu Leb84ba342012-03-02 15:15:19 -0800204 static const char kMetricPowerManagerKey[];
205
Paul Stewartff845fc2012-08-07 07:28:44 -0700206 // LinkMonitor statistics.
207 static const char kMetricLinkMonitorFailure[];
208 static const char kMetricLinkMonitorResponseTimeSample[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700209 static const int kMetricLinkMonitorResponseTimeSampleMin;
210 static const int kMetricLinkMonitorResponseTimeSampleMax;
Paul Stewartff845fc2012-08-07 07:28:44 -0700211 static const int kMetricLinkMonitorResponseTimeSampleNumBuckets;
Paul Stewart0443aa52012-08-09 10:43:50 -0700212 static const char kMetricLinkMonitorSecondsToFailure[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700213 static const int kMetricLinkMonitorSecondsToFailureMin;
214 static const int kMetricLinkMonitorSecondsToFailureMax;
Paul Stewart0443aa52012-08-09 10:43:50 -0700215 static const int kMetricLinkMonitorSecondsToFailureNumBuckets;
216 static const char kMetricLinkMonitorBroadcastErrorsAtFailure[];
217 static const char kMetricLinkMonitorUnicastErrorsAtFailure[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700218 static const int kMetricLinkMonitorErrorCountMin;
219 static const int kMetricLinkMonitorErrorCountMax;
Paul Stewart0443aa52012-08-09 10:43:50 -0700220 static const int kMetricLinkMonitorErrorCountNumBuckets;
Paul Stewartff845fc2012-08-07 07:28:44 -0700221
Wade Guthried4977f22012-08-22 12:37:54 -0700222 static const char kMetricLinkClientDisconnectReason[];
223 static const char kMetricLinkApDisconnectReason[];
224 static const char kMetricLinkClientDisconnectType[];
225 static const char kMetricLinkApDisconnectType[];
226
Arman Uguray6d528f12012-09-13 13:44:55 -0700227 // Shill termination action statistics.
Arman Ugurayab22c162012-10-08 19:08:38 -0700228 static const char kMetricTerminationActionTimeOnTerminate[];
229 static const char kMetricTerminationActionResultOnTerminate[];
230 static const char kMetricTerminationActionTimeOnSuspend[];
231 static const char kMetricTerminationActionResultOnSuspend[];
232 static const int kMetricTerminationActionTimeMillisecondsMax;
233 static const int kMetricTerminationActionTimeMillisecondsMin;
Arman Uguray6d528f12012-09-13 13:44:55 -0700234
Thieu Le3426c8f2012-01-11 17:35:11 -0800235 Metrics();
Thieu Le48e6d6d2011-12-06 00:40:27 +0000236 virtual ~Metrics();
237
Thieu Le48e6d6d2011-12-06 00:40:27 +0000238 // Converts the WiFi frequency into the associated UMA channel enumerator.
239 static WiFiChannel WiFiFrequencyToChannel(uint16 frequency);
240
Thieu Lead1ec2c2012-01-05 23:39:48 +0000241 // Converts a flimflam security string into its UMA security enumerator.
242 static WiFiSecurity WiFiSecurityStringToEnum(const std::string &security);
243
Thieu Le85e050b2012-03-13 15:04:38 -0700244 // Converts portal detection result to UMA portal result enumerator.
245 static PortalResult PortalDetectionResultToEnum(
246 const PortalDetector::Result &result);
247
Thieu Le48e6d6d2011-12-06 00:40:27 +0000248 // Registers a service with this object so it can use the timers to track
249 // state transition metrics.
250 void RegisterService(const Service *service);
251
252 // Deregisters the service from this class. All state transition timers
253 // will be removed.
254 void DeregisterService(const Service *service);
255
256 // Tracks the time it takes |service| to go from |start_state| to
257 // |stop_state|. When |stop_state| is reached, the time is sent to UMA.
258 void AddServiceStateTransitionTimer(const Service *service,
259 const std::string &histogram_name,
260 Service::ConnectState start_state,
261 Service::ConnectState stop_state);
262
263 // Specializes |metric_name| for the specified |technology_id|.
264 std::string GetFullMetricName(const char *metric_name,
265 Technology::Identifier technology_id);
266
267 // Notifies this object that the default service has changed.
268 // |service| is the new default service.
Thieu Lea20cbc22012-01-09 22:01:43 +0000269 virtual void NotifyDefaultServiceChanged(const Service *service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000270
271 // Notifies this object that |service| state has changed.
272 virtual void NotifyServiceStateChanged(const Service *service,
273 Service::ConnectState new_state);
274
Thieu Le67370f62012-02-14 23:01:42 +0000275 // Notifies this object that |service| has been disconnected.
276 void NotifyServiceDisconnect(const Service *service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000277
Thieu Leb84ba342012-03-02 15:15:19 -0800278 // Notifies this object of a power management state change.
279 void NotifyPowerStateChange(PowerManager::SuspendState new_state);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000280
Arman Ugurayab22c162012-10-08 19:08:38 -0700281 // Notifies this object that termination actions started executing.
282 void NotifyTerminationActionsStarted(TerminationActionReason reason);
283
284 // Notifies this object that termination actions have been completed.
285 // |success| is true, if the termination actions completed successfully.
286 void NotifyTerminationActionsCompleted(
287 TerminationActionReason reason, bool success);
288
Paul Stewartff845fc2012-08-07 07:28:44 -0700289 // Notifies this object of a failure in LinkMonitor.
290 void NotifyLinkMonitorFailure(
Paul Stewart0443aa52012-08-09 10:43:50 -0700291 Technology::Identifier technology,
292 LinkMonitorFailure failure,
Paul Stewartf1961f82012-09-11 20:45:39 -0700293 int seconds_to_failure,
294 int broadcast_error_count,
295 int unicast_error_count);
Paul Stewartff845fc2012-08-07 07:28:44 -0700296
297 // Notifies this object that LinkMonitor has added a response time sample
298 // for |connection| with a value of |response_time_milliseconds|.
299 void NotifyLinkMonitorResponseTimeSampleAdded(
300 Technology::Identifier technology,
Paul Stewartf1961f82012-09-11 20:45:39 -0700301 int response_time_milliseconds);
Paul Stewartff845fc2012-08-07 07:28:44 -0700302
Wade Guthried4977f22012-08-22 12:37:54 -0700303 // Notifies this object of WiFi disconnect.
304 void Notify80211Disconnect(WiFiDisconnectByWhom by_whom,
305 IEEE_80211::WiFiReasonCode reason);
306
Thieu Le48e6d6d2011-12-06 00:40:27 +0000307 // Sends linear histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700308 virtual bool SendEnumToUMA(const std::string &name, int sample, int max);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000309
Thieu Lea20cbc22012-01-09 22:01:43 +0000310 // Send histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700311 virtual bool SendToUMA(const std::string &name, int sample, int min,
312 int max, int num_buckets);
Thieu Lea20cbc22012-01-09 22:01:43 +0000313
Thieu Le48e6d6d2011-12-06 00:40:27 +0000314 private:
Thieu Le48e6d6d2011-12-06 00:40:27 +0000315 friend class MetricsTest;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000316 FRIEND_TEST(MetricsTest, FrequencyToChannel);
Thieu Leb84ba342012-03-02 15:15:19 -0800317 FRIEND_TEST(MetricsTest, ServiceFailure);
Thieu Lea20cbc22012-01-09 22:01:43 +0000318 FRIEND_TEST(MetricsTest, TimeOnlineTimeToDrop);
Thieu Leb84ba342012-03-02 15:15:19 -0800319 FRIEND_TEST(MetricsTest, TimeToConfig);
320 FRIEND_TEST(MetricsTest, TimeToOnline);
321 FRIEND_TEST(MetricsTest, TimeToPortal);
322 FRIEND_TEST(MetricsTest, WiFiServiceChannel);
323 FRIEND_TEST(MetricsTest, WiFiServicePostReady);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000324
325 typedef ScopedVector<chromeos_metrics::TimerReporter> TimerReporters;
326 typedef std::list<chromeos_metrics::TimerReporter *> TimerReportersList;
327 typedef std::map<Service::ConnectState, TimerReportersList>
328 TimerReportersByState;
329 struct ServiceMetrics {
330 ServiceMetrics() : service(NULL) {}
331 // The service is registered/deregistered in the Service
332 // constructor/destructor, therefore there is no need to keep a ref count.
333 const Service *service;
334 // All TimerReporter objects are stored in |timers| which owns the objects.
335 // |start_on_state| and |stop_on_state| contain pointers to the
336 // TimerReporter objects and control when to start and stop the timers.
337 TimerReporters timers;
338 TimerReportersByState start_on_state;
339 TimerReportersByState stop_on_state;
340 };
341 typedef std::map<const Service *, std::tr1::shared_ptr<ServiceMetrics> >
342 ServiceMetricsLookupMap;
343
344 static const uint16 kWiFiBandwidth5MHz;
345 static const uint16 kWiFiBandwidth20MHz;
346 static const uint16 kWiFiFrequency2412;
347 static const uint16 kWiFiFrequency2472;
348 static const uint16 kWiFiFrequency2484;
349 static const uint16 kWiFiFrequency5170;
350 static const uint16 kWiFiFrequency5180;
351 static const uint16 kWiFiFrequency5230;
352 static const uint16 kWiFiFrequency5240;
353 static const uint16 kWiFiFrequency5320;
354 static const uint16 kWiFiFrequency5500;
355 static const uint16 kWiFiFrequency5700;
356 static const uint16 kWiFiFrequency5745;
357 static const uint16 kWiFiFrequency5825;
358
Thieu Le48e6d6d2011-12-06 00:40:27 +0000359 void InitializeCommonServiceMetrics(const Service *service);
360 void UpdateServiceStateTransitionMetrics(ServiceMetrics *service_metrics,
361 Service::ConnectState new_state);
362 void SendServiceFailure(const Service *service);
363
364 // For unit test purposes.
365 void set_library(MetricsLibraryInterface *library);
Thieu Lea20cbc22012-01-09 22:01:43 +0000366 void set_time_online_timer(chromeos_metrics::Timer *timer) {
367 time_online_timer_.reset(timer); // Passes ownership
368 }
369 void set_time_to_drop_timer(chromeos_metrics::Timer *timer) {
370 time_to_drop_timer_.reset(timer); // Passes ownership
371 }
Thieu Leb84ba342012-03-02 15:15:19 -0800372 void set_time_resume_to_ready_timer(chromeos_metrics::Timer *timer) {
373 time_resume_to_ready_timer_.reset(timer); // Passes ownership
374 }
Arman Ugurayab22c162012-10-08 19:08:38 -0700375 void set_time_termination_actions_timer(
376 chromeos_metrics::Timer *timer) {
377 time_termination_actions_timer.reset(timer); // Passes ownership
378 }
Thieu Le48e6d6d2011-12-06 00:40:27 +0000379
380 // |library_| points to |metrics_library_| when shill runs normally.
381 // However, in order to allow for unit testing, we point |library_| to a
382 // MetricsLibraryMock object instead.
383 MetricsLibrary metrics_library_;
384 MetricsLibraryInterface *library_;
385 ServiceMetricsLookupMap services_metrics_;
Thieu Lea20cbc22012-01-09 22:01:43 +0000386 Technology::Identifier last_default_technology_;
387 bool was_online_;
388 scoped_ptr<chromeos_metrics::Timer> time_online_timer_;
389 scoped_ptr<chromeos_metrics::Timer> time_to_drop_timer_;
Thieu Leb84ba342012-03-02 15:15:19 -0800390 scoped_ptr<chromeos_metrics::Timer> time_resume_to_ready_timer_;
Arman Ugurayab22c162012-10-08 19:08:38 -0700391 scoped_ptr<chromeos_metrics::Timer> time_termination_actions_timer;
Darin Petkov58f0b6d2012-06-12 12:52:30 +0200392 bool collect_bootstats_;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000393
394 DISALLOW_COPY_AND_ASSIGN(Metrics);
395};
396
397} // namespace shill
398
399#endif // SHILL_METRICS_