1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/metrics/net/wifi_access_point_info_provider_chromeos.h"
8 #include "base/location.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "chromeos/network/network_configuration_handler.h"
11 #include "chromeos/network/network_handler.h"
12 #include "chromeos/network/network_state.h"
13 #include "chromeos/network/network_state_handler.h"
14 #include "chromeos/network/shill_property_util.h"
15 #include "third_party/cros_system_api/dbus/service_constants.h"
17 using chromeos::NetworkHandler
;
21 WifiAccessPointInfoProviderChromeos::WifiAccessPointInfoProviderChromeos() {
22 NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE
);
24 // Update initial connection state.
25 DefaultNetworkChanged(
26 NetworkHandler::Get()->network_state_handler()->DefaultNetwork());
29 WifiAccessPointInfoProviderChromeos::~WifiAccessPointInfoProviderChromeos() {
30 NetworkHandler::Get()->network_state_handler()->RemoveObserver(this,
34 bool WifiAccessPointInfoProviderChromeos::GetInfo(WifiAccessPointInfo
* info
) {
35 // Wifi access point information is not provided if the BSSID is empty.
36 // This assumes the BSSID is never empty when access point information exists.
37 if (wifi_access_point_info_
.bssid
.empty())
40 *info
= wifi_access_point_info_
;
44 void WifiAccessPointInfoProviderChromeos::DefaultNetworkChanged(
45 const chromeos::NetworkState
* default_network
) {
46 // Reset access point info to prevent reporting of out-dated data.
47 wifi_access_point_info_
= WifiAccessPointInfo();
49 // Skip non-wifi connections
50 if (!default_network
|| default_network
->type() != shill::kTypeWifi
)
53 // Retrieve access point info for wifi connection.
54 NetworkHandler::Get()->network_configuration_handler()->GetProperties(
55 default_network
->path(),
56 base::Bind(&WifiAccessPointInfoProviderChromeos::ParseInfo
,
58 chromeos::network_handler::ErrorCallback());
61 void WifiAccessPointInfoProviderChromeos::ParseInfo(
62 const std::string
&service_path
,
63 const base::DictionaryValue
& properties
) {
64 // Skip services that contain "_nomap" in the SSID.
66 chromeos::shill_property_util::GetSSIDFromProperties(properties
, NULL
);
67 if (ssid
.find("_nomap", 0) != std::string::npos
)
71 if (!properties
.GetStringWithoutPathExpansion(shill::kWifiBSsid
, &bssid
) ||
75 // Filter out BSSID with local bit set in the first byte.
77 if (!base::HexStringToUInt(bssid
.substr(0, 2), &first_octet
))
79 if (first_octet
& 0x2)
81 wifi_access_point_info_
.bssid
= bssid
;
83 // Parse security info.
85 properties
.GetStringWithoutPathExpansion(
86 shill::kSecurityProperty
, &security
);
87 wifi_access_point_info_
.security
= WIFI_SECURITY_UNKNOWN
;
88 if (security
== shill::kSecurityWpa
)
89 wifi_access_point_info_
.security
= WIFI_SECURITY_WPA
;
90 else if (security
== shill::kSecurityWep
)
91 wifi_access_point_info_
.security
= WIFI_SECURITY_WEP
;
92 else if (security
== shill::kSecurityRsn
)
93 wifi_access_point_info_
.security
= WIFI_SECURITY_RSN
;
94 else if (security
== shill::kSecurity8021x
)
95 wifi_access_point_info_
.security
= WIFI_SECURITY_802_1X
;
96 else if (security
== shill::kSecurityPsk
)
97 wifi_access_point_info_
.security
= WIFI_SECURITY_PSK
;
98 else if (security
== shill::kSecurityNone
)
99 wifi_access_point_info_
.security
= WIFI_SECURITY_NONE
;
101 properties
.GetStringWithoutPathExpansion(
102 shill::kWifiBSsid
, &wifi_access_point_info_
.bssid
);
103 const base::DictionaryValue
* vendor_dict
= NULL
;
104 if (!properties
.GetDictionaryWithoutPathExpansion(
105 shill::kWifiVendorInformationProperty
,
109 vendor_dict
->GetStringWithoutPathExpansion(
110 shill::kVendorWPSModelNumberProperty
,
111 &wifi_access_point_info_
.model_number
);
112 vendor_dict
->GetStringWithoutPathExpansion(
113 shill::kVendorWPSModelNameProperty
,
114 &wifi_access_point_info_
.model_name
);
115 vendor_dict
->GetStringWithoutPathExpansion(
116 shill::kVendorWPSDeviceNameProperty
,
117 &wifi_access_point_info_
.device_name
);
118 vendor_dict
->GetStringWithoutPathExpansion(shill::kVendorOUIListProperty
,
119 &wifi_access_point_info_
.oui_list
);
122 } // namespace metrics