shill: Add support to set physical mode.

BUG=chromium-os:24776
TEST=Unit tests, network_WiFiManager

Change-Id: Ic46404e71dbb54a06a7d668992a96df9f8db2598
Reviewed-on: https://gerrit.chromium.org/gerrit/15765
Commit-Ready: Thieu Le <thieule@chromium.org>
Reviewed-by: Thieu Le <thieule@chromium.org>
Tested-by: Thieu Le <thieule@chromium.org>
diff --git a/wifi_endpoint.h b/wifi_endpoint.h
index 2bca474..4de7a15 100644
--- a/wifi_endpoint.h
+++ b/wifi_endpoint.h
@@ -16,6 +16,7 @@
 
 #include "shill/endpoint.h"
 #include "shill/event_dispatcher.h"
+#include "shill/metrics.h"
 
 namespace shill {
 
@@ -35,6 +36,7 @@
   const std::string &bssid_hex() const;
   int16_t signal_strength() const;
   uint16 frequency() const;
+  uint16 physical_mode() const;
   const std::string &network_mode() const;
   const std::string &security_mode() const;
 
@@ -47,6 +49,7 @@
   FRIEND_TEST(WiFiEndpointTest, ParseKeyManagementMethodsEAP);
   FRIEND_TEST(WiFiEndpointTest, ParseKeyManagementMethodsPSK);
   FRIEND_TEST(WiFiEndpointTest, ParseKeyManagementMethodsEAPAndPSK);
+  FRIEND_TEST(WiFiEndpointTest, DeterminePhyMode);
 
   enum KeyManagement {
     kKeyManagement802_1x,
@@ -68,6 +71,15 @@
   static void ParseKeyManagementMethods(
       const std::map<std::string, ::DBus::Variant> &security_method_properties,
       std::set<KeyManagement> *key_management_methods);
+  // Determine the negotiated operating mode for the channel by looking at
+  // the information elements, frequency and data rates.  The information
+  // elements and data rates live in |properties|.
+  static Metrics::WiFiNetworkPhyMode DeterminePhyMode(
+      const std::map<std::string, ::DBus::Variant> &properties,
+      uint16 frequency);
+  // Parse information elements to determine the physical mode.
+  static Metrics::WiFiNetworkPhyMode ParseIEsForPhyMode(
+      const std::vector<uint8_t> &ies);
 
   // TODO(quiche): make const?
   std::vector<uint8_t> ssid_;
@@ -78,6 +90,7 @@
   std::string bssid_hex_;
   int16_t signal_strength_;
   uint16 frequency_;
+  uint16 physical_mode_;
   // network_mode_ and security_mode_ are represented as flimflam names
   // (not necessarily the same as wpa_supplicant names)
   std::string network_mode_;