shill: Report failure reasons for user-initiated conenction attempts

When user-initiated connection attmpts failed, report the failure
reasons to UMA stats.

BUG=chromium:392965
TEST=unit tests, manual test
Manual Test
1. Manually connect a chrome device to an unknown hidden SSID.
2. Browse to "chrome://histograms", and make sure there is a histogram
   for "Network.Shill.WiFi.UserInitiatedConnectionFailureReason" with
   a hit for bucket 9 (Out-of-range).

Change-Id: Id051fc2c2bebf7cde4363e2e1716a4a7cc4fe948
Reviewed-on: https://chromium-review.googlesource.com/207617
Reviewed-by: Peter Qiu <zqiu@chromium.org>
Tested-by: Peter Qiu <zqiu@chromium.org>
Commit-Queue: Peter Qiu <zqiu@chromium.org>
diff --git a/metrics.h b/metrics.h
index 0086fed..5e2a33b 100644
--- a/metrics.h
+++ b/metrics.h
@@ -297,6 +297,21 @@
     kConnectionStatusMax
   };
 
+  enum UserInitiatedConnectionFailureReason {
+    kUserInitiatedConnectionFailureReasonUnknown = 0,
+    kUserInitiatedConnectionFailureReasonBadPassphrase = 1,
+    kUserInitiatedConnectionFailureReasonBadWEPKey = 2,
+    kUserInitiatedConnectionFailureReasonConnect = 3,
+    kUserInitiatedConnectionFailureReasonDHCP = 4,
+    kUserInitiatedConnectionFailureReasonDNSLookup = 5,
+    kUserInitiatedConnectionFailureReasonEAPAuthentication = 6,
+    kUserInitiatedConnectionFailureReasonEAPLocalTLS = 7,
+    kUserInitiatedConnectionFailureReasonEAPRemoteTLS = 8,
+    kUserInitiatedConnectionFailureReasonOutOfRange = 9,
+    kUserInitiatedConnectionFailureReasonPinMissing = 10,
+    kUserInitiatedConnectionFailureReasonMax
+  };
+
   static const char kMetricDisconnectSuffix[];
   static const int kMetricDisconnectMax;
   static const int kMetricDisconnectMin;
@@ -492,6 +507,9 @@
   // User-initiated wifi connection attempt result.
   static const char kMetricWifiUserInitiatedConnectionResult[];
 
+  // The reason of failed user-initiated wifi connection attempt.
+  static const char kMetricWifiUserInitiatedConnectionFailureReason[];
+
   // DNS test result.
   static const char kMetricFallbackDNSTestResultSuffix[];
 
@@ -678,6 +696,11 @@
   virtual void NotifyUserInitiatedConnectionResult(const std::string &name,
                                                    int result);
 
+  // Notifies this object about the reason of failed user-initiated connection
+  // attempt.
+  virtual void NotifyUserInitiatedConnectionFailureReason(
+      const std::string &name, const Service::ConnectFailure failure);
+
   // Notifies this object about a corrupted profile.
   virtual void NotifyCorruptedProfile();