1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 16b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 17d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#ifndef SHILL_WIFI_WIFI_H_ 18d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#define SHILL_WIFI_WIFI_H_ 19b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 2022601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// A WiFi device represents a wireless network interface implemented as an IEEE 2122601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 802.11 station. An Access Point (AP) (or, more correctly, a Basic Service 2222601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// Set(BSS)) is represented by a WiFiEndpoint. An AP provides a WiFiService, 2322601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// which is the same concept as Extended Service Set (ESS) in 802.11, 2422601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// identified by an SSID. A WiFiService includes zero or more WiFiEndpoints 2522601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// that provide that service. 2622601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 2722601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// A WiFi device interacts with a real device through WPA Supplicant. 2822601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// Wifi::Start() creates a connection to WPA Supplicant, represented by 2922601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// |supplicant_interface_proxy_|. [1] 3022601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 3122601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// A WiFi device becomes aware of WiFiEndpoints through BSSAdded signals from 3222601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// WPA Supplicant, which identifies them by a "path". The WiFi object maintains 3322601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// an EndpointMap in |endpoint_by_rpcid_|, in which the key is the "path" and 3422601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// the value is a pointer to a WiFiEndpoint object. When a WiFiEndpoint is 3522601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// added, it is associated with a WiFiService. 3622601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 3722601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// The WiFi device connects to a WiFiService, not a WiFiEndpoint, through WPA 3822601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// Supplicant. It is the job of WPA Supplicant to select a BSS (aka 3922601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// WiFiEndpoint) to connect to. The protocol for establishing a connection is 4022601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// as follows: 4122601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 4222601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 1. The WiFi device sends AddNetwork to WPA Supplicant, which returns a 4322601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// "network path" when done. 4422601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 4522601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 2. The WiFi device sends SelectNetwork, indicating the network path 4622601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// received in 1, to WPA Supplicant, which begins the process of associating 4722601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// with an AP in the ESS. At this point the WiFiService which is being 4822601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// connected is called the |pending_service_|. 4922601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 50bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart// 3. During association to an EAP-TLS network, WPA Supplicant can send 51bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart// multiple "Certification" events, which provide information about the 52bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart// identity of the remote entity. 53bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart// 54bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart// 4. When association is complete, WPA Supplicant sends a PropertiesChanged 55bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart// signal to the WiFi device, indicating a change in the CurrentBSS. The 56bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart// WiFiService indicated by the new value of CurrentBSS is set as the 57bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart// |current_service_|, and |pending_service_| is (normally) cleared. 5822601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 5922601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// Some key things to notice are 1) WPA Supplicant does the work of selecting 6022601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// the AP (aka WiFiEndpoint) and it tells the WiFi device which AP it selected. 6122601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 2) The process of connecting is asynchronous. There is a |current_service_| 6222601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// to which the WiFi device is presently using and a |pending_service_| to which 6322601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// the WiFi device has initiated a connection. 6422601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 6522601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// A WiFi device is notified that an AP has gone away via the BSSRemoved signal. 6622601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// When the last WiFiEndpoint of a WiFiService is removed, the WiFiService 6722601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// itself is deleted. 6822601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 6922601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// TODO(gmorain): Add explanation of hidden SSIDs. 7022601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 7122601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// WPA Supplicant's PropertiesChanged signal communicates changes in the state 7222601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// of WPA Supplicant's current service. This state is stored in 7322601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// |supplicant_state_| and reflects WPA Supplicant's view of the state of the 7422601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// connection to an AP. Changes in this state sometimes cause state changes in 7522601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// the WiFiService to which a WiFi device is connected. For example, when WPA 7622601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// Supplicant signals the new state to be "completed", then the WiFiService 7722601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// state gets changed to "configuring". State change notifications are not 7822601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// reliable because WPA Supplicant may coalesce state changes in quick 7922601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// succession so that only the last of the changes is signaled. 8022601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 8122601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// Notes: 8222601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 8322601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// 1. Shill's definition of the interface is described in 84ef342b4400ad2338d3caf8f30ae06ba9f9fa4d77Liam McLoughlin// shill/dbus_proxies/supplicant-interface.xml, and the WPA Supplicant's 8522601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// description of the same interface is in 8622601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain// third_party/wpa_supplicant/doc/dbus.doxygen. 8722601da1ec8343e00bc2ed98ac9c81a052e792d6Gary Morain 885c05b2920be742d518829972127172481722058dmukesh agrawal#include <time.h> 895c05b2920be742d518829972127172481722058dmukesh agrawal 90ab87ea4808bd7d002eaad8b021f14c1cad90f65amukesh agrawal#include <map> 91ef76af866aa73abb8c16958844cb13f042881bcbBen Chan#include <memory> 9292d0636b757f23cd6176008c86a1468bbd9bcc54Wade Guthrie#include <set> 9346eaaf53d5e5b92f418b8d7cbfe7e847b575791fChris Masone#include <string> 94ab87ea4808bd7d002eaad8b021f14c1cad90f65amukesh agrawal#include <vector> 9546eaaf53d5e5b92f418b8d7cbfe7e847b575791fChris Masone 969a24553461df7036755060423f90804011612249Eric Shienbrood#include <base/callback_forward.h> 97b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal#include <base/cancelable_callback.h> 98a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/files/file_path.h> 999a24553461df7036755060423f90804011612249Eric Shienbrood#include <base/memory/weak_ptr.h> 1006ab23a9d4526686406d50081853639540b22213aPaul Stewart#include <gtest/gtest_prod.h> // for FRIEND_TEST 1010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include <metrics/timer.h> 102af57195acad7aebca521e2d67bd58f4c0abb676bmukesh agrawal 103b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart#include "shill/device.h" 10426b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h" 105baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart#include "shill/key_value_store.h" 10602e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/netlink_manager.h" 107ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain#include "shill/power_manager.h" 1082b10554b6c736f3421102d483b74b70bb82f997cChris Masone#include "shill/refptr_types.h" 1091369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart#include "shill/service.h" 110da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/supplicant_event_delegate_interface.h" 111b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 112b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewartnamespace shill { 113b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 1147a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalclass Error; 1156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahclass GeolocationInfo; 1163946da840142cd386d628c0e879459f8976bd86dmukesh agrawalclass Mac80211Monitor; 1175d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tanclass Metrics; 118bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrieclass NetlinkManager; 11992d0636b757f23cd6176008c86a1468bbd9bcc54Wade Guthrieclass NetlinkMessage; 1207347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrieclass Nl80211Message; 1215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieclass ScanSession; 122735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewartclass SupplicantEAPStateHandler; 123af57195acad7aebca521e2d67bd58f4c0abb676bmukesh agrawalclass SupplicantInterfaceProxyInterface; 124af57195acad7aebca521e2d67bd58f4c0abb676bmukesh agrawalclass SupplicantProcessProxyInterface; 125618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiuclass TDLSManager; 1265d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tanclass WakeOnWiFi; 1273c5040174273386868cc8dea8044d22c465885d8Paul Stewartclass WiFiProvider; 128445e72cb73f394ae4ce8d160b17642562a3ec987mukesh agrawalclass WiFiService; 129b54601c6f85577ab326da277356b88049d92ee2bmukesh agrawal 130ab87ea4808bd7d002eaad8b021f14c1cad90f65amukesh agrawal// WiFi class. Specialization of Device for WiFi. 131196f50fdcc687512c123a34f54a21eea8215708fPaul Stewartclass WiFi : public Device, public SupplicantEventDelegateInterface { 132b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart public: 1335d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan typedef std::set<uint32_t> FreqSet; 1345d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan 1352b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFi(ControlInterface* control_interface, 1362b363903f38a515001c5edc7202403fcddb15a01Paul Stewart EventDispatcher* dispatcher, 1372b363903f38a515001c5edc7202403fcddb15a01Paul Stewart Metrics* metrics, 1382b363903f38a515001c5edc7202403fcddb15a01Paul Stewart Manager* manager, 1392b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const std::string& link, 1402b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const std::string& address, 141f1ce5d27adbfcaf9c46e650252b46e02b0d8addaPaul Stewart int interface_index); 1425ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan ~WiFi() override; 143c08653143f7ff3f9f8c2d978da3814290bce5064Darin Petkov 1442b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void Start(Error* error, 1452b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const EnabledStateChangedCallback& callback) override; 1462b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void Stop(Error* error, const EnabledStateChangedCallback& callback) override; 1472b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void Scan(ScanType scan_type, Error* error, 1482b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const std::string& reason) override; 1492b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetSchedScan(bool enable, Error* error) override; 150fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan // Callback for system suspend. 1512b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnBeforeSuspend(const ResultCallback& callback) override; 152787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan // Callback for dark resume. 1532b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnDarkResume(const ResultCallback& callback) override; 1542f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal // Callback for system resume. If this WiFi device is idle, a scan 1552f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal // is initiated. Additionally, the base class implementation is 1562f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal // invoked unconditionally. 1576acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang void OnAfterResume() override; 1585519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // Callback for when a service is configured with an IP. 1596acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang void OnConnected() override; 160f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Callback for when a service fails to configure with an IP. 161016fa0e9c8f47630c8e6c440ace42ba99f8498dfAlex Vakulenko void OnIPConfigFailure() override; 162ab87ea4808bd7d002eaad8b021f14c1cad90f65amukesh agrawal 1633a1bf99b484ad8a9a054518f49046221251d5612Samuel Tan // Calls corresponding functions of |wake_on_wifi_|. Refer to wake_on_wifi.h 1643a1bf99b484ad8a9a054518f49046221251d5612Samuel Tan // for documentation. 1652b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void AddWakeOnPacketConnection(const std::string& ip_endpoint, 1662b363903f38a515001c5edc7202403fcddb15a01Paul Stewart Error* error) override; 1672b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void RemoveWakeOnPacketConnection(const std::string& ip_endpoint, 1682b363903f38a515001c5edc7202403fcddb15a01Paul Stewart Error* error) override; 1692b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void RemoveAllWakeOnPacketConnections(Error* error) override; 170a6270fd8fa1bd88a802595d91d80de86081847beSamuel Tan 171196f50fdcc687512c123a34f54a21eea8215708fPaul Stewart // Implementation of SupplicantEventDelegateInterface. These methods 172196f50fdcc687512c123a34f54a21eea8215708fPaul Stewart // are called by SupplicantInterfaceProxy, in response to events from 173ab87ea4808bd7d002eaad8b021f14c1cad90f65amukesh agrawal // wpa_supplicant. 174fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void BSSAdded(const std::string& BSS, 175fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const KeyValueStore& properties) override; 176fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void BSSRemoved(const std::string& BSS) override; 177fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void Certification(const KeyValueStore& properties) override; 1786acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang void EAPEvent( 1792b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const std::string& status, const std::string& parameter) override; 180fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void PropertiesChanged(const KeyValueStore& properties) override; 1812b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ScanDone(const bool& success) override; 1822b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void TDLSDiscoverResponse(const std::string& peer_address) override; 183ab87ea4808bd7d002eaad8b021f14c1cad90f65amukesh agrawal 1841590839e44a0e922d4763003a35dbd493509b705mukesh agrawal // Called by WiFiService. 1852b363903f38a515001c5edc7202403fcddb15a01Paul Stewart virtual void ConnectTo(WiFiService* service); 186a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart 187d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein // After checking |service| state is active, initiate 188d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein // process of disconnecting. Log and return if not active. 1892b363903f38a515001c5edc7202403fcddb15a01Paul Stewart virtual void DisconnectFromIfActive(WiFiService* service); 190d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 191835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // If |service| is connected, initiate the process of disconnecting it. 192835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Otherwise, if it a pending or current service, discontinue the process 193835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // of connecting and return |service| to the idle state. 1942b363903f38a515001c5edc7202403fcddb15a01Paul Stewart virtual void DisconnectFrom(WiFiService* service); 1958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal virtual bool IsIdle() const; 196835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Clear any cached credentials wpa_supplicant may be holding for 197835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // |service|. This has a side-effect of disconnecting the service 198835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // if it is connected. 1992b363903f38a515001c5edc7202403fcddb15a01Paul Stewart virtual void ClearCachedCredentials(const WiFiService* service); 200b54601c6f85577ab326da277356b88049d92ee2bmukesh agrawal 201b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Called by WiFiEndpoint. 2022b363903f38a515001c5edc7202403fcddb15a01Paul Stewart virtual void NotifyEndpointChanged(const WiFiEndpointConstRefPtr& endpoint); 2037a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal 20416bc1b8908e2ce28d85976d1f685790a6e2d9f98mukesh agrawal // Utility, used by WiFiService and WiFiEndpoint. 20516bc1b8908e2ce28d85976d1f685790a6e2d9f98mukesh agrawal // Replace non-ASCII characters with '?'. Return true if one or more 20616bc1b8908e2ce28d85976d1f685790a6e2d9f98mukesh agrawal // characters were changed. 2072b363903f38a515001c5edc7202403fcddb15a01Paul Stewart static bool SanitizeSSID(std::string* ssid); 20816bc1b8908e2ce28d85976d1f685790a6e2d9f98mukesh agrawal 20950cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov // Formats |ssid| for logging purposes, to ease scrubbing. 2102b363903f38a515001c5edc7202403fcddb15a01Paul Stewart static std::string LogSSID(const std::string& ssid); 21150cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov 212016fa0e9c8f47630c8e6c440ace42ba99f8498dfAlex Vakulenko // Called by Linkmonitor (overridden from Device superclass). 2136acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang void OnLinkMonitorFailure() override; 2143c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 2158e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu // Called by Device when link becomes unreliable (overriden from Device 2168e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu // superclass). 2176acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang void OnUnreliableLink() override; 2188e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 2198bc50880ba07ddcd2b91d32092bee14d3cc91804Wade Guthrie bool IsCurrentService(const WiFiServiceRefPtr service) { 2208bc50880ba07ddcd2b91d32092bee14d3cc91804Wade Guthrie return service.get() == current_service_.get(); 2218bc50880ba07ddcd2b91d32092bee14d3cc91804Wade Guthrie } 2228bc50880ba07ddcd2b91d32092bee14d3cc91804Wade Guthrie 223ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray // Overridden from Device superclass 2246acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang std::vector<GeolocationInfo> GetGeolocationObjects() const override; 2256d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 226ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray // Overridden from Device superclass 2276acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang bool ShouldUseArpGateway() const override; 228ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray 2293c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Called by a WiFiService when it disassociates itself from this Device. 2302b363903f38a515001c5edc7202403fcddb15a01Paul Stewart virtual void DisassociateFromService(const WiFiServiceRefPtr& service); 2313c5040174273386868cc8dea8044d22c465885d8Paul Stewart 2320e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk // Called by a WiFiService when it unloads to destroy its lease file. 2332b363903f38a515001c5edc7202403fcddb15a01Paul Stewart virtual void DestroyServiceLease(const WiFiService& service); 2340e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk 235c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // Perform TDLS |operation| on |peer|. 2362b363903f38a515001c5edc7202403fcddb15a01Paul Stewart std::string PerformTDLSOperation(const std::string& operation, 2372b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const std::string& peer, 2382b363903f38a515001c5edc7202403fcddb15a01Paul Stewart Error* error) override; 239dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter Qiu 240dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter Qiu // Overridden from Device superclass. 241016fa0e9c8f47630c8e6c440ace42ba99f8498dfAlex Vakulenko bool IsTrafficMonitorEnabled() const override; 242dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter Qiu 243787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan // Remove all networks from WPA supplicant. 244787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan // Passed as a callback to |wake_on_wifi_| where it is used. 245787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void RemoveSupplicantNetworks(); 246787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 2478ff81329524eb3af0d8e7b2642a4a4c262d6b4fdNingyuan Wang bool RequestRoam(const std::string& addr, Error* error) override; 2488ff81329524eb3af0d8e7b2642a4a4c262d6b4fdNingyuan Wang 249af57195acad7aebca521e2d67bd58f4c0abb676bmukesh agrawal private: 2500cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie enum ScanMethod { 2510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie kScanMethodNone, 2520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie kScanMethodFull, 2530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie kScanMethodProgressive, 2540cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie kScanMethodProgressiveErrorToFull, 2550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie kScanMethodProgressiveFinishedToFull 2560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie }; 2570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie enum ScanState { 2580cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie kScanIdle, 2590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie kScanScanning, 2603bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart kScanBackgroundScanning, 261df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie kScanTransitionToConnecting, 2620cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie kScanConnecting, 2630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie kScanConnected, 2640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie kScanFoundNothing 2650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie }; 2660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 267050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // Result from a BSSAdded or BSSRemoved event. 268050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart struct ScanResult { 269050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart ScanResult() : is_removal(false) {} 270fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ScanResult(const std::string& path_in, 271fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const KeyValueStore& properties_in, 272050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart bool is_removal_in) 273050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart : path(path_in), properties(properties_in), is_removal(is_removal_in) {} 274fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu std::string path; 275fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore properties; 276050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart bool is_removal; 277050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart }; 278050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 279050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart struct PendingScanResults { 280050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart PendingScanResults() : is_complete(false) {} 2812b363903f38a515001c5edc7202403fcddb15a01Paul Stewart explicit PendingScanResults(const base::Closure& process_results_callback) 282050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart : is_complete(false), callback(process_results_callback) {} 283050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 284050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // List of pending scan results to process. 285050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart std::vector<ScanResult> results; 286050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 287050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // If true, denotes that the scan is complete (ScanDone() was called). 288050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart bool is_complete; 289050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 290050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // Cancelable closure used to process the scan results. 291050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart base::CancelableClosure callback; 292050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart }; 293050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 294e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart friend class WiFiObjectTest; // access to supplicant_*_proxy_, link_up_ 2951aff7307d462b0160e821607058fe13831d8ef63Paul Stewart friend class WiFiTimerTest; // kNumFastScanAttempts, kFastScanIntervalSeconds 2969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie friend class WiFiMainTest; // ScanState, ScanMethod 2974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov FRIEND_TEST(WiFiMainTest, AppendBgscan); 2983bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart FRIEND_TEST(WiFiMainTest, BackgroundScan); // ScanMethod, ScanState 299df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie FRIEND_TEST(WiFiMainTest, ConnectToServiceNotPending); // ScanState 300df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie FRIEND_TEST(WiFiMainTest, ConnectToWithError); // ScanState 301df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie FRIEND_TEST(WiFiMainTest, ConnectWhileNotScanning); // ScanState 3020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie FRIEND_TEST(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint); 3031caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein FRIEND_TEST(WiFiMainTest, DisconnectReasonUpdated); 3041caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein FRIEND_TEST(WiFiMainTest, DisconnectReasonCleared); 305e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart FRIEND_TEST(WiFiMainTest, FlushBSSOnResume); // kMaxBSSResumeAgeSeconds 3060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie FRIEND_TEST(WiFiMainTest, FullScanConnecting); // ScanMethod, ScanState 3070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie FRIEND_TEST(WiFiMainTest, FullScanConnectingToConnected); 3082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie FRIEND_TEST(WiFiMainTest, FullScanDuringProgressive); // ScanState 3090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie FRIEND_TEST(WiFiMainTest, FullScanFindsNothing); // ScanMethod, ScanState 3107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal FRIEND_TEST(WiFiMainTest, InitialSupplicantState); // kInterfaceStateUnknown 3113c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart FRIEND_TEST(WiFiMainTest, LinkMonitorFailure); // set_link_monitor() 3122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie FRIEND_TEST(WiFiMainTest, NoScansWhileConnecting_FullScan); // ScanState 3132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie FRIEND_TEST(WiFiMainTest, NoScansWhileConnecting); // ScanState 314050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart FRIEND_TEST(WiFiMainTest, PendingScanEvents); // EndpointMap 3150cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie FRIEND_TEST(WiFiMainTest, ProgressiveScanConnectingToConnected); 316df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie FRIEND_TEST(WiFiMainTest, ProgressiveScanConnectingToNotFound); 3172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie FRIEND_TEST(WiFiMainTest, ProgressiveScanDuringFull); // ScanState 3180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie FRIEND_TEST(WiFiMainTest, ProgressiveScanError); // ScanMethod, ScanState 3190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie FRIEND_TEST(WiFiMainTest, ProgressiveScanFound); // ScanMethod, ScanState 3200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie FRIEND_TEST(WiFiMainTest, ProgressiveScanNotFound); // ScanMethod, ScanState 3211e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal FRIEND_TEST(WiFiMainTest, ScanRejected); // ScanState 322e41a72d0737488d561a4158019409d5785dad61bThieu Le FRIEND_TEST(WiFiMainTest, ScanResults); // EndpointMap 323165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal FRIEND_TEST(WiFiMainTest, ScanResultsWithUpdates); // EndpointMap 324df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie FRIEND_TEST(WiFiMainTest, ScanStateHandleDisconnect); // ScanState 325df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie FRIEND_TEST(WiFiMainTest, ScanStateNotScanningNoUma); // ScanState 326b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie FRIEND_TEST(WiFiMainTest, ScanStateUma); // ScanState, ScanMethod 327c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal FRIEND_TEST(WiFiMainTest, Stop); // weak_ptr_factory_ 3280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie FRIEND_TEST(WiFiMainTest, TimeoutPendingServiceWithEndpoints); 3294a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov FRIEND_TEST(WiFiPropertyTest, BgscanMethodProperty); // bgscan_method_ 3301aff7307d462b0160e821607058fe13831d8ef63Paul Stewart FRIEND_TEST(WiFiTimerTest, FastRescan); // kFastScanIntervalSeconds 3317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart FRIEND_TEST(WiFiTimerTest, RequestStationInfo); // kRequestStationInfoPeriod 3321964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan // kPostWakeConnectivityReportDelayMilliseconds 3331964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan FRIEND_TEST(WiFiTimerTest, ResumeDispatchesConnectivityReportTask); 3342d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan // kFastScanIntervalSeconds 3352d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan FRIEND_TEST(WiFiTimerTest, StartScanTimer_HaveFastScansRemaining); 336235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan FRIEND_TEST(WiFiMainTest, ParseWiphyIndex_Success); // kDefaultWiphyIndex 3373cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // ScanMethod, ScanState 3383cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan FRIEND_TEST(WiFiMainTest, ResetScanStateWhenScanFailed); 3393cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // kPostScanFailedDelayMilliseconds 3403cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan FRIEND_TEST(WiFiTimerTest, ScanDoneDispatchesTasks); 3414b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan // kMaxPassiveScanRetries, kMaxFreqsForPassiveScanRetries 3424b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan FRIEND_TEST(WiFiMainTest, InitiateScanInDarkResume_Idle); 3436ab23a9d4526686406d50081853639540b22213aPaul Stewart 344b54601c6f85577ab326da277356b88049d92ee2bmukesh agrawal typedef std::map<const std::string, WiFiEndpointRefPtr> EndpointMap; 3452b363903f38a515001c5edc7202403fcddb15a01Paul Stewart typedef std::map<const WiFiService*, std::string> ReverseServiceMap; 346b54601c6f85577ab326da277356b88049d92ee2bmukesh agrawal 3472b363903f38a515001c5edc7202403fcddb15a01Paul Stewart static const char* kDefaultBgscanMethod; 348a6270fd8fa1bd88a802595d91d80de86081847beSamuel Tan static const uint16_t kBackgroundScanIntervalSeconds; 3497fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kDefaultBgscanShortIntervalSeconds; 3507fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const int32_t kDefaultBgscanSignalThresholdDbm; 3517fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kDefaultRoamThresholdDb; 3527fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kDefaultScanIntervalSeconds; 3535c05b2920be742d518829972127172481722058dmukesh agrawal static const time_t kMaxBSSResumeAgeSeconds; 3547ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal static const char kInterfaceStateUnknown[]; 355f202817577cbb1babd1cde3301684da2811db102mukesh agrawal // Delay between scans when supplicant finds "No suitable network". 356f202817577cbb1babd1cde3301684da2811db102mukesh agrawal static const time_t kRescanIntervalSeconds; 357e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Number of times to quickly attempt a scan after startup / disconnect. 358e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart static const int kNumFastScanAttempts; 359e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart static const int kFastScanIntervalSeconds; 3602b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart static const int kPendingTimeoutSeconds; 361446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const int kReconnectTimeoutSeconds; 3627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart static const int kRequestStationInfoPeriodSeconds; 3635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie static const size_t kMinumumFrequenciesToScan; 3642edd58b88ab77cfa806c9ad43253214987cec82bWade Guthrie static const float kDefaultFractionPerScan; 3653946da840142cd386d628c0e879459f8976bd86dmukesh agrawal static const size_t kStuckQueueLengthThreshold; 3661964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan // Number of milliseconds to wait after waking from suspend to report the 3671964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan // connection status to metrics. 3681964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan static const int kPostWakeConnectivityReportDelayMilliseconds; 369235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Used to instantiate |wiphy_index_| in WiFi. Assigned a large value so that 370235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // any attempts to match the default value of |wiphy_index_| against an actual 371235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // wiphy index reported in an NL80211 message will fail. 372235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan static const uint32_t kDefaultWiphyIndex; 3733cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // Number of milliseconds to wait after failing to launch a scan before 3743cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // resetting the scan state to idle. 3753cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan static const int kPostScanFailedDelayMilliseconds; 3761caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein // Used to distinguish between a disconnect reason explicitly set by 3771caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein // supplicant and a default. 3781caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein static const int kDefaultDisconnectReason; 379b54601c6f85577ab326da277356b88049d92ee2bmukesh agrawal 3803946da840142cd386d628c0e879459f8976bd86dmukesh agrawal void GetPhyInfo(); 3812b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void AppendBgscan(WiFiService* service, 382fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore* service_params) const; 3832b363903f38a515001c5edc7202403fcddb15a01Paul Stewart std::string GetBgscanMethod(const int& argument, Error* error); 3842b363903f38a515001c5edc7202403fcddb15a01Paul Stewart uint16_t GetBgscanShortInterval(Error* /* error */) { 3854d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal return bgscan_short_interval_seconds_; 3864d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 3872b363903f38a515001c5edc7202403fcddb15a01Paul Stewart int32_t GetBgscanSignalThreshold(Error* /* error */) { 3884d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal return bgscan_signal_threshold_dbm_; 3894d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 390227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie // These methods can't be 'const' because they are passed to 391227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie // HelpRegisterDerivedUint16 which don't take const methods. 3922b363903f38a515001c5edc7202403fcddb15a01Paul Stewart uint16_t GetRoamThreshold(Error* /* error */) /*const*/ { 393227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return roam_threshold_db_; 394227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 3952b363903f38a515001c5edc7202403fcddb15a01Paul Stewart uint16_t GetScanInterval(Error* /* error */) /*const*/ { 396227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return scan_interval_seconds_; 397227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 398baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 399baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // RPC accessor for |link_statistics_|. 4002b363903f38a515001c5edc7202403fcddb15a01Paul Stewart KeyValueStore GetLinkStatistics(Error* error); 401baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 4022b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool GetScanPending(Error* /* error */); 403bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetBgscanMethod( 4042b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const int& argument, const std::string& method, Error* error); 4052b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetBgscanShortInterval(const uint16_t& seconds, Error* error); 4062b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetBgscanSignalThreshold(const int32_t& dbm, Error* error); 4072b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetRoamThreshold(const uint16_t& threshold, Error* /*error*/); 4082b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetScanInterval(const uint16_t& seconds, Error* error); 4092b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ClearBgscanMethod(const int& argument, Error* error); 4102b363903f38a515001c5edc7202403fcddb15a01Paul Stewart 411fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void CurrentBSSChanged(const std::string& new_bss); 4123a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko void DisconnectReasonChanged(const int32_t new_disconnect_reason); 413835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Return the RPC identifier associated with the wpa_supplicant network 414835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // entry created for |service|. If one does not exist, an empty string 415835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // is returned, and |error| is populated. 4162b363903f38a515001c5edc7202403fcddb15a01Paul Stewart std::string FindNetworkRpcidForService(const WiFiService* service, 4172b363903f38a515001c5edc7202403fcddb15a01Paul Stewart Error* error); 4181590839e44a0e922d4763003a35dbd493509b705mukesh agrawal void HandleDisconnect(); 4194943822214f823c2437aa32b0376414b3e60388dPeter Qiu // Update failure and state for disconnected service. 4204943822214f823c2437aa32b0376414b3e60388dPeter Qiu // Set failure for disconnected service if disconnect is not user-initiated 4214943822214f823c2437aa32b0376414b3e60388dPeter Qiu // and failure is not already set. Then set the state of the service back 4224943822214f823c2437aa32b0376414b3e60388dPeter Qiu // to idle, so it can be used for future connections. 4234943822214f823c2437aa32b0376414b3e60388dPeter Qiu void ServiceDisconnected(WiFiServiceRefPtr service); 424fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void HandleRoam(const std::string& new_bssid); 425fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void BSSAddedTask(const std::string& BSS, 426fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const KeyValueStore& properties); 427fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void BSSRemovedTask(const std::string& BSS); 428fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void CertificationTask(const KeyValueStore& properties); 4292b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void EAPEventTask(const std::string& status, const std::string& parameter); 430fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void PropertiesChangedTask(const KeyValueStore& properties); 431dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal void ScanDoneTask(); 4323cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan void ScanFailedTask(); 4330cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // UpdateScanStateAfterScanDone is spawned as a task from ScanDoneTask in 4340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // order to guarantee that it is run after the start of any connections that 4350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // result from a scan. This works because supplicant sends all BSSAdded 4360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // signals to shill before it sends a ScanDone signal. The code that 4370cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // handles those signals launch tasks such that the tasks have the following 4380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // dependencies (an arrow from X->Y indicates X is guaranteed to run before 4390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Y): 4400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // 4410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // [BSSAdded]-->[BssAddedTask]-->[SortServiceTask (calls ConnectTo)] 4420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // | | | 4430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // V V V 4440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // [ScanDone]-->[ScanDoneTask]-->[UpdateScanStateAfterScanDone] 4450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie void UpdateScanStateAfterScanDone(); 4463239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal void ScanTask(); 4472b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void StateChanged(const std::string& new_state); 448cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal // Heuristic check if a connection failure was due to bad credentials. 4491369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart // Returns true and puts type of failure in |failure| if a credential 4501369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart // problem is detected. 451bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart bool SuspectCredentials(WiFiServiceRefPtr service, 4522b363903f38a515001c5edc7202403fcddb15a01Paul Stewart Service::ConnectFailure* failure) const; 4534d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal void HelpRegisterDerivedInt32( 4542b363903f38a515001c5edc7202403fcddb15a01Paul Stewart PropertyStore* store, 4552b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const std::string& name, 4562b363903f38a515001c5edc7202403fcddb15a01Paul Stewart int32_t(WiFi::*get)(Error* error), 4572b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool(WiFi::*set)(const int32_t& value, Error* error)); 4584d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal void HelpRegisterDerivedUint16( 4592b363903f38a515001c5edc7202403fcddb15a01Paul Stewart PropertyStore* store, 4602b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const std::string& name, 4612b363903f38a515001c5edc7202403fcddb15a01Paul Stewart uint16_t(WiFi::*get)(Error* error), 4622b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool(WiFi::*set)(const uint16_t& value, Error* error)); 4630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie void HelpRegisterConstDerivedBool( 4642b363903f38a515001c5edc7202403fcddb15a01Paul Stewart PropertyStore* store, 4652b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const std::string& name, 4662b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool(WiFi::*get)(Error* error)); 4674d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 468835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Disable a network entry in wpa_supplicant, and catch any exception 469835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // that occurs. Returns false if an exception occurred, true otherwise. 470fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bool DisableNetwork(const std::string& network); 471835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Disable the wpa_supplicant network entry associated with |service|. 472835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Any cached credentials stored in wpa_supplicant related to this 473835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // network entry will be preserved. This will have the side-effect of 474835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // disconnecting this service if it is currently connected. Returns 475835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // true if successful, otherwise returns false and populates |error| 476835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // with the reason for failure. 477835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart virtual bool DisableNetworkForService( 4782b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiService* service, Error* error); 47971f6ecd9e71fc4354689af91380706d21e96ca35Paul Stewart // Remove a network entry from wpa_supplicant, and catch any exception 48071f6ecd9e71fc4354689af91380706d21e96ca35Paul Stewart // that occurs. Returns false if an exception occurred, true otherwise. 481fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bool RemoveNetwork(const std::string& network); 482835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Remove the wpa_supplicant network entry associated with |service|. 483835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Any cached credentials stored in wpa_supplicant related to this 484835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // network entry will be removed. This will have the side-effect of 485835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // disconnecting this service if it is currently connected. Returns 486835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // true if successful, otherwise returns false and populates |error| 487835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // with the reason for failure. 488835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart virtual bool RemoveNetworkForService( 4892b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiService* service, Error* error); 4908e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu // Update disable_ht40 setting in wpa_supplicant for the given service. 4912b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetHT40EnableForService(const WiFiService* service, bool enable); 4925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Perform the next in a series of progressive scans. 4935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ProgressiveScanTask(); 494d51b24406ed78691abe1c8110029a197c351a6e9Peter Qiu // Task to configure scheduled scan in wpa_supplicant. 495d51b24406ed78691abe1c8110029a197c351a6e9Peter Qiu void SetSchedScanTask(bool enable); 4965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Recovers from failed progressive scan. 4975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void OnFailedProgressiveScan(); 498e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Restart fast scanning after disconnection. 499e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void RestartFastScanAttempts(); 500b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Schedules a scan attempt at time |scan_interval_seconds_| in the 501b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // future. Cancels any currently pending scan timer. 502b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void StartScanTimer(); 503b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Cancels any currently pending scan timer. 504b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void StopScanTimer(); 505b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Initiates a scan, if idle. Reschedules the scan timer regardless. 506b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void ScanTimerHandler(); 5070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Abort any current scan (at the shill-level; let any request that's 5080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // already gone out finish). 5090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie void AbortScan(); 510787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan // Abort any current scan and start a new scan of type |type| if shill is 5115d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan // currently idle. 5125d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan void InitiateScan(ScanType scan_type); 5135d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan // Suppresses manager auto-connects and flushes supplicant BSS cache, then 5145d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan // triggers the passive scan. Meant for use in dark resume where we want to 5155d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan // ensure that shill and supplicant do not use stale information to launch 5165d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan // connection attempts. 5172b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void InitiateScanInDarkResume(const FreqSet& freqs); 5185d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan // If |freqs| contains at least one frequency channel a passive scan is 5195d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan // launched on all the frequencies in |freqs|. Otherwise, a passive scan is 5205d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan // launched on all channels. 5212b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void TriggerPassiveScan(const FreqSet& freqs); 5222b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart // Starts a timer in order to limit the length of an attempt to 5232b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart // connect to a pending network. 5242b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart void StartPendingTimer(); 5252b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart // Cancels any currently pending network timer. 5262b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart void StopPendingTimer(); 5272b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart // Aborts a pending network that is taking too long to connect. 5282b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart void PendingTimeoutHandler(); 529446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart // Starts a timer in order to limit the length of an attempt to 530446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart // reconnect to the current network. 531446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart void StartReconnectTimer(); 532446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart // Stops any pending reconnect timer. 533446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart void StopReconnectTimer(); 534446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart // Disconnects from the current service that is taking too long 535446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart // to reconnect on its own. 536446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart void ReconnectTimeoutHandler(); 5372b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart // Sets the current pending service. If the argument is non-NULL, 5382b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart // the Pending timer is started and the associated service is set 5392b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart // to "Associating", otherwise it is stopped. 5402b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetPendingService(const WiFiServiceRefPtr& service); 541ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 542e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu void OnSupplicantAppear(); 543e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu void OnSupplicantVanish(); 5445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // Called by ScopeLogger when WiFi debug scope is enabled/disabled. 5455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart void OnWiFiDebugScopeChanged(bool enabled); 546a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Enable or disable debugging for the current connection attempt. 547a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart void SetConnectionDebugging(bool enabled); 5485519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // Enable high bitrates for the current network. High rates are disabled 5495519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // on the initial association and every reassociation afterward. 5505519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley void EnableHighBitrates(); 5512b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 5527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Request and retrieve information about the currently connected station. 5537cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void RequestStationInfo(); 5542b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnReceivedStationInfo(const Nl80211Message& nl80211_message); 5557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void StopRequestingStationInfo(); 5567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 5572b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void ConnectToSupplicant(); 5582b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 5592b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void Restart(); 5602b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 5612b363903f38a515001c5edc7202403fcddb15a01Paul Stewart std::string GetServiceLeaseName(const WiFiService& service); 5620e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk 56392d0636b757f23cd6176008c86a1468bbd9bcc54Wade Guthrie // Netlink message handler for NL80211_CMD_NEW_WIPHY messages; copies 56492d0636b757f23cd6176008c86a1468bbd9bcc54Wade Guthrie // device's supported frequencies from that message into 56592d0636b757f23cd6176008c86a1468bbd9bcc54Wade Guthrie // |all_scan_frequencies_|. 5662b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnNewWiphy(const Nl80211Message& nl80211_message); 56792d0636b757f23cd6176008c86a1468bbd9bcc54Wade Guthrie 5682b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnTriggerPassiveScanResponse(const Nl80211Message& netlink_message); 5693fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 570b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie void SetScanState(ScanState new_state, 571b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie ScanMethod new_method, 5722b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const char* reason); 573b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie void ReportScanResultToUma(ScanState state, ScanMethod method); 5740cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie static std::string ScanStateString(ScanState state, ScanMethod type); 5750cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 576787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan // In addition to calling the implementations of these functions in Device, 577787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan // calls WakeOnWiFi::PrepareForWakeOnWiFiBeforeSuspend. 5782b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnIPConfigUpdated(const IPConfigRefPtr& ipconfig, 5793c3c36a37a885d0a2e180998587af8390744f757Samuel Tan bool new_lease_acquired) override; 580787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void OnIPv6ConfigUpdated() override; 581787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 582787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan // Returns true iff the WiFi device is connected to the current service. 583787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan bool IsConnectedToCurrentService(); 584787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 5851964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan // Callback invoked to report whether this WiFi device is connected to 5861964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan // a service after waking from suspend. Wraps around a Call the function 5871964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan // with the same name in WakeOnWiFi. 5881964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan void ReportConnectedToServiceAfterWake(); 5891964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 590050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // Add a scan result to the list of pending scan results, and post a task 591050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // for handling these results if one is not already running. 592fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void AddPendingScanResult(const std::string& path, 593fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const KeyValueStore& properties, 594fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bool is_removal); 595050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 596050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // Callback invoked to handle pending scan results from AddPendingScanResult. 597050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart void PendingScanResultsHandler(); 598050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 599235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Given a NL80211_CMD_NEW_WIPHY message |nl80211_message|, parses the 600235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // wiphy index of the NIC and sets |wiphy_index_| with the parsed index. 601235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Returns true iff the wiphy index was parsed successfully, false otherwise. 6022b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool ParseWiphyIndex(const Nl80211Message& nl80211_message); 603235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 604d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan // Callback invoked when the kernel broadcasts a notification that a scan has 605d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan // started. 6062b363903f38a515001c5edc7202403fcddb15a01Paul Stewart virtual void OnScanStarted(const NetlinkMessage& netlink_message); 607d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 608618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu // Helper function for setting supplicant_interface_proxy_ pointer. 609618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu void SetSupplicantInterfaceProxy( 6102b363903f38a515001c5edc7202403fcddb15a01Paul Stewart SupplicantInterfaceProxyInterface* supplicant_interface_proxy); 6113c898323878e95b40abcfc6c7a993555d4675323Roshan Pius 6123c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Pointer to the provider object that maintains WiFiService objects. 6132b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiProvider* provider_; 6143c5040174273386868cc8dea8044d22c465885d8Paul Stewart 6159a24553461df7036755060423f90804011612249Eric Shienbrood base::WeakPtrFactory<WiFi> weak_ptr_factory_; 6169a24553461df7036755060423f90804011612249Eric Shienbrood 617ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov // Store cached copies of singletons for speed/ease of testing. 6182b363903f38a515001c5edc7202403fcddb15a01Paul Stewart Time* time_; 619ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov 6202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov bool supplicant_present_; 6212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 622ef76af866aa73abb8c16958844cb13f042881bcbBen Chan std::unique_ptr<SupplicantProcessProxyInterface> supplicant_process_proxy_; 623ef76af866aa73abb8c16958844cb13f042881bcbBen Chan std::unique_ptr<SupplicantInterfaceProxyInterface> 624ef76af866aa73abb8c16958844cb13f042881bcbBen Chan supplicant_interface_proxy_; 625fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu // wpa_supplicant's RPC path for this device/interface. 626fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu std::string supplicant_interface_path_; 6271590839e44a0e922d4763003a35dbd493509b705mukesh agrawal // The rpcid used as the key is wpa_supplicant's D-Bus path for the 6281590839e44a0e922d4763003a35dbd493509b705mukesh agrawal // Endpoint (BSS, in supplicant parlance). 6291590839e44a0e922d4763003a35dbd493509b705mukesh agrawal EndpointMap endpoint_by_rpcid_; 6301590839e44a0e922d4763003a35dbd493509b705mukesh agrawal // Map from Services to the D-Bus path for the corresponding wpa_supplicant 6311590839e44a0e922d4763003a35dbd493509b705mukesh agrawal // Network. 6321590839e44a0e922d4763003a35dbd493509b705mukesh agrawal ReverseServiceMap rpcid_by_service_; 6330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // The Service we are presently connected to. May be nullptr is we're not 6341590839e44a0e922d4763003a35dbd493509b705mukesh agrawal // not connected to any Service. 6351590839e44a0e922d4763003a35dbd493509b705mukesh agrawal WiFiServiceRefPtr current_service_; 6360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // The Service we're attempting to connect to. May be nullptr if we're 6371590839e44a0e922d4763003a35dbd493509b705mukesh agrawal // not attempting to connect to a new Service. If non-NULL, should 6381590839e44a0e922d4763003a35dbd493509b705mukesh agrawal // be distinct from |current_service_|. (A service should not 6391590839e44a0e922d4763003a35dbd493509b705mukesh agrawal // simultaneously be both pending, and current.) 6401590839e44a0e922d4763003a35dbd493509b705mukesh agrawal WiFiServiceRefPtr pending_service_; 6411590839e44a0e922d4763003a35dbd493509b705mukesh agrawal std::string supplicant_state_; 6421590839e44a0e922d4763003a35dbd493509b705mukesh agrawal std::string supplicant_bss_; 6433a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko int32_t supplicant_disconnect_reason_; 6443946da840142cd386d628c0e879459f8976bd86dmukesh agrawal std::string phy_name_; 6455c05b2920be742d518829972127172481722058dmukesh agrawal // Indicates that we should flush supplicant's BSS cache after the 6465c05b2920be742d518829972127172481722058dmukesh agrawal // next scan completes. 6475c05b2920be742d518829972127172481722058dmukesh agrawal bool need_bss_flush_; 6485c05b2920be742d518829972127172481722058dmukesh agrawal struct timeval resumed_at_; 649b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Executes when the (foreground) scan timer expires. Calls ScanTimerHandler. 650b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal base::CancelableClosure scan_timer_callback_; 6512b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart // Executes when a pending service connect timer expires. Calls 6522b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart // PendingTimeoutHandler. 6532b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart base::CancelableClosure pending_timeout_callback_; 654446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart // Executes when a reconnecting service timer expires. Calls 655446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart // ReconnectTimeoutHandler. 656446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart base::CancelableClosure reconnect_timeout_callback_; 6577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Executes periodically while a service is connected, to update the 6587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // signal strength from the currently connected AP. 6597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart base::CancelableClosure request_station_info_callback_; 6603cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // Executes when WPA supplicant reports that a scan has failed via a ScanDone 6613cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // signal. 6623cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan base::CancelableClosure scan_failed_callback_; 663e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Number of remaining fast scans to be done during startup and disconnect. 664e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart int fast_scans_remaining_; 6658f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Indicates that the current BSS has reached the completed state according 6668f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // to supplicant. 6678f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley bool has_already_completed_; 668687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // Indicates that the current BSS for a connected service has changed, which 669687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // implies that a driver-based roam has been initiated. If this roam 670687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // succeeds, we should renew our lease. 671687350531096cacc379c209e39e63e5316eee5c0Paul Stewart bool is_roaming_in_progress_; 672a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Indicates that we are debugging a problematic connection. 673a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart bool is_debugging_connection_; 674735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Tracks the process of an EAP negotiation. 675ef76af866aa73abb8c16958844cb13f042881bcbBen Chan std::unique_ptr<SupplicantEAPStateHandler> eap_state_handler_; 6763946da840142cd386d628c0e879459f8976bd86dmukesh agrawal // Tracks mac80211 state, to diagnose problems such as queue stalls. 677ef76af866aa73abb8c16958844cb13f042881bcbBen Chan std::unique_ptr<Mac80211Monitor> mac80211_monitor_; 678ab87ea4808bd7d002eaad8b021f14c1cad90f65amukesh agrawal 679853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone // Properties 680853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone std::string bgscan_method_; 6817fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t bgscan_short_interval_seconds_; 6827fab89734d88724a288e96a9996b15548c5294c7Ben Chan int32_t bgscan_signal_threshold_dbm_; 6837fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t roam_threshold_db_; 6847fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t scan_interval_seconds_; 685853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 6865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie bool progressive_scan_enabled_; 68704fd04814366616e3ed2c0c6e50e08ac7431773bWade Guthrie std::string scan_configuration_; 6882b363903f38a515001c5edc7202403fcddb15a01Paul Stewart NetlinkManager* netlink_manager_; 68992d0636b757f23cd6176008c86a1468bbd9bcc54Wade Guthrie std::set<uint16_t> all_scan_frequencies_; 690ef76af866aa73abb8c16958844cb13f042881bcbBen Chan std::unique_ptr<ScanSession> scan_session_; 6915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie size_t min_frequencies_to_scan_; 6925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie size_t max_frequencies_to_scan_; 693b86860c21247165ea448a0f84054784cead0c862Wade Guthrie bool scan_all_frequencies_; 6940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 695050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // Holds the list of scan results waiting to be processed and a cancelable 696050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // closure for processing the pending tasks in PendingScanResultsHandler(). 697050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart std::unique_ptr<PendingScanResults> pending_scan_results_; 698050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 6992edd58b88ab77cfa806c9ad43253214987cec82bWade Guthrie // Fraction of previously seen scan frequencies to include in each 7002edd58b88ab77cfa806c9ad43253214987cec82bWade Guthrie // progressive scan batch (since the frequencies are sorted, the sum of the 7012edd58b88ab77cfa806c9ad43253214987cec82bWade Guthrie // fraction_per_scan_ over the scans in a session (* 100) is the percentile 7022edd58b88ab77cfa806c9ad43253214987cec82bWade Guthrie // of the frequencies that have been scanned). 7032edd58b88ab77cfa806c9ad43253214987cec82bWade Guthrie float fraction_per_scan_; 704bee87c282fc49beeceaa0f5bbce34c639ac03816Wade Guthrie 7050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScanState scan_state_; 7060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScanMethod scan_method_; 7070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie chromeos_metrics::Timer scan_timer_; 7080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 709f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Used to compute the number of bytes received since the link went up. 7107fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint64_t receive_byte_count_at_connect_; 711f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 712baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Used to report the current state of our wireless link. 713baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore link_statistics_; 714baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 715235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Wiphy interface index of this WiFi device. 716235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan uint32_t wiphy_index_; 717235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 7183a1bf99b484ad8a9a054518f49046221251d5612Samuel Tan std::unique_ptr<WakeOnWiFi> wake_on_wifi_; 719fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 720618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu std::unique_ptr<TDLSManager> tdls_manager_; 7213c898323878e95b40abcfc6c7a993555d4675323Roshan Pius 722b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart DISALLOW_COPY_AND_ASSIGN(WiFi); 723b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart}; 724b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 725b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart} // namespace shill 726b50f0b9837c398b8edd5dc568eb01bdcff9a4d65Paul Stewart 727d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#endif // SHILL_WIFI_WIFI_H_ 728