1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2013 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//
1621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
17d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#ifndef SHILL_WIFI_WIFI_PROVIDER_H_
18d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#define SHILL_WIFI_WIFI_PROVIDER_H_
1960a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
207c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie#include <time.h>
217c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
22a60a11cd8e584868fbfb4f8734df7e9ed89b3c39Wade Guthrie#include <deque>
2360a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie#include <map>
248a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <string>
258a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <vector>
2660a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
2760a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie#include <gtest/gtest_prod.h>  // for FRIEND_TEST
2821f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
293c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/accessor_interface.h"  // for ByteArrays
30bc14fb7e10919a39d8e82d5981d94961aa5d4be7Paul Stewart#include "shill/provider_interface.h"
3121f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart#include "shill/refptr_types.h"
3221f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
3321f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewartnamespace shill {
3421f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
35d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tanclass ByteString;
3621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewartclass ControlInterface;
3721f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewartclass Error;
3821f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewartclass EventDispatcher;
3921f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewartclass KeyValueStore;
4021f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewartclass Manager;
4121f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewartclass Metrics;
423c5040174273386868cc8dea8044d22c465885d8Paul Stewartclass StoreInterface;
437c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrieclass Time;
4421f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewartclass WiFiEndpoint;
4521f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewartclass WiFiService;
4621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
4721f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart// The WiFi Provider is the holder of all WiFi Services.  It holds both
4821f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart// visible (created due to an Endpoint becoming visible) and invisible
4921f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart// (created due to user or storage configuration) Services.
50bc14fb7e10919a39d8e82d5981d94961aa5d4be7Paul Stewartclass WiFiProvider : public ProviderInterface {
5121f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart public:
527c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  static const char kStorageFrequencies[];
537c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  static const int kMaxStorageFrequencies;
547fab89734d88724a288e96a9996b15548c5294c7Ben Chan  typedef std::map<uint16_t, int64_t> ConnectFrequencyMap;
557c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // The key to |ConnectFrequencyMapDated| is the number of days since the
567c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Epoch.
577c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  typedef std::map<time_t, ConnectFrequencyMap> ConnectFrequencyMapDated;
58a60a11cd8e584868fbfb4f8734df7e9ed89b3c39Wade Guthrie  struct FrequencyCount {
59a60a11cd8e584868fbfb4f8734df7e9ed89b3c39Wade Guthrie    FrequencyCount() : frequency(0), connection_count(0) {}
607fab89734d88724a288e96a9996b15548c5294c7Ben Chan    FrequencyCount(uint16_t freq, size_t conn)
61a60a11cd8e584868fbfb4f8734df7e9ed89b3c39Wade Guthrie        : frequency(freq), connection_count(conn) {}
627fab89734d88724a288e96a9996b15548c5294c7Ben Chan    uint16_t frequency;
63a60a11cd8e584868fbfb4f8734df7e9ed89b3c39Wade Guthrie    size_t connection_count;  // Number of successful connections at this
64a60a11cd8e584868fbfb4f8734df7e9ed89b3c39Wade Guthrie                              // frequency.
65a60a11cd8e584868fbfb4f8734df7e9ed89b3c39Wade Guthrie  };
66a60a11cd8e584868fbfb4f8734df7e9ed89b3c39Wade Guthrie  typedef std::deque<FrequencyCount> FrequencyCountList;
6760a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
682b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiProvider(ControlInterface* control_interface,
692b363903f38a515001c5edc7202403fcddb15a01Paul Stewart               EventDispatcher* dispatcher,
702b363903f38a515001c5edc7202403fcddb15a01Paul Stewart               Metrics* metrics,
712b363903f38a515001c5edc7202403fcddb15a01Paul Stewart               Manager* manager);
725ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan  ~WiFiProvider() override;
7321f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
740e51ad959ff2d81472e053b2809991082f976362Paul Stewart  // Called by Manager as a part of the Provider interface.  The attributes
750e51ad959ff2d81472e053b2809991082f976362Paul Stewart  // used for matching services for the WiFi provider are the SSID, mode and
760e51ad959ff2d81472e053b2809991082f976362Paul Stewart  // security parameters.
772b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void CreateServicesFromProfile(const ProfileRefPtr& profile) override;
78016fa0e9c8f47630c8e6c440ace42ba99f8498dfAlex Vakulenko  ServiceRefPtr FindSimilarService(
792b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const KeyValueStore& args, Error* error) const override;
802b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  ServiceRefPtr GetService(const KeyValueStore& args, Error* error) override;
81016fa0e9c8f47630c8e6c440ace42ba99f8498dfAlex Vakulenko  ServiceRefPtr CreateTemporaryService(
822b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const KeyValueStore& args, Error* error) override;
8318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  ServiceRefPtr CreateTemporaryServiceFromProfile(
842b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const ProfileRefPtr& profile,
852b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const std::string& entry_name,
862b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      Error* error) override;
87016fa0e9c8f47630c8e6c440ace42ba99f8498dfAlex Vakulenko  void Start() override;
88016fa0e9c8f47630c8e6c440ace42ba99f8498dfAlex Vakulenko  void Stop() override;
89d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Find a Service this Endpoint should be associated with.
913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  virtual WiFiServiceRefPtr FindServiceForEndpoint(
922b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const WiFiEndpointConstRefPtr& endpoint);
933c5040174273386868cc8dea8044d22c465885d8Paul Stewart
943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Find or create a Service for |endpoint| to be associated with.  This
953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // method first calls FindServiceForEndpoint, and failing this, creates
963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // a new Service.  It then associates |endpoint| with this service.
972b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  virtual void OnEndpointAdded(const WiFiEndpointConstRefPtr& endpoint);
983c5040174273386868cc8dea8044d22c465885d8Paul Stewart
993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Called by a Device when it removes an Endpoint.  If the Provider
1003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // forgets a service as a result, it returns a reference to the
1013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // forgotten service, otherwise it returns a null reference.
1023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  virtual WiFiServiceRefPtr OnEndpointRemoved(
1032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const WiFiEndpointConstRefPtr& endpoint);
1043c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1050427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  // Called by a Device when it receives notification that an Endpoint
1060427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  // has changed.  Ensure the updated endpoint still matches its
1070427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  // associated service.  If necessary re-assign the endpoint to a new
1080427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  // service, otherwise notify the associated service of the update to
1090427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  // the endpoint.
1102b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  virtual void OnEndpointUpdated(const WiFiEndpointConstRefPtr& endpoint);
1110427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
1123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Called by a WiFiService when it is unloaded and no longer visible.
1132b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  virtual bool OnServiceUnloaded(const WiFiServiceRefPtr& service);
1143c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Get the list of SSIDs for hidden WiFi services we are aware of.
1163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  virtual ByteArrays GetHiddenSSIDList();
1173c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Calls WiFiService::FixupServiceEntries() and adds a UMA metric if
1193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // this causes entries to be updated.
1202b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  virtual void LoadAndFixupServiceEntries(Profile* profile);
12160a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
12260a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  // Save configuration for wifi_provider to |storage|.
1232b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  virtual bool Save(StoreInterface* storage) const;
12460a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
1257fab89734d88724a288e96a9996b15548c5294c7Ben Chan  virtual void IncrementConnectCount(uint16_t frequency_mhz);
12621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
1275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Returns a list of all of the frequencies on which this device has
1285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // connected.  This data is accumulated across multiple shill runs.
1295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  virtual FrequencyCountList GetScanFrequencies() const;
1305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
131574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  // Report the number of auto connectable services available to uma
132574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  // metrics.
133574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu  void ReportAutoConnectableServices();
134574996af8ed3e3c2fe2bc16970f73c665296cfccPeter Qiu
135402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // Returns number of services available for auto-connect.
136402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  virtual int NumAutoConnectableServices();
137402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
138d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  // Returns a list of ByteStrings representing the SSIDs of WiFi services
139d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  // configured for auto-connect.
140d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan  std::vector<ByteString> GetSsidsConfiguredForAutoConnect();
141c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan
1429d97b7deda3ae604d718873207a951f62d418b34Paul Stewart  bool disable_vht() { return disable_vht_; }
1439d97b7deda3ae604d718873207a951f62d418b34Paul Stewart  void set_disable_vht(bool disable_vht) { disable_vht_ = disable_vht; }
1449d97b7deda3ae604d718873207a951f62d418b34Paul Stewart
14521f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart private:
14621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart  friend class WiFiProviderTest;
1477c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  FRIEND_TEST(WiFiProviderTest, FrequencyMapAgingIllegalDay);
1487c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  FRIEND_TEST(WiFiProviderTest, FrequencyMapBasicAging);
14960a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  FRIEND_TEST(WiFiProviderTest, FrequencyMapToStringList);
1507c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  FRIEND_TEST(WiFiProviderTest, FrequencyMapToStringListEmpty);
1517c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  FRIEND_TEST(WiFiProviderTest, IncrementConnectCount);
1527c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  FRIEND_TEST(WiFiProviderTest, IncrementConnectCountCreateNew);
1539842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  FRIEND_TEST(WiFiProviderTest, LoadAndFixupServiceEntriesDefaultProfile);
1549842441bbfae81053a6c08045f1d7b831e5101b2mukesh agrawal  FRIEND_TEST(WiFiProviderTest, LoadAndFixupServiceEntriesUserProfile);
15560a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  FRIEND_TEST(WiFiProviderTest, LoadAndFixupServiceEntriesNothingToDo);
15660a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  FRIEND_TEST(WiFiProviderTest, StringListToFrequencyMap);
1577c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  FRIEND_TEST(WiFiProviderTest, StringListToFrequencyMapEmpty);
15821f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
1592b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  typedef std::map<const WiFiEndpoint*, WiFiServiceRefPtr> EndpointServiceMap;
1600427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
1613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  static const char kManagerErrorSSIDTooLong[];
1623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  static const char kManagerErrorSSIDTooShort[];
1633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  static const char kManagerErrorSSIDRequired[];
1647116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  static const char kManagerErrorUnsupportedSecurityClass[];
1653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  static const char kManagerErrorUnsupportedSecurityMode[];
1663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  static const char kManagerErrorUnsupportedServiceMode[];
1677116093da00d83a9b2a2200e5501fe138cbdd11emukesh agrawal  static const char kManagerErrorArgumentConflict[];
1687c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  static const char kFrequencyDelimiter;
1697c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  static const char kStartWeekHeader[];
1707c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  static const time_t kIllegalStartWeek;
17160a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  static const char kStorageId[];
1727c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  static const time_t kWeeksToKeepFrequencyCounts;
1737c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  static const time_t kSecondsPerWeek;
1743c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Add a service to the service_ vector and register it with the Manager.
1762b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiServiceRefPtr AddService(const std::vector<uint8_t>& ssid,
1772b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                               const std::string& mode,
1782b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                               const std::string& security,
1793c5040174273386868cc8dea8044d22c465885d8Paul Stewart                               bool is_hidden);
1803c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Find a service given its properties.
1822b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiServiceRefPtr FindService(const std::vector<uint8_t>& ssid,
1832b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                const std::string& mode,
1842b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                const std::string& security) const;
1853c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1860e51ad959ff2d81472e053b2809991082f976362Paul Stewart  // Returns a WiFiServiceRefPtr for unit tests and for down-casting to a
1870e51ad959ff2d81472e053b2809991082f976362Paul Stewart  // ServiceRefPtr in GetService().
1882b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiServiceRefPtr GetWiFiService(const KeyValueStore& args, Error* error);
1890e51ad959ff2d81472e053b2809991082f976362Paul Stewart
1903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Disassociate the service from its WiFi device and remove it from the
1913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // services_ vector.
1922b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ForgetService(const WiFiServiceRefPtr& service);
1933c5040174273386868cc8dea8044d22c465885d8Paul Stewart
194facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  void ReportRememberedNetworkCount();
195facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal  void ReportServiceSourceMetrics();
196facf7ad71dd19d113f1457d89e186d5356b130b7mukesh agrawal
197d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  // Retrieve a WiFi service's identifying properties from passed-in |args|.
198d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  // Returns true if |args| are valid and populates |ssid|, |mode|,
199d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  // |security| and |hidden_ssid|, if successful.  Otherwise, this function
200d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart  // returns false and populates |error| with the reason for failure.  It
201f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  // is a fatal error if the "Type" parameter passed in |args| is not kWiFi.
2022b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  static bool GetServiceParametersFromArgs(const KeyValueStore& args,
2032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                           std::vector<uint8_t>* ssid_bytes,
2042b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                           std::string* mode,
2052b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                           std::string* security_method,
2062b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                           bool* hidden_ssid,
2072b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                           Error* error);
20818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  // Retrieve a WiFi service's identifying properties from passed-in |storage|.
20918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  // Return true if storage contain valid parameter values and populates |ssid|,
21018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  // |mode|, |security| and |hidden_ssid|. Otherwise, this function returns
21118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  // false and populates |error| with the reason for failure.
2122b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  static bool GetServiceParametersFromStorage(const StoreInterface* storage,
2132b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                              const std::string& entry_name,
2142b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                              std::vector<uint8_t>* ssid_bytes,
2152b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                              std::string* mode,
2162b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                              std::string* security_method,
2172b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                              bool* hidden_ssid,
2182b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                              Error* error);
219d2e1c360880fe0f23ee7dac785ca1c247544aac1Paul Stewart
22060a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  // Converts frequency profile information from a list of strings of the form
221a60a11cd8e584868fbfb4f8734df7e9ed89b3c39Wade Guthrie  // "frequency:connection_count" to a form consistent with
2227c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // |connect_count_by_frequency_|.  The first string must be of the form
2237c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // [nnn] where |nnn| is a positive integer that represents the creation time
2247c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // (number of days since the Epoch) of the data.
2257c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  static time_t StringListToFrequencyMap(
2262b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const std::vector<std::string>& strings,
2272b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      ConnectFrequencyMap* numbers);
2287c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
2297c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Extracts the start week from the first string in the StringList for
2307c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // |StringListToFrequencyMap|.
2312b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  static time_t GetStringListStartWeek(const std::string& week_string);
2327c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
2337c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Extracts frequency and connection count from a string from the StringList
2347c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // for |StringListToFrequencyMap|.  Places those values in |numbers|.
2352b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  static void ParseStringListFreqCount(const std::string& freq_count_string,
2362b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                       ConnectFrequencyMap* numbers);
23760a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
23860a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  // Converts frequency profile information from a form consistent with
23960a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  // |connect_count_by_frequency_| to a list of strings of the form
2407c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // "frequency:connection_count".  The |creation_day| is the day that the
2417c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // data was first createed (represented as the number of days since the
2427c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // Epoch).
2437c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  static void FrequencyMapToStringList(time_t creation_day,
2442b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                       const ConnectFrequencyMap& numbers,
2452b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                       std::vector<std::string>* strings);
24660a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
2472b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  ControlInterface* control_interface_;
2482b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  EventDispatcher* dispatcher_;
2492b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  Metrics* metrics_;
2502b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  Manager* manager_;
25121f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
2523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  std::vector<WiFiServiceRefPtr> services_;
2530427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EndpointServiceMap service_by_endpoint_;
2540427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
2556c351ff7fea8c93c99b2a9d20bf4d66731603885Paul Stewart  bool running_;
2563c5040174273386868cc8dea8044d22c465885d8Paul Stewart
25760a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  // Map of frequencies at which we've connected and the number of times a
25860a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  // successful connection has been made at that frequency.  Absent frequencies
25960a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  // have not had a successful connection.
26060a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  ConnectFrequencyMap connect_count_by_frequency_;
2617c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  // A number of entries of |ConnectFrequencyMap| stored by date of creation.
2627c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie  ConnectFrequencyMapDated connect_count_by_frequency_dated_;
26360a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
26460a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  // Count of successful wifi connections we've made.
26560a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie  int64_t total_frequency_connections_;
26660a3706bee5686ae2322a774b9e7d5e8e63fcaf7Wade Guthrie
2672b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  Time* time_;
2687c2d34e9273e9ba8fcb8c49282bcd39e5a771ceeWade Guthrie
2699d97b7deda3ae604d718873207a951f62d418b34Paul Stewart  // Disable 802.11ac Very High Throughput (VHT) connections.
2709d97b7deda3ae604d718873207a951f62d418b34Paul Stewart  bool disable_vht_;
2719d97b7deda3ae604d718873207a951f62d418b34Paul Stewart
27221f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart  DISALLOW_COPY_AND_ASSIGN(WiFiProvider);
27321f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart};
27421f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
27521f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart}  // namespace shill
27621f2aae6a9c15c2fb3d43d822f9d963a961b9627Paul Stewart
277d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#endif  // SHILL_WIFI_WIFI_PROVIDER_H_
278