shill: Exposing wifi disconnect reason to UMA.

This change provides UMA with a reason for each WiFi deauthentication
that occurs.  These values are extracted from the deauthentication
message that we get from the mac80211 drivers in the kernel (because
we've asked that driver to send us events).

BUG=chromium-os:33637,26854
TEST=Manual (disconnected in various ways and verified with UMA).  Ran
shill unit tests.

Change-Id: I630ffbba02b40484fc3c6b20e444e71093cfce65
Reviewed-on: https://gerrit.chromium.org/gerrit/31475
Commit-Ready: Wade Guthrie <wdg@chromium.org>
Reviewed-by: Wade Guthrie <wdg@chromium.org>
Tested-by: Wade Guthrie <wdg@chromium.org>
diff --git a/metrics.h b/metrics.h
index 9e7ea0e..a433dd8 100644
--- a/metrics.h
+++ b/metrics.h
@@ -11,6 +11,7 @@
 #include <metrics/metrics_library.h>
 #include <metrics/timer.h>
 
+#include "shill/ieee80211.h"
 #include "shill/portal_detector.h"
 #include "shill/power_manager.h"
 #include "shill/refptr_types.h"
@@ -125,6 +126,19 @@
     kLinkMonitorFailureMax
   };
 
+  enum WiFiStatusType {
+    kStatusCodeTypeByAp,
+    kStatusCodeTypeByClient,
+    kStatusCodeTypeByUser,
+    kStatusCodeTypeConsideredDead,
+    kStatusCodeTypeMax
+  };
+
+  enum WiFiDisconnectByWhom {
+    kDisconnectedByAp,
+    kDisconnectedNotByAp
+  };
+
   static const char kMetricDisconnect[];
   static const int kMetricDisconnectMax;
   static const int kMetricDisconnectMin;
@@ -190,6 +204,11 @@
   static const unsigned int kMetricLinkMonitorErrorCountMax;
   static const int kMetricLinkMonitorErrorCountNumBuckets;
 
+  static const char kMetricLinkClientDisconnectReason[];
+  static const char kMetricLinkApDisconnectReason[];
+  static const char kMetricLinkClientDisconnectType[];
+  static const char kMetricLinkApDisconnectType[];
+
   Metrics();
   virtual ~Metrics();
 
@@ -250,6 +269,10 @@
       Technology::Identifier technology,
       unsigned int response_time_milliseconds);
 
+  // Notifies this object of WiFi disconnect.
+  void Notify80211Disconnect(WiFiDisconnectByWhom by_whom,
+                             IEEE_80211::WiFiReasonCode reason);
+
   // Sends linear histogram data to UMA.
   virtual bool SendEnumToUMA(const std::string &name, int sample, int max);