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