shill: DHCPClient: Output status metrics

Output metrics about the DHCP client status whenever this state
changes.  This will allow us track aggregate activity so we can
track the efficacy of the various DHCP client features.

BUG=chromium:384897
TEST=Unit tests + manual: restart shill and browse to chrome://histograms

Change-Id: I8e9628243c8b9b6e8bd0270e86795737a2f75846
Reviewed-on: https://chromium-review.googlesource.com/208825
Reviewed-by: Peter Qiu <zqiu@chromium.org>
Commit-Queue: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/metrics.h b/metrics.h
index 5e2a33b..71a5762 100644
--- a/metrics.h
+++ b/metrics.h
@@ -312,6 +312,26 @@
     kUserInitiatedConnectionFailureReasonMax
   };
 
+  enum DhcpClientStatus {
+    kDhcpClientStatusArpGateway = 1,
+    kDhcpClientStatusArpSelf = 2,
+    kDhcpClientStatusBound = 3,
+    kDhcpClientStatusDiscover = 4,
+    kDhcpClientStatusIgnoreDuplicateOffer = 5,
+    kDhcpClientStatusIgnoreFailedOffer = 6,
+    kDhcpClientStatusIgnoreInvalidOffer = 7,
+    kDhcpClientStatusIgnoreNonOffer = 8,
+    kDhcpClientStatusInform = 9,
+    kDhcpClientStatusInit = 10,
+    kDhcpClientStatusNakDefer = 11,
+    kDhcpClientStatusRebind = 12,
+    kDhcpClientStatusReboot = 13,
+    kDhcpClientStatusRelease = 14,
+    kDhcpClientStatusRenew = 15,
+    kDhcpClientStatusRequest = 16,
+    kDhcpClientStatusMax
+  };
+
   static const char kMetricDisconnectSuffix[];
   static const int kMetricDisconnectMax;
   static const int kMetricDisconnectMin;
@@ -519,6 +539,9 @@
   // Device's connection status.
   static const char kMetricDeviceConnectionStatus[];
 
+  // DHCP client status.
+  static const char kMetricDhcpClientStatus[];
+
   explicit Metrics(EventDispatcher *dispatcher);
   virtual ~Metrics();
 
@@ -719,6 +742,9 @@
   // Notifies this object about current connection status (online vs offline).
   virtual void NotifyDeviceConnectionStatus(Metrics::ConnectionStatus status);
 
+  // Notifies this object about the DHCP client status.
+  virtual void NotifyDhcpClientStatus(Metrics::DhcpClientStatus status);
+
   // Sends linear histogram data to UMA.
   virtual bool SendEnumToUMA(const std::string &name, int sample, int max);