blob: dde6970dea41b474f3c09ecf96e38235af54949a [file] [log] [blame]
Darin Petkovc64fe5e2012-01-11 12:46:13 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Paul Stewart75897df2011-04-27 09:05:53 -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_DEVICE_
6#define SHILL_DEVICE_
7
Chris Masone46eaaf52011-05-24 13:08:30 -07008#include <string>
Chris Masone9be4a9d2011-05-16 15:44:09 -07009#include <vector>
10
Chris Masone8fe2c7e2011-06-09 15:51:19 -070011#include <base/basictypes.h>
Eric Shienbrood3e20a232012-02-16 11:35:56 -050012#include <base/callback.h>
Chris Masone487b8bf2011-05-13 16:27:57 -070013#include <base/memory/ref_counted.h>
Paul Stewartb50f0b92011-05-16 16:31:42 -070014#include <base/memory/scoped_ptr.h>
Darin Petkovafa6fc42011-06-21 16:21:08 -070015#include <gtest/gtest_prod.h> // for FRIEND_TEST
Paul Stewartd5843772011-05-11 15:40:42 -070016
Paul Stewart26b327e2011-10-19 11:38:09 -070017#include "shill/event_dispatcher.h"
Paul Stewart2bf1d352011-12-06 15:02:55 -080018#include "shill/ip_address.h"
Darin Petkovafa6fc42011-06-21 16:21:08 -070019#include "shill/ipconfig.h"
Paul Stewart20088d82012-02-16 06:58:55 -080020#include "shill/portal_detector.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070021#include "shill/property_store.h"
Chris Masone2b105542011-06-22 10:58:09 -070022#include "shill/refptr_types.h"
Paul Stewart03dba0b2011-08-22 16:32:45 -070023#include "shill/service.h"
Paul Stewartfdd16072011-09-16 12:41:35 -070024#include "shill/technology.h"
Paul Stewart75897df2011-04-27 09:05:53 -070025
26namespace shill {
27
Chris Masone9be4a9d2011-05-16 15:44:09 -070028class ControlInterface;
Darin Petkov77cb6812011-08-15 16:19:41 -070029class DHCPProvider;
Chris Masone9be4a9d2011-05-16 15:44:09 -070030class DeviceAdaptorInterface;
Paul Stewartf1ce5d22011-05-19 13:10:20 -070031class Endpoint;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070032class Error;
33class EventDispatcher;
Paul Stewartf1ce5d22011-05-19 13:10:20 -070034class Manager;
Thieu Le3426c8f2012-01-11 17:35:11 -080035class Metrics;
Darin Petkove5bc2cb2011-12-07 14:47:32 +010036class ReturnerInterface;
Thieu Lefb46caf2012-03-08 11:57:15 -080037class RoutingTable;
38class RTNLHandler;
Chris Masone9be4a9d2011-05-16 15:44:09 -070039
Paul Stewart75897df2011-04-27 09:05:53 -070040// Device superclass. Individual network interfaces types will inherit from
41// this class.
Chris Masone27c4aa52011-07-02 13:10:14 -070042class Device : public base::RefCounted<Device> {
Paul Stewart75897df2011-04-27 09:05:53 -070043 public:
Chris Masone9be4a9d2011-05-16 15:44:09 -070044 // A constructor for the Device object
45 Device(ControlInterface *control_interface,
Paul Stewartb50f0b92011-05-16 16:31:42 -070046 EventDispatcher *dispatcher,
Thieu Le3426c8f2012-01-11 17:35:11 -080047 Metrics *metrics,
Paul Stewartf1ce5d22011-05-19 13:10:20 -070048 Manager *manager,
Darin Petkovafa6fc42011-06-21 16:21:08 -070049 const std::string &link_name,
Chris Masone626719f2011-08-18 16:58:48 -070050 const std::string &address,
Gaurav Shah435de2c2011-11-17 19:01:07 -080051 int interface_index,
52 Technology::Identifier technology);
Chris Masone9be4a9d2011-05-16 15:44:09 -070053 virtual ~Device();
54
55 virtual void Start();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070056
57 // Clear running state, especially any fields that hold a reference back
58 // to us. After a call to Stop(), the Device may be restarted (with a call
59 // to Start()), or destroyed (if its refcount falls to zero).
Chris Masone9be4a9d2011-05-16 15:44:09 -070060 virtual void Stop();
61
Gaurav Shah435de2c2011-11-17 19:01:07 -080062
63 // TODO(gauravsh): We do not really need this since technology() can be used
64 // to get a device's technology for direct comparison.
Darin Petkovafa6fc42011-06-21 16:21:08 -070065 // Base method always returns false.
Paul Stewartfdd16072011-09-16 12:41:35 -070066 virtual bool TechnologyIs(const Technology::Identifier type) const;
Darin Petkovafa6fc42011-06-21 16:21:08 -070067
Paul Stewartf1ce5d22011-05-19 13:10:20 -070068 virtual void LinkEvent(unsigned flags, unsigned change);
Paul Stewart75897df2011-04-27 09:05:53 -070069
Darin Petkov9ae310f2011-08-30 15:41:13 -070070 // The default implementation sets |error| to kNotSupported.
Darin Petkovc0865312011-09-16 15:31:20 -070071 virtual void Scan(Error *error);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050072 virtual void RegisterOnNetwork(const std::string &network_id,
73 ReturnerInterface *returner);
Darin Petkovc64fe5e2012-01-11 12:46:13 +010074 virtual void RequirePIN(
75 const std::string &pin, bool require, ReturnerInterface *returner);
Darin Petkove5bc2cb2011-12-07 14:47:32 +010076 virtual void EnterPIN(const std::string &pin, ReturnerInterface *returner);
Darin Petkove42e1012011-08-31 12:35:04 -070077 virtual void UnblockPIN(const std::string &unblock_code,
78 const std::string &pin,
Darin Petkovc64fe5e2012-01-11 12:46:13 +010079 ReturnerInterface *returner);
Darin Petkove42e1012011-08-31 12:35:04 -070080 virtual void ChangePIN(const std::string &old_pin,
81 const std::string &new_pin,
Darin Petkovc64fe5e2012-01-11 12:46:13 +010082 ReturnerInterface *returner);
Paul Stewart2bf1d352011-12-06 15:02:55 -080083 virtual void DisableIPv6();
84 virtual void EnableIPv6();
85 virtual void EnableIPv6Privacy();
Darin Petkov9ae310f2011-08-30 15:41:13 -070086
Paul Stewartc8f4bef2011-12-13 09:45:51 -080087 // Request the removal of reverse-path filtering for this interface.
88 // This will allow packets destined for this interface to be accepted,
89 // even if this is not the default route for such a packet to arrive.
90 virtual void DisableReversePathFilter();
91
92 // Request reverse-path filtering for this interface.
93 virtual void EnableReversePathFilter();
94
Gaurav Shah435de2c2011-11-17 19:01:07 -080095 // Returns true if the selected service on the device (if any) is connected.
96 // Returns false if there is no selected service, or if the selected service
97 // is not connected.
98 bool IsConnected() const;
99
Paul Stewartc681fa02012-03-02 19:40:04 -0800100 // Requests that portal detection be done, if this device has the default
101 // connection. Returns true if portal detection was started.
102 virtual bool RequestPortalDetection();
103
Chris Masone27c4aa52011-07-02 13:10:14 -0700104 std::string GetRpcIdentifier();
Chris Masone5dec5f42011-07-22 14:07:55 -0700105 std::string GetStorageIdentifier();
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700106
Chris Masone9d779932011-08-25 16:33:41 -0700107 const std::string &address() const { return hardware_address_; }
Darin Petkove0a312e2011-07-20 13:45:28 -0700108 const std::string &link_name() const { return link_name_; }
109 int interface_index() const { return interface_index_; }
Paul Stewarte6132022011-08-16 09:11:02 -0700110 const ConnectionRefPtr &connection() const { return connection_; }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800111 bool powered() const { return powered_; }
Gaurav Shah435de2c2011-11-17 19:01:07 -0800112 virtual Technology::Identifier technology() const { return technology_; }
Jason Glasgowb5790052012-01-27 01:03:52 -0500113 std::string GetTechnologyString(Error *error);
Darin Petkove0a312e2011-07-20 13:45:28 -0700114
Darin Petkov31a2eca2012-03-14 11:07:18 +0100115 const IPConfigRefPtr &ipconfig() const { return ipconfig_; }
116 void set_ipconfig(const IPConfigRefPtr &config) { ipconfig_ = config; }
117
Chris Masone19e30402011-07-19 15:48:47 -0700118 const std::string &FriendlyName() const;
Chris Masone27c4aa52011-07-02 13:10:14 -0700119
Darin Petkovafa6fc42011-06-21 16:21:08 -0700120 // Returns a string that is guaranteed to uniquely identify this Device
121 // instance.
122 const std::string &UniqueName() const;
Chris Masonea82b7112011-05-25 15:16:29 -0700123
mukesh agrawalde29fa82011-09-16 16:16:36 -0700124 PropertyStore *mutable_store() { return &store_; }
125 const PropertyStore &store() const { return store_; }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700126 RTNLHandler *rtnl_handler() { return rtnl_handler_; }
Chris Masone19e30402011-07-19 15:48:47 -0700127
Darin Petkovb05315f2011-11-07 10:14:25 +0100128 EventDispatcher *dispatcher() const { return dispatcher_; }
129
Paul Stewarta41e38d2011-11-11 07:47:29 -0800130 // Load configuration for the device from |storage|. This may include
131 // instantiating non-visible services for which configuration has been
132 // stored.
133 virtual bool Load(StoreInterface *storage);
134
135 // Save configuration for the device to |storage|.
Chris Masone877ff982011-09-21 16:18:24 -0700136 virtual bool Save(StoreInterface *storage);
Chris Masone5dec5f42011-07-22 14:07:55 -0700137
Darin Petkov77cb6812011-08-15 16:19:41 -0700138 void set_dhcp_provider(DHCPProvider *provider) { dhcp_provider_ = provider; }
139
Darin Petkov3cfbf212011-11-21 16:02:09 +0100140 DeviceAdaptorInterface *adaptor() const { return adaptor_.get(); }
141
Paul Stewartd5843772011-05-11 15:40:42 -0700142 protected:
Paul Stewart2bf1d352011-12-06 15:02:55 -0800143 FRIEND_TEST(DeviceTest, AcquireIPConfig);
Darin Petkovafa6fc42011-06-21 16:21:08 -0700144 FRIEND_TEST(DeviceTest, DestroyIPConfig);
145 FRIEND_TEST(DeviceTest, DestroyIPConfigNULL);
Chris Masone95207da2011-06-29 16:50:49 -0700146 FRIEND_TEST(DeviceTest, GetProperties);
Chris Masone5dec5f42011-07-22 14:07:55 -0700147 FRIEND_TEST(DeviceTest, Save);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700148 FRIEND_TEST(DeviceTest, SelectedService);
Paul Stewartc681fa02012-03-02 19:40:04 -0800149 FRIEND_TEST(DeviceTest, SetServiceConnectedState);
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700150 FRIEND_TEST(DeviceTest, Stop);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800151 FRIEND_TEST(ManagerTest, DeviceRegistrationAndStart);
Gaurav Shah435de2c2011-11-17 19:01:07 -0800152 FRIEND_TEST(ManagerTest, ConnectedTechnologies);
153 FRIEND_TEST(ManagerTest, DefaultTechnology);
mukesh agrawal32399322011-09-01 10:53:43 -0700154 FRIEND_TEST(WiFiMainTest, Connect);
Darin Petkovafa6fc42011-06-21 16:21:08 -0700155
156 // If there's an IP configuration in |ipconfig_|, releases the IP address and
157 // destroys the configuration instance.
158 void DestroyIPConfig();
159
160 // Creates a new DHCP IP configuration instance, stores it in |ipconfig_| and
161 // requests a new IP configuration. Registers a callback to
162 // IPConfigUpdatedCallback on IP configuration changes. Returns true if the IP
163 // request was successfully sent.
Paul Stewart2bf1d352011-12-06 15:02:55 -0800164 bool AcquireIPConfig();
Darin Petkovafa6fc42011-06-21 16:21:08 -0700165
Darin Petkov79d74c92012-03-07 17:20:32 +0100166 // Callback invoked on every IP configuration update.
167 void OnIPConfigUpdated(const IPConfigRefPtr &ipconfig, bool success);
168
Paul Stewarte6132022011-08-16 09:11:02 -0700169 // Maintain connection state (Routes, IP Addresses and DNS) in the OS.
170 void CreateConnection();
171
172 // Remove connection state
173 void DestroyConnection();
174
Paul Stewart03dba0b2011-08-22 16:32:45 -0700175 // Selects a service to be "current" -- i.e. link-state or configuration
176 // events that happen to the device are attributed to this service.
177 void SelectService(const ServiceRefPtr &service);
178
179 // Set the state of the selected service
180 void SetServiceState(Service::ConnectState state);
181
182 // Set the failure of the selected service (implicitly sets the state to
183 // "failure")
184 void SetServiceFailure(Service::ConnectFailure failure_state);
185
Paul Stewart20088d82012-02-16 06:58:55 -0800186 // Called by the Portal Detector whenever a trial completes. Device
187 // subclasses that choose unique mappings from portal results to connected
188 // states can override this method in order to do so.
189 virtual void PortalDetectorCallback(const PortalDetector::Result &result);
190
191 // Initiate portal detection, if enabled for this device type.
192 bool StartPortalDetection();
193
194 // Stop portal detection if it is running.
195 void StopPortalDetection();
196
197 // Set the state of the selected service, with checks to make sure
198 // the service is already in a connected state before doing so.
199 void SetServiceConnectedState(Service::ConnectState state);
200
Jason Glasgowb5790052012-01-27 01:03:52 -0500201 void HelpRegisterDerivedString(
202 const std::string &name,
203 std::string(Device::*get)(Error *),
204 void(Device::*set)(const std::string&, Error *));
Chris Masone27c4aa52011-07-02 13:10:14 -0700205 void HelpRegisterDerivedStrings(const std::string &name,
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800206 Strings(Device::*get)(Error *),
mukesh agrawalffa3d042011-10-06 15:26:10 -0700207 void(Device::*set)(const Strings&, Error *));
Chris Masoneb925cc82011-06-22 15:39:57 -0700208
Paul Stewartac4ac002011-08-26 12:04:26 -0700209 // Property getters reserved for subclasses
210 ControlInterface *control_interface() const { return control_interface_; }
Thieu Le3426c8f2012-01-11 17:35:11 -0800211 Metrics *metrics() const { return metrics_; }
Paul Stewartac4ac002011-08-26 12:04:26 -0700212 Manager *manager() const { return manager_; }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800213 bool running() const { return running_; }
Paul Stewartd5843772011-05-11 15:40:42 -0700214
Paul Stewart75897df2011-04-27 09:05:53 -0700215 private:
Chris Masone413a3192011-05-09 17:10:05 -0700216 friend class DeviceAdaptorInterface;
Paul Stewartc681fa02012-03-02 19:40:04 -0800217 friend class DevicePortalDetectionTest;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700218 friend class DeviceTest;
219 friend class CellularTest;
220 friend class WiFiMainTest;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700221
Paul Stewart2bf1d352011-12-06 15:02:55 -0800222 static const char kIPFlagTemplate[];
223 static const char kIPFlagVersion4[];
224 static const char kIPFlagVersion6[];
225 static const char kIPFlagDisableIPv6[];
226 static const char kIPFlagUseTempAddr[];
227 static const char kIPFlagUseTempAddrUsedAndDefault[];
Paul Stewartc8f4bef2011-12-13 09:45:51 -0800228 static const char kIPFlagReversePathFilter[];
229 static const char kIPFlagReversePathFilterEnabled[];
230 static const char kIPFlagReversePathFilterLooseMode[];
Chris Masone5dec5f42011-07-22 14:07:55 -0700231 static const char kStoragePowered[];
232 static const char kStorageIPConfigs[];
233
Chris Masone5dec5f42011-07-22 14:07:55 -0700234 // Right now, Devices reference IPConfigs directly when persisted to disk
235 // It's not clear that this makes sense long-term, but that's how it is now.
236 // This call generates a string in the right format for this persisting.
Chris Masone34af2182011-08-22 11:59:36 -0700237 // |suffix| is injected into the storage identifier used for the configs.
238 std::string SerializeIPConfigs(const std::string &suffix);
Chris Masone5dec5f42011-07-22 14:07:55 -0700239
Paul Stewart2bf1d352011-12-06 15:02:55 -0800240 // Set an IP configuration flag on the device. |ip_version| should be
241 // "ipv6" or "ipv4". |flag| should be the name of the flag to be set
242 // and |value| is what this flag should be set to.
243 bool SetIPFlag(IPAddress::Family family, const std::string &flag,
244 const std::string &value);
245
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800246 std::vector<std::string> AvailableIPConfigs(Error *error);
Chris Masone4e851612011-07-01 10:46:53 -0700247 std::string GetRpcConnectionIdentifier();
248
Paul Stewartac4ac002011-08-26 12:04:26 -0700249 // Properties
Paul Stewarta41e38d2011-11-11 07:47:29 -0800250 bool powered_; // indicates whether the device is configured to operate
Paul Stewartac4ac002011-08-26 12:04:26 -0700251 bool reconnect_;
252 const std::string hardware_address_;
253
254 PropertyStore store_;
255
Paul Stewartac4ac002011-08-26 12:04:26 -0700256 const int interface_index_;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800257 bool running_; // indicates whether the device is actually in operation
Paul Stewartac4ac002011-08-26 12:04:26 -0700258 const std::string link_name_;
259 const std::string unique_id_;
260 ControlInterface *control_interface_;
261 EventDispatcher *dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800262 Metrics *metrics_;
Paul Stewartac4ac002011-08-26 12:04:26 -0700263 Manager *manager_;
264 IPConfigRefPtr ipconfig_;
265 ConnectionRefPtr connection_;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700266 scoped_ptr<DeviceAdaptorInterface> adaptor_;
Paul Stewart20088d82012-02-16 06:58:55 -0800267 scoped_ptr<PortalDetector> portal_detector_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500268 base::Callback<void(const PortalDetector::Result &)>
269 portal_detector_callback_;
Gaurav Shah435de2c2011-11-17 19:01:07 -0800270 Technology::Identifier technology_;
Thieu Le85e050b2012-03-13 15:04:38 -0700271 // The number of portal detection attempts from Connected to Online state.
272 // This includes all failure/timeout attempts and the final successful
273 // attempt.
274 int portal_attempts_to_online_;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700275
Paul Stewart03dba0b2011-08-22 16:32:45 -0700276 // Maintain a reference to the connected / connecting service
277 ServiceRefPtr selected_service_;
278
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700279 // Cache singleton pointers for performance and test purposes.
Darin Petkov77cb6812011-08-15 16:19:41 -0700280 DHCPProvider *dhcp_provider_;
Thieu Lefb46caf2012-03-08 11:57:15 -0800281 RoutingTable *routing_table_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700282 RTNLHandler *rtnl_handler_;
Darin Petkov77cb6812011-08-15 16:19:41 -0700283
Chris Masone9be4a9d2011-05-16 15:44:09 -0700284 DISALLOW_COPY_AND_ASSIGN(Device);
Paul Stewart75897df2011-04-27 09:05:53 -0700285};
286
Paul Stewart75897df2011-04-27 09:05:53 -0700287} // namespace shill
288
289#endif // SHILL_DEVICE_