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