| Index: chrome/browser/metrics/network_metrics_provider.cc
|
| diff --git a/chrome/browser/metrics/network_metrics_provider.cc b/chrome/browser/metrics/network_metrics_provider.cc
|
| index 006e1a706acee1cc184b7d0020d4ffe9e49893f5..d104da8c93ed6b05df76e1e903e0187d5f217ddc 100644
|
| --- a/chrome/browser/metrics/network_metrics_provider.cc
|
| +++ b/chrome/browser/metrics/network_metrics_provider.cc
|
| @@ -5,6 +5,10 @@
|
| #include "chrome/browser/metrics/network_metrics_provider.h"
|
|
|
| #include "base/compiler_specific.h"
|
| +#include "base/strings/string_number_conversions.h"
|
| +#include "base/strings/string_split.h"
|
| +#include "base/strings/string_util.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| #include "base/task_runner_util.h"
|
| #include "base/threading/sequenced_worker_pool.h"
|
| #include "content/public/browser/browser_thread.h"
|
| @@ -39,6 +43,12 @@ void NetworkMetricsProvider::ProvideSystemProfileMetrics(
|
| // TODO(isherman): This line seems unnecessary.
|
| connection_type_ = net::NetworkChangeNotifier::GetConnectionType();
|
| wifi_phy_layer_protocol_is_ambiguous_ = false;
|
| +
|
| + // Connected wifi AP information.
|
| + net::NetworkChangeNotifier::WifiApInfo info;
|
| + if (net::NetworkChangeNotifier::GetWifiApInfo(info)) {
|
| + WriteWifiApProto(network, &info);
|
| + }
|
| }
|
|
|
| void NetworkMetricsProvider::OnConnectionTypeChanged(
|
| @@ -114,3 +124,61 @@ void NetworkMetricsProvider::OnWifiPHYLayerProtocolResult(
|
| }
|
| wifi_phy_layer_protocol_ = mode;
|
| }
|
| +
|
| +void NetworkMetricsProvider::WriteWifiApProto(
|
| + SystemProfileProto::Network *network_proto,
|
| + const net::NetworkChangeNotifier::WifiApInfo *info) {
|
| + SystemProfileProto::Network::WifiAp* ap_info =
|
| + network_proto->mutable_ap_info();
|
| +
|
| + // |bssid| is xx:xx:xx:xx:xx:xx, extract the first three components and
|
| + // pack into a uint32.
|
| + std::string bssid = info->bssid;
|
| + if (bssid.size() > 9 && bssid[2] == ':' && bssid[5] == ':' &&
|
| + bssid[8] == ':') {
|
| + std::string vendor_prefix_str;
|
| + uint32 vendor_prefix;
|
| +
|
| + base::RemoveChars(bssid.substr(0, 9), ":", &vendor_prefix_str);
|
| + DCHECK_EQ(6U, vendor_prefix_str.size());
|
| + base::HexStringToUInt(vendor_prefix_str, &vendor_prefix);
|
| +
|
| + ap_info->set_vendor_prefix(vendor_prefix);
|
| + }
|
| + if (!info->security.empty()) {
|
| + ap_info->set_security_mode(info->security);
|
| + }
|
| +
|
| + // Fill in vendor information if it is provided.
|
| + if (!info->model_number.empty() || !info->model_name.empty() ||
|
| + !info->device_name.empty() || !info->manufacturer.empty() ||
|
| + !info->oui_list.empty()) {
|
| + SystemProfileProto::Network::WifiAp::VendorInformation *vendor_info =
|
| + ap_info->mutable_vendor_info();
|
| + if (!info->model_number.empty()) {
|
| + vendor_info->set_model_number(info->model_number);
|
| + }
|
| + if (!info->model_name.empty()) {
|
| + vendor_info->set_model_name(info->model_name);
|
| + }
|
| + if (!info->device_name.empty()) {
|
| + vendor_info->set_device_name(info->device_name);
|
| + }
|
| + if (!info->manufacturer.empty()) {
|
| + vendor_info->set_manufacturer(info->manufacturer);
|
| + }
|
| +
|
| + // Parse OUI list.
|
| + if (!info->oui_list.empty()) {
|
| + std::vector<std::string> oui_list;
|
| + base::SplitString(info->oui_list, ' ', &oui_list);
|
| + for (std::vector<std::string>::const_iterator i = oui_list.begin();
|
| + i != oui_list.end();
|
| + ++i) {
|
| + uint32 oui;
|
| + base::HexStringToUInt(*i, &oui);
|
| + vendor_info->add_oui(oui);
|
| + }
|
| + }
|
| + }
|
| +}
|
|
|