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