blob: aedec6c268c372b036720e0657e39a90fff8f5e2 [file] [log] [blame]
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
mukesh agrawalb54601c2011-06-07 17:39:22 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SHILL_WIFI_SERVICE_
6#define SHILL_WIFI_SERVICE_
7
mukesh agrawal261daca2011-12-02 18:56:56 +00008#include <set>
mukesh agrawalb54601c2011-06-07 17:39:22 -07009#include <string>
10#include <vector>
11
Darin Petkov4a09b6b2011-07-19 12:52:06 -070012#include "shill/dbus_bindings/supplicant-interface.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070013#include "shill/event_dispatcher.h"
Chris Masone2b105542011-06-22 10:58:09 -070014#include "shill/refptr_types.h"
mukesh agrawalb54601c2011-06-07 17:39:22 -070015#include "shill/service.h"
mukesh agrawalb54601c2011-06-07 17:39:22 -070016
17namespace shill {
18
Chris Masone6791a432011-07-12 13:23:19 -070019class ControlInterface;
20class EventDispatcher;
mukesh agrawal1a056262011-10-05 14:36:54 -070021class Error;
Chris Masone6791a432011-07-12 13:23:19 -070022class Manager;
Thieu Le3426c8f2012-01-11 17:35:11 -080023class Metrics;
Paul Stewartecf4cd12012-04-17 11:08:39 -070024class NSS;
Chris Masone6791a432011-07-12 13:23:19 -070025
mukesh agrawalb54601c2011-06-07 17:39:22 -070026class WiFiService : public Service {
27 public:
Paul Stewart0756db92012-01-27 08:34:47 -080028 // TODO(pstew): Storage constants shouldn't need to be public
29 // crosbug.com/25813
30 static const char kStorageHiddenSSID[];
31 static const char kStorageMode[];
32 static const char kStoragePassphrase[];
33 static const char kStorageSecurity[];
34 static const char kStorageSSID[];
35
mukesh agrawalb54601c2011-06-07 17:39:22 -070036 WiFiService(ControlInterface *control_interface,
37 EventDispatcher *dispatcher,
Thieu Le3426c8f2012-01-11 17:35:11 -080038 Metrics *metrics,
Chris Masone6791a432011-07-12 13:23:19 -070039 Manager *manager,
Chris Masone2b105542011-06-22 10:58:09 -070040 const WiFiRefPtr &device,
mukesh agrawal7ec71312011-11-10 02:08:26 +000041 const std::vector<uint8_t> &ssid,
Chris Masone092df3e2011-08-22 09:41:39 -070042 const std::string &mode,
Paul Stewartced6a0b2011-11-08 15:32:04 -080043 const std::string &security,
44 bool hidden_ssid);
mukesh agrawalb54601c2011-06-07 17:39:22 -070045 ~WiFiService();
Darin Petkov4d6d9412011-08-24 13:19:54 -070046
47 // Inherited from Service.
mukesh agrawal8a3188d2011-12-01 20:56:44 +000048 virtual void AutoConnect();
Darin Petkov4d6d9412011-08-24 13:19:54 -070049 virtual void Connect(Error *error);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +000050 virtual void Disconnect(Error *error);
Chris Masone34af2182011-08-22 11:59:36 -070051
Paul Stewart22aa71b2011-09-16 12:15:11 -070052 virtual bool TechnologyIs(const Technology::Identifier type) const;
mukesh agrawal8a3188d2011-12-01 20:56:44 +000053 virtual bool IsConnecting() const;
Paul Stewart22aa71b2011-09-16 12:15:11 -070054
mukesh agrawale1d90e92012-02-15 17:36:08 -080055 virtual void AddEndpoint(const WiFiEndpointConstRefPtr endpoint);
56 virtual void RemoveEndpoint(const WiFiEndpointConstRefPtr endpoint);
mukesh agrawal4eb4d782011-12-05 17:34:37 +000057 bool NumEndpoints() const { return endpoints_.size(); }
Paul Stewart81426132012-05-16 10:05:10 -070058 virtual bool Is8021x() const;
59
mukesh agrawale1d90e92012-02-15 17:36:08 -080060
mukesh agrawalb20776f2012-02-10 16:00:36 -080061 // Called to update the identity of the currently connected endpoint.
mukesh agrawale1d90e92012-02-15 17:36:08 -080062 // To indicate that there is no currently connect endpoint, call with
63 // |endpoint| set to NULL.
64 void NotifyCurrentEndpoint(const WiFiEndpoint *endpoint);
mukesh agrawalb20776f2012-02-10 16:00:36 -080065 // Called to inform of changes in the properties of an endpoint.
66 // (Not necessarily the currently connected endpoint.)
67 void NotifyEndpointUpdated(const WiFiEndpoint &endpoint);
mukesh agrawal261daca2011-12-02 18:56:56 +000068
Chris Masone34af2182011-08-22 11:59:36 -070069 // wifi_<MAC>_<BSSID>_<mode_string>_<security_string>
Chris Masone6515aab2011-10-12 16:19:09 -070070 std::string GetStorageIdentifier() const;
Paul Stewarta41e38d2011-11-11 07:47:29 -080071 static bool ParseStorageIdentifier(const std::string &storage_name,
72 std::string *address,
73 std::string *mode,
74 std::string *security);
Chris Masone34af2182011-08-22 11:59:36 -070075
Thieu Le48e6d6d2011-12-06 00:40:27 +000076 const std::string &mode() const { return mode_; }
77 const std::string &key_management() const { return GetEAPKeyManagement(); }
78 const std::vector<uint8_t> &ssid() const { return ssid_; }
mukesh agrawalb54601c2011-06-07 17:39:22 -070079
mukesh agrawal1a056262011-10-05 14:36:54 -070080 void SetPassphrase(const std::string &passphrase, Error *error);
81
Paul Stewartd08f4432011-11-04 07:48:20 -070082 // Overrride Load and Save from parent Service class. We will call
83 // the parent method.
84 virtual bool IsLoadableFrom(StoreInterface *storage) const;
85 virtual bool Load(StoreInterface *storage);
86 virtual bool Save(StoreInterface *storage);
Paul Stewart65512e12012-03-26 18:01:08 -070087 virtual bool Unload();
Paul Stewartd08f4432011-11-04 07:48:20 -070088
mukesh agrawal8a3188d2011-12-01 20:56:44 +000089 virtual bool HasEndpoints() const { return !endpoints_.empty(); }
Paul Stewarta41e38d2011-11-11 07:47:29 -080090 virtual bool IsVisible() const;
Paul Stewart6ab23a92011-11-09 17:17:47 -080091 bool IsSecurityMatch(const std::string &security) const;
Paul Stewartced6a0b2011-11-08 15:32:04 -080092 bool hidden_ssid() const { return hidden_ssid_; }
93
Thieu Le48e6d6d2011-12-06 00:40:27 +000094 virtual void InitializeCustomMetrics() const;
Thieu Leb84ba342012-03-02 15:15:19 -080095 virtual void SendPostReadyStateMetrics(
96 int64 time_resume_to_ready_milliseconds) const;
Thieu Le48e6d6d2011-12-06 00:40:27 +000097
Gaurav Shah10109f22011-11-11 20:16:22 -080098 // Override from parent Service class to correctly update connectability
99 // when the EAP credentials change for 802.1x networks.
100 void set_eap(const EapCredentials& eap);
101
Paul Stewart4357f4e2012-04-26 17:39:26 -0700102 // Override from parent Service class to register hidden services once they
103 // have been configured.
104 virtual void OnProfileConfigured();
105
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000106 protected:
mukesh agrawalbf14e942012-03-02 14:36:34 -0800107 virtual bool IsAutoConnectable(const char **reason) const;
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000108
mukesh agrawalb54601c2011-06-07 17:39:22 -0700109 private:
Paul Stewartd08f4432011-11-04 07:48:20 -0700110 friend class WiFiServiceSecurityTest;
mukesh agrawale1d90e92012-02-15 17:36:08 -0800111 friend class WiFiServiceUpdateFromEndpointsTest; // SignalToStrength
Thieu Lead1ec2c2012-01-05 23:39:48 +0000112 FRIEND_TEST(MetricsTest, WiFiServicePostReady);
Thieu Lee41a72d2012-02-06 20:46:51 +0000113 FRIEND_TEST(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint);
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000114 FRIEND_TEST(WiFiServiceTest, AutoConnect);
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800115 FRIEND_TEST(WiFiServiceTest, ClearWriteOnlyDerivedProperty); // passphrase_
Gaurav Shah10109f22011-11-11 20:16:22 -0800116 FRIEND_TEST(WiFiServiceTest, ConnectTask8021x);
Gaurav Shah29d68882012-01-30 19:06:42 -0800117 FRIEND_TEST(WiFiServiceTest, ConnectTaskDynamicWEP);
Gaurav Shahf8721ee2011-11-07 09:12:46 -0800118 FRIEND_TEST(WiFiServiceTest, ConnectTaskPSK);
Gaurav Shah29d68882012-01-30 19:06:42 -0800119 FRIEND_TEST(WiFiServiceTest, ConnectTaskRSN);
Thieu Lef4cbda92011-11-10 23:41:24 +0000120 FRIEND_TEST(WiFiServiceTest, ConnectTaskWEP);
Gaurav Shah29d68882012-01-30 19:06:42 -0800121 FRIEND_TEST(WiFiServiceTest, ConnectTaskWPA);
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000122 FRIEND_TEST(WiFiServiceTest, IsAutoConnectable);
Paul Stewartd08f4432011-11-04 07:48:20 -0700123 FRIEND_TEST(WiFiServiceTest, LoadHidden);
Paul Stewartd8ad3c42012-01-09 12:39:38 -0800124 FRIEND_TEST(WiFiServiceTest, LoadAndUnloadPassphrase);
Gaurav Shah10109f22011-11-11 20:16:22 -0800125 FRIEND_TEST(WiFiServiceTest, Populate8021x);
Paul Stewart20550982012-04-16 12:16:11 -0700126 FRIEND_TEST(WiFiServiceTest, Populate8021xNoSystemCAs);
127 FRIEND_TEST(WiFiServiceTest, Populate8021xUsingHardwareAuth);
Paul Stewartecf4cd12012-04-17 11:08:39 -0700128 FRIEND_TEST(WiFiServiceTest, Populate8021xNSS);
mukesh agrawale1d90e92012-02-15 17:36:08 -0800129 FRIEND_TEST(WiFiServiceTest, SignalToStrength); // SignalToStrength
Paul Stewartd08f4432011-11-04 07:48:20 -0700130
mukesh agrawalbf14e942012-03-02 14:36:34 -0800131 static const char kAutoConnBusy[];
132 static const char kAutoConnNoEndpoint[];
133
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800134 // Override the base clase implementation, because we need to allow
135 // arguments that aren't base class methods.
136 void HelpRegisterWriteOnlyDerivedString(
Thieu Lef7709452011-11-15 01:13:19 +0000137 const std::string &name,
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800138 void(WiFiService::*set)(const std::string &value, Error *error),
139 void(WiFiService::*clear)(Error *error),
140 const std::string *default_value);
Thieu Lef7709452011-11-15 01:13:19 +0000141
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800142 std::string GetDeviceRpcId(Error *error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800143 void ClearPassphrase(Error *error);
mukesh agrawal29c13a12011-11-24 00:09:19 +0000144 void UpdateConnectable();
mukesh agrawale1d90e92012-02-15 17:36:08 -0800145 void UpdateFromEndpoints();
Chris Masone95207da2011-06-29 16:50:49 -0700146
Thieu Lef4cbda92011-11-10 23:41:24 +0000147 static void ValidateWEPPassphrase(const std::string &passphrase,
148 Error *error);
149 static void ValidateWPAPassphrase(const std::string &passphrase,
150 Error *error);
151 static void ParseWEPPassphrase(const std::string &passphrase,
152 int *key_index,
153 std::vector<uint8> *password_bytes,
154 Error *error);
mukesh agrawal1a056262011-10-05 14:36:54 -0700155 static bool CheckWEPIsHex(const std::string &passphrase, Error *error);
156 static bool CheckWEPKeyIndex(const std::string &passphrase, Error *error);
157 static bool CheckWEPPrefix(const std::string &passphrase, Error *error);
158
mukesh agrawal8f3f7752012-02-17 19:42:09 -0800159 // Maps a signal value, in dBm, to a "strength" value, from
160 // |Service::kStrengthMin| to |Service:kStrengthMax|.
mukesh agrawale1d90e92012-02-15 17:36:08 -0800161 static uint8 SignalToStrength(int16 signal_dbm);
162
Paul Stewart6ab23a92011-11-09 17:17:47 -0800163 // "wpa", "rsn" and "psk" are equivalent from a configuration perspective.
164 // This function maps them all into "psk".
165 static std::string GetSecurityClass(const std::string &security);
166
Paul Stewartd08f4432011-11-04 07:48:20 -0700167 // Profile data for a WPA/RSN service can be stored under a number of
168 // different names. These functions create different storage identifiers
169 // based on whether they are referred to by their generic "psk" name or
170 // if they use the (legacy) specific "wpa" or "rsn" names.
171 std::string GetGenericStorageIdentifier() const;
172 std::string GetSpecificStorageIdentifier() const;
173 std::string GetStorageIdentifierForSecurity(
174 const std::string &security) const;
175
Gaurav Shah10109f22011-11-11 20:16:22 -0800176 // Populate the |params| map with available 802.1x EAP properties.
177 void Populate8021xProperties(std::map<std::string, DBus::Variant> *params);
178
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700179 // Properties
180 std::string passphrase_;
181 bool need_passphrase_;
182 std::string security_;
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700183 // TODO(cmasone): see if the below can be pulled from the endpoint associated
184 // with this service instead.
Chris Masone092df3e2011-08-22 09:41:39 -0700185 const std::string mode_;
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700186 std::string auth_mode_;
187 bool hidden_ssid_;
188 uint16 frequency_;
Paul Stewart20088d82012-02-16 06:58:55 -0800189 // TODO(quiche): I noticed this is not hooked up to anything. In fact, it
190 // was undefined until now. crosbug.com/26490
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700191 uint16 physical_mode_;
mukesh agrawal32399322011-09-01 10:53:43 -0700192 std::string hex_ssid_;
Paul Stewartd08f4432011-11-04 07:48:20 -0700193 std::string storage_identifier_;
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700194
mukesh agrawale1d90e92012-02-15 17:36:08 -0800195 // Track whether or not we've warned about large signal values.
196 // Used to avoid spamming the log.
197 static bool logged_signal_warning;
Chris Masone2b105542011-06-22 10:58:09 -0700198 WiFiRefPtr wifi_;
mukesh agrawal261daca2011-12-02 18:56:56 +0000199 std::set<WiFiEndpointConstRefPtr> endpoints_;
mukesh agrawale1d90e92012-02-15 17:36:08 -0800200 WiFiEndpointConstRefPtr current_endpoint_;
mukesh agrawalb54601c2011-06-07 17:39:22 -0700201 const std::vector<uint8_t> ssid_;
Paul Stewartecf4cd12012-04-17 11:08:39 -0700202 NSS *nss_;
mukesh agrawalb54601c2011-06-07 17:39:22 -0700203 DISALLOW_COPY_AND_ASSIGN(WiFiService);
204};
205
206} // namespace shill
207
208#endif // SHILL_WIFI_SERVICE_