1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/metrics/net/network_metrics_provider.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/strings/string_split.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/strings/string_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/task_runner_util.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(OS_CHROMEOS)
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/metrics/net/wifi_access_point_info_provider_chromeos.h"
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif // OS_CHROMEOS
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using metrics::SystemProfileProto;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciNetworkMetricsProvider::NetworkMetricsProvider(
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::TaskRunner* io_task_runner)
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : io_task_runner_(io_task_runner),
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      connection_type_is_ambiguous_(false),
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      wifi_phy_layer_protocol_is_ambiguous_(false),
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      wifi_phy_layer_protocol_(net::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN),
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      weak_ptr_factory_(this) {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_type_ = net::NetworkChangeNotifier::GetConnectionType();
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProbeWifiPHYLayerProtocol();
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkMetricsProvider::~NetworkMetricsProvider() {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid NetworkMetricsProvider::OnDidCreateMetricsLog() {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::NetworkChangeNotifier::LogOperatorCodeHistogram(
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::NetworkChangeNotifier::GetConnectionType());
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NetworkMetricsProvider::ProvideSystemProfileMetrics(
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SystemProfileProto* system_profile) {
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SystemProfileProto::Network* network = system_profile->mutable_network();
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  network->set_connection_type_is_ambiguous(connection_type_is_ambiguous_);
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  network->set_connection_type(GetConnectionType());
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  network->set_wifi_phy_layer_protocol_is_ambiguous(
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      wifi_phy_layer_protocol_is_ambiguous_);
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  network->set_wifi_phy_layer_protocol(GetWifiPHYLayerProtocol());
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Resets the "ambiguous" flags, since a new metrics log session has started.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_type_is_ambiguous_ = false;
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(isherman): This line seems unnecessary.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_type_ = net::NetworkChangeNotifier::GetConnectionType();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wifi_phy_layer_protocol_is_ambiguous_ = false;
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!wifi_access_point_info_provider_.get()) {
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(OS_CHROMEOS)
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    wifi_access_point_info_provider_.reset(
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        new WifiAccessPointInfoProviderChromeos());
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#else
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    wifi_access_point_info_provider_.reset(
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        new WifiAccessPointInfoProvider());
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif // OS_CHROMEOS
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Connected wifi access point information.
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  WifiAccessPointInfoProvider::WifiAccessPointInfo info;
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (wifi_access_point_info_provider_->GetInfo(&info))
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    WriteWifiAccessPointProto(info, network);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NetworkMetricsProvider::OnConnectionTypeChanged(
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::NetworkChangeNotifier::ConnectionType type) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type == net::NetworkChangeNotifier::CONNECTION_NONE)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type != connection_type_ &&
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      connection_type_ != net::NetworkChangeNotifier::CONNECTION_NONE) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_type_is_ambiguous_ = true;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_type_ = type;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProbeWifiPHYLayerProtocol();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SystemProfileProto::Network::ConnectionType
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkMetricsProvider::GetConnectionType() const {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (connection_type_) {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::NetworkChangeNotifier::CONNECTION_NONE:
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::NetworkChangeNotifier::CONNECTION_UNKNOWN:
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::CONNECTION_UNKNOWN;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::NetworkChangeNotifier::CONNECTION_ETHERNET:
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::CONNECTION_ETHERNET;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::NetworkChangeNotifier::CONNECTION_WIFI:
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::CONNECTION_WIFI;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::NetworkChangeNotifier::CONNECTION_2G:
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::CONNECTION_2G;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::NetworkChangeNotifier::CONNECTION_3G:
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::CONNECTION_3G;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::NetworkChangeNotifier::CONNECTION_4G:
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::CONNECTION_4G;
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case net::NetworkChangeNotifier::CONNECTION_BLUETOOTH:
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return SystemProfileProto::Network::CONNECTION_BLUETOOTH;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return SystemProfileProto::Network::CONNECTION_UNKNOWN;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SystemProfileProto::Network::WifiPHYLayerProtocol
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NetworkMetricsProvider::GetWifiPHYLayerProtocol() const {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (wifi_phy_layer_protocol_) {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::WIFI_PHY_LAYER_PROTOCOL_NONE:
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_NONE;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::WIFI_PHY_LAYER_PROTOCOL_ANCIENT:
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_ANCIENT;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::WIFI_PHY_LAYER_PROTOCOL_A:
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_A;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::WIFI_PHY_LAYER_PROTOCOL_B:
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_B;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::WIFI_PHY_LAYER_PROTOCOL_G:
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_G;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::WIFI_PHY_LAYER_PROTOCOL_N:
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_N;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN:
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NetworkMetricsProvider::ProbeWifiPHYLayerProtocol() {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PostTaskAndReplyWithResult(
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      io_task_runner_,
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&net::GetWifiPHYLayerProtocol),
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&NetworkMetricsProvider::OnWifiPHYLayerProtocolResult,
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NetworkMetricsProvider::OnWifiPHYLayerProtocolResult(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::WifiPHYLayerProtocol mode) {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (wifi_phy_layer_protocol_ != net::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN &&
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mode != wifi_phy_layer_protocol_) {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wifi_phy_layer_protocol_is_ambiguous_ = true;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wifi_phy_layer_protocol_ = mode;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void NetworkMetricsProvider::WriteWifiAccessPointProto(
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const WifiAccessPointInfoProvider::WifiAccessPointInfo& info,
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    SystemProfileProto::Network* network_proto) {
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SystemProfileProto::Network::WifiAccessPoint* access_point_info =
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      network_proto->mutable_access_point_info();
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SystemProfileProto::Network::WifiAccessPoint::SecurityMode security =
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      SystemProfileProto::Network::WifiAccessPoint::SECURITY_UNKNOWN;
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  switch (info.security) {
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case WifiAccessPointInfoProvider::WIFI_SECURITY_NONE:
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      security = SystemProfileProto::Network::WifiAccessPoint::SECURITY_NONE;
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      break;
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case WifiAccessPointInfoProvider::WIFI_SECURITY_WPA:
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      security = SystemProfileProto::Network::WifiAccessPoint::SECURITY_WPA;
16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      break;
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case WifiAccessPointInfoProvider::WIFI_SECURITY_WEP:
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      security = SystemProfileProto::Network::WifiAccessPoint::SECURITY_WEP;
16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      break;
16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case WifiAccessPointInfoProvider::WIFI_SECURITY_RSN:
16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      security = SystemProfileProto::Network::WifiAccessPoint::SECURITY_RSN;
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      break;
17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case WifiAccessPointInfoProvider::WIFI_SECURITY_802_1X:
17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      security = SystemProfileProto::Network::WifiAccessPoint::SECURITY_802_1X;
17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      break;
17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case WifiAccessPointInfoProvider::WIFI_SECURITY_PSK:
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      security = SystemProfileProto::Network::WifiAccessPoint::SECURITY_PSK;
17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      break;
17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case WifiAccessPointInfoProvider::WIFI_SECURITY_UNKNOWN:
17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      security = SystemProfileProto::Network::WifiAccessPoint::SECURITY_UNKNOWN;
17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      break;
17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  access_point_info->set_security_mode(security);
18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // |bssid| is xx:xx:xx:xx:xx:xx, extract the first three components and
18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // pack into a uint32.
18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string bssid = info.bssid;
18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (bssid.size() == 17 && bssid[2] == ':' && bssid[5] == ':' &&
18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      bssid[8] == ':' && bssid[11] == ':' && bssid[14] == ':') {
18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::string vendor_prefix_str;
18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    uint32 vendor_prefix;
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    base::RemoveChars(bssid.substr(0, 9), ":", &vendor_prefix_str);
19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    DCHECK_EQ(6U, vendor_prefix_str.size());
19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (base::HexStringToUInt(vendor_prefix_str, &vendor_prefix))
19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      access_point_info->set_vendor_prefix(vendor_prefix);
19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    else
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      NOTREACHED();
19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Return if vendor information is not provided.
19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (info.model_number.empty() && info.model_name.empty() &&
20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      info.device_name.empty() && info.oui_list.empty())
20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SystemProfileProto::Network::WifiAccessPoint::VendorInformation* vendor =
20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      access_point_info->mutable_vendor_info();
20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!info.model_number.empty())
20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    vendor->set_model_number(info.model_number);
20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!info.model_name.empty())
20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    vendor->set_model_name(info.model_name);
20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!info.device_name.empty())
21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    vendor->set_device_name(info.device_name);
21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Return if OUI list is not provided.
21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (info.oui_list.empty())
21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
21603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Parse OUI list.
21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::vector<std::string> oui_list;
21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::SplitString(info.oui_list, ' ', &oui_list);
21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (std::vector<std::string>::const_iterator it = oui_list.begin();
22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       it != oui_list.end();
22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       ++it) {
22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    uint32 oui;
22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (base::HexStringToUInt(*it, &oui))
22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      vendor->add_element_identifier(oui);
22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    else
22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      NOTREACHED();
22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
229