blob: 5e745458a6094ef45424d61ae22b3980a307dc0f [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>
Chris Masone487b8bf2011-05-13 16:27:57 -070012#include <base/memory/ref_counted.h>
Paul Stewartb50f0b92011-05-16 16:31:42 -070013#include <base/memory/scoped_ptr.h>
Eric Shienbrood9a245532012-03-07 14:20:39 -050014#include <base/memory/weak_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
Eric Shienbrood9a245532012-03-07 14:20:39 -050017#include "shill/adaptor_interfaces.h"
18#include "shill/callbacks.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070019#include "shill/event_dispatcher.h"
Paul Stewart2bf1d352011-12-06 15:02:55 -080020#include "shill/ip_address.h"
Darin Petkovafa6fc42011-06-21 16:21:08 -070021#include "shill/ipconfig.h"
Paul Stewart20088d82012-02-16 06:58:55 -080022#include "shill/portal_detector.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070023#include "shill/property_store.h"
Chris Masone2b105542011-06-22 10:58:09 -070024#include "shill/refptr_types.h"
Paul Stewart03dba0b2011-08-22 16:32:45 -070025#include "shill/service.h"
Paul Stewartfdd16072011-09-16 12:41:35 -070026#include "shill/technology.h"
Paul Stewart75897df2011-04-27 09:05:53 -070027
28namespace shill {
29
Chris Masone9be4a9d2011-05-16 15:44:09 -070030class ControlInterface;
Darin Petkov77cb6812011-08-15 16:19:41 -070031class DHCPProvider;
Chris Masone9be4a9d2011-05-16 15:44:09 -070032class DeviceAdaptorInterface;
Paul Stewartf1ce5d22011-05-19 13:10:20 -070033class Endpoint;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070034class Error;
35class EventDispatcher;
Paul Stewartf1ce5d22011-05-19 13:10:20 -070036class Manager;
Thieu Le3426c8f2012-01-11 17:35:11 -080037class Metrics;
Thieu Lefb46caf2012-03-08 11:57:15 -080038class 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
Eric Shienbrood9a245532012-03-07 14:20:39 -050055 // Enable or disable the device.
56 virtual void SetEnabled(bool enable);
57 // Enable or disable the device, and save the setting in the profile.
58 // The setting is persisted before the enable or disable operation
59 // starts, so that even if it fails, the user's intent is still recorded
60 // for the next time shill restarts.
Jason Glasgowdf7c5532012-05-14 14:41:45 -040061 virtual void SetEnabledPersistent(bool enable,
62 Error *error,
63 const ResultCallback &callback);
Gaurav Shah435de2c2011-11-17 19:01:07 -080064
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040065 // Returns true if the underlying device reports that it is already enabled.
66 // Used when the device is registered with the Manager, so that shill can
67 // sync its state/ with the true state of the device. The default is to
68 // report false.
69 virtual bool IsUnderlyingDeviceEnabled() const;
70
Gaurav Shah435de2c2011-11-17 19:01:07 -080071 // TODO(gauravsh): We do not really need this since technology() can be used
72 // to get a device's technology for direct comparison.
Darin Petkovafa6fc42011-06-21 16:21:08 -070073 // Base method always returns false.
Paul Stewartfdd16072011-09-16 12:41:35 -070074 virtual bool TechnologyIs(const Technology::Identifier type) const;
Darin Petkovafa6fc42011-06-21 16:21:08 -070075
Paul Stewartf1ce5d22011-05-19 13:10:20 -070076 virtual void LinkEvent(unsigned flags, unsigned change);
Paul Stewart75897df2011-04-27 09:05:53 -070077
Darin Petkov9ae310f2011-08-30 15:41:13 -070078 // The default implementation sets |error| to kNotSupported.
Darin Petkovc0865312011-09-16 15:31:20 -070079 virtual void Scan(Error *error);
Eric Shienbrood9a245532012-03-07 14:20:39 -050080 virtual void RegisterOnNetwork(const std::string &network_id, Error *error,
81 const ResultCallback &callback);
82 virtual void RequirePIN(const std::string &pin, bool require,
83 Error *error, const ResultCallback &callback);
84 virtual void EnterPIN(const std::string &pin,
85 Error *error, const ResultCallback &callback);
Darin Petkove42e1012011-08-31 12:35:04 -070086 virtual void UnblockPIN(const std::string &unblock_code,
87 const std::string &pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -050088 Error *error, const ResultCallback &callback);
Darin Petkove42e1012011-08-31 12:35:04 -070089 virtual void ChangePIN(const std::string &old_pin,
90 const std::string &new_pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -050091 Error *error, const ResultCallback &callback);
Paul Stewart2bf1d352011-12-06 15:02:55 -080092 virtual void DisableIPv6();
93 virtual void EnableIPv6();
94 virtual void EnableIPv6Privacy();
Darin Petkov9ae310f2011-08-30 15:41:13 -070095
Paul Stewartc8f4bef2011-12-13 09:45:51 -080096 // Request the removal of reverse-path filtering for this interface.
97 // This will allow packets destined for this interface to be accepted,
98 // even if this is not the default route for such a packet to arrive.
99 virtual void DisableReversePathFilter();
100
101 // Request reverse-path filtering for this interface.
102 virtual void EnableReversePathFilter();
103
Gaurav Shah435de2c2011-11-17 19:01:07 -0800104 // Returns true if the selected service on the device (if any) is connected.
105 // Returns false if there is no selected service, or if the selected service
106 // is not connected.
107 bool IsConnected() const;
108
Paul Stewartd215af62012-04-24 23:25:50 -0700109 // Returns true if the selected service on the device (if any) is connected
110 // and matches the passed-in argument |service|. Returns false if there is
111 // no connected service, or if it does not match |service|.
112 virtual bool IsConnectedToService(const ServiceRefPtr &service) const;
113
114 // Restart the portal detection process on a connected device. This is
115 // useful if the properties on the connected service have changed in a
116 // way that may affect the decision to run portal detection at all.
117 // Returns true if portal detection was started.
118 virtual bool RestartPortalDetection();
119
Paul Stewartc681fa02012-03-02 19:40:04 -0800120 // Requests that portal detection be done, if this device has the default
121 // connection. Returns true if portal detection was started.
122 virtual bool RequestPortalDetection();
123
Chris Masone27c4aa52011-07-02 13:10:14 -0700124 std::string GetRpcIdentifier();
Chris Masone5dec5f42011-07-22 14:07:55 -0700125 std::string GetStorageIdentifier();
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700126
Chris Masone9d779932011-08-25 16:33:41 -0700127 const std::string &address() const { return hardware_address_; }
Darin Petkove0a312e2011-07-20 13:45:28 -0700128 const std::string &link_name() const { return link_name_; }
129 int interface_index() const { return interface_index_; }
Paul Stewarte6132022011-08-16 09:11:02 -0700130 const ConnectionRefPtr &connection() const { return connection_; }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500131 bool enabled() const { return enabled_; }
132 bool enabled_persistent() const { return enabled_persistent_; }
Gaurav Shah435de2c2011-11-17 19:01:07 -0800133 virtual Technology::Identifier technology() const { return technology_; }
Jason Glasgowb5790052012-01-27 01:03:52 -0500134 std::string GetTechnologyString(Error *error);
Darin Petkove0a312e2011-07-20 13:45:28 -0700135
Darin Petkov31a2eca2012-03-14 11:07:18 +0100136 const IPConfigRefPtr &ipconfig() const { return ipconfig_; }
137 void set_ipconfig(const IPConfigRefPtr &config) { ipconfig_ = config; }
138
Chris Masone19e30402011-07-19 15:48:47 -0700139 const std::string &FriendlyName() const;
Chris Masone27c4aa52011-07-02 13:10:14 -0700140
Darin Petkovafa6fc42011-06-21 16:21:08 -0700141 // Returns a string that is guaranteed to uniquely identify this Device
142 // instance.
143 const std::string &UniqueName() const;
Chris Masonea82b7112011-05-25 15:16:29 -0700144
mukesh agrawalde29fa82011-09-16 16:16:36 -0700145 PropertyStore *mutable_store() { return &store_; }
146 const PropertyStore &store() const { return store_; }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700147 RTNLHandler *rtnl_handler() { return rtnl_handler_; }
Chris Masone19e30402011-07-19 15:48:47 -0700148
Darin Petkovb05315f2011-11-07 10:14:25 +0100149 EventDispatcher *dispatcher() const { return dispatcher_; }
150
Paul Stewarta41e38d2011-11-11 07:47:29 -0800151 // Load configuration for the device from |storage|. This may include
152 // instantiating non-visible services for which configuration has been
153 // stored.
154 virtual bool Load(StoreInterface *storage);
155
156 // Save configuration for the device to |storage|.
Chris Masone877ff982011-09-21 16:18:24 -0700157 virtual bool Save(StoreInterface *storage);
Chris Masone5dec5f42011-07-22 14:07:55 -0700158
Darin Petkov77cb6812011-08-15 16:19:41 -0700159 void set_dhcp_provider(DHCPProvider *provider) { dhcp_provider_ = provider; }
160
Darin Petkov3cfbf212011-11-21 16:02:09 +0100161 DeviceAdaptorInterface *adaptor() const { return adaptor_.get(); }
162
Paul Stewartd5843772011-05-11 15:40:42 -0700163 protected:
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400164 FRIEND_TEST(CellularTest, ModemStateChangeDisable);
Darin Petkov13e6d552012-05-09 14:22:23 +0200165 FRIEND_TEST(ConnectionTest, OnRouteQueryResponse);
Paul Stewart2bf1d352011-12-06 15:02:55 -0800166 FRIEND_TEST(DeviceTest, AcquireIPConfig);
Darin Petkovafa6fc42011-06-21 16:21:08 -0700167 FRIEND_TEST(DeviceTest, DestroyIPConfig);
168 FRIEND_TEST(DeviceTest, DestroyIPConfigNULL);
Chris Masone95207da2011-06-29 16:50:49 -0700169 FRIEND_TEST(DeviceTest, GetProperties);
Chris Masone5dec5f42011-07-22 14:07:55 -0700170 FRIEND_TEST(DeviceTest, Save);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700171 FRIEND_TEST(DeviceTest, SelectedService);
Paul Stewartc681fa02012-03-02 19:40:04 -0800172 FRIEND_TEST(DeviceTest, SetServiceConnectedState);
Paul Stewart8c116a92012-05-02 18:30:03 -0700173 FRIEND_TEST(DeviceTest, Start);
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700174 FRIEND_TEST(DeviceTest, Stop);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800175 FRIEND_TEST(ManagerTest, DeviceRegistrationAndStart);
Gaurav Shah435de2c2011-11-17 19:01:07 -0800176 FRIEND_TEST(ManagerTest, ConnectedTechnologies);
177 FRIEND_TEST(ManagerTest, DefaultTechnology);
Jason Glasgowdf7c5532012-05-14 14:41:45 -0400178 FRIEND_TEST(ManagerTest, EnableTechnology);
179 FRIEND_TEST(ManagerTest, DisableTechnology);
mukesh agrawal32399322011-09-01 10:53:43 -0700180 FRIEND_TEST(WiFiMainTest, Connect);
Darin Petkovafa6fc42011-06-21 16:21:08 -0700181
Eric Shienbrood9a245532012-03-07 14:20:39 -0500182 // Each device must implement this method to do the work needed to
183 // enable the device to operate for establishing network connections.
184 // The |error| argument, if not NULL,
185 // will refer to an Error that starts out with the value
186 // Error::kOperationInitiated. This reflects the assumption that
187 // enable (and disable) operations will usually be non-blocking,
188 // and their completion will be indicated by means of an asynchronous
189 // reply sometime later. There are two circumstances in which a
190 // device's Start() method may overwrite |error|:
191 //
192 // 1. If an early failure is detected, such that the non-blocking
193 // part of the operation never takes place, then |error| should
194 // be set to the appropriate value corresponding to the type
195 // of failure. This is the "immediate failure" case.
196 // 2. If the device is enabled without performing any non-blocking
197 // steps, then |error| should be Reset, i.e., its value set
198 // to Error::kSuccess. This is the "immediate success" case.
199 //
200 // In these two cases, because completion is immediate, |callback|
201 // is not used. If neither of these two conditions holds, then |error|
202 // should not be modified, and |callback| should be passed to the
203 // method that will initiate the non-blocking operation.
204 virtual void Start(Error *error,
205 const EnabledStateChangedCallback &callback) = 0;
206
207 // Each device must implement this method to do the work needed to
208 // disable the device, i.e., clear any running state, and make the
209 // device no longer capable of establishing network connections.
210 // The discussion for Start() regarding the use of |error| and
211 // |callback| apply to Stop() as well.
212 virtual void Stop(Error *error,
213 const EnabledStateChangedCallback &callback) = 0;
214
215 // The EnabledStateChangedCallback that gets passed to the device's
216 // Start() and Stop() methods is bound to this method. |callback|
217 // is the callback that was passed to SetEnabled().
218 void OnEnabledStateChanged(const ResultCallback &callback,
219 const Error &error);
220
Darin Petkovafa6fc42011-06-21 16:21:08 -0700221 // If there's an IP configuration in |ipconfig_|, releases the IP address and
222 // destroys the configuration instance.
223 void DestroyIPConfig();
224
225 // Creates a new DHCP IP configuration instance, stores it in |ipconfig_| and
Paul Stewartd408fdf2012-05-07 17:15:57 -0700226 // requests a new IP configuration. Saves the DHCP lease to the generic
227 // lease filename based on the interface name. Registers a callback to
Darin Petkovafa6fc42011-06-21 16:21:08 -0700228 // IPConfigUpdatedCallback on IP configuration changes. Returns true if the IP
229 // request was successfully sent.
Paul Stewart2bf1d352011-12-06 15:02:55 -0800230 bool AcquireIPConfig();
Darin Petkovafa6fc42011-06-21 16:21:08 -0700231
Paul Stewartd408fdf2012-05-07 17:15:57 -0700232 // Creates a new DHCP IP configuration instance, stores it in |ipconfig_| and
233 // requests a new IP configuration. Saves the DHCP lease to a filename
234 // based on the passed-in |lease_name|. Registers a callback to
235 // IPConfigUpdatedCallback on IP configuration changes. Returns true if the IP
236 // request was successfully sent.
237 bool AcquireIPConfigWithLeaseName(const std::string &lease_name);
238
Darin Petkov79d74c92012-03-07 17:20:32 +0100239 // Callback invoked on every IP configuration update.
240 void OnIPConfigUpdated(const IPConfigRefPtr &ipconfig, bool success);
241
Paul Stewarte6132022011-08-16 09:11:02 -0700242 // Maintain connection state (Routes, IP Addresses and DNS) in the OS.
243 void CreateConnection();
244
245 // Remove connection state
246 void DestroyConnection();
247
Paul Stewart03dba0b2011-08-22 16:32:45 -0700248 // Selects a service to be "current" -- i.e. link-state or configuration
249 // events that happen to the device are attributed to this service.
250 void SelectService(const ServiceRefPtr &service);
251
252 // Set the state of the selected service
253 void SetServiceState(Service::ConnectState state);
254
255 // Set the failure of the selected service (implicitly sets the state to
256 // "failure")
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400257
Paul Stewart03dba0b2011-08-22 16:32:45 -0700258 void SetServiceFailure(Service::ConnectFailure failure_state);
259
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400260 // Records the failure mode and time of the selected service, and
261 // sets the Service state of the selected service to "Idle".
262 // Avoids showing a failure mole in the UI.
263 void SetServiceFailureSilent(Service::ConnectFailure failure_state);
264
Paul Stewart20088d82012-02-16 06:58:55 -0800265 // Called by the Portal Detector whenever a trial completes. Device
266 // subclasses that choose unique mappings from portal results to connected
267 // states can override this method in order to do so.
268 virtual void PortalDetectorCallback(const PortalDetector::Result &result);
269
270 // Initiate portal detection, if enabled for this device type.
271 bool StartPortalDetection();
272
273 // Stop portal detection if it is running.
274 void StopPortalDetection();
275
276 // Set the state of the selected service, with checks to make sure
277 // the service is already in a connected state before doing so.
278 void SetServiceConnectedState(Service::ConnectState state);
279
Darin Petkov9893d9c2012-05-17 15:27:31 -0700280 const ServiceRefPtr &selected_service() const { return selected_service_; }
281
Jason Glasgowb5790052012-01-27 01:03:52 -0500282 void HelpRegisterDerivedString(
283 const std::string &name,
284 std::string(Device::*get)(Error *),
285 void(Device::*set)(const std::string&, Error *));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500286
287 void HelpRegisterDerivedStrings(
288 const std::string &name,
289 Strings(Device::*get)(Error *error),
290 void(Device::*set)(const Strings &value, Error *error));
Chris Masoneb925cc82011-06-22 15:39:57 -0700291
Jason Glasgow08afdff2012-04-03 10:22:26 -0400292 void HelpRegisterConstDerivedRpcIdentifiers(
293 const std::string &name,
294 RpcIdentifiers(Device::*get)(Error *));
295
Paul Stewartac4ac002011-08-26 12:04:26 -0700296 // Property getters reserved for subclasses
297 ControlInterface *control_interface() const { return control_interface_; }
Thieu Le3426c8f2012-01-11 17:35:11 -0800298 Metrics *metrics() const { return metrics_; }
Paul Stewartac4ac002011-08-26 12:04:26 -0700299 Manager *manager() const { return manager_; }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800300 bool running() const { return running_; }
Paul Stewartd5843772011-05-11 15:40:42 -0700301
Paul Stewart75897df2011-04-27 09:05:53 -0700302 private:
Chris Masone413a3192011-05-09 17:10:05 -0700303 friend class DeviceAdaptorInterface;
Paul Stewartc681fa02012-03-02 19:40:04 -0800304 friend class DevicePortalDetectionTest;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700305 friend class DeviceTest;
306 friend class CellularTest;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500307 friend class CellularCapabilityTest;
Paul Stewarte369ece2012-05-22 09:11:03 -0700308 friend class WiFiObjectTest;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700309
Paul Stewart2bf1d352011-12-06 15:02:55 -0800310 static const char kIPFlagTemplate[];
311 static const char kIPFlagVersion4[];
312 static const char kIPFlagVersion6[];
313 static const char kIPFlagDisableIPv6[];
314 static const char kIPFlagUseTempAddr[];
315 static const char kIPFlagUseTempAddrUsedAndDefault[];
Paul Stewartc8f4bef2011-12-13 09:45:51 -0800316 static const char kIPFlagReversePathFilter[];
317 static const char kIPFlagReversePathFilterEnabled[];
318 static const char kIPFlagReversePathFilterLooseMode[];
Chris Masone5dec5f42011-07-22 14:07:55 -0700319 static const char kStoragePowered[];
320 static const char kStorageIPConfigs[];
321
Paul Stewart1062d9d2012-04-27 10:42:27 -0700322 // Configure static IP address parameters if the service provides them.
323 void ConfigureStaticIPTask();
324
Eric Shienbrood9a245532012-03-07 14:20:39 -0500325 void SetEnabledInternal(bool enable, bool persist,
326 Error *error, const ResultCallback &callback);
327
Chris Masone5dec5f42011-07-22 14:07:55 -0700328 // Right now, Devices reference IPConfigs directly when persisted to disk
329 // It's not clear that this makes sense long-term, but that's how it is now.
330 // This call generates a string in the right format for this persisting.
Chris Masone34af2182011-08-22 11:59:36 -0700331 // |suffix| is injected into the storage identifier used for the configs.
332 std::string SerializeIPConfigs(const std::string &suffix);
Chris Masone5dec5f42011-07-22 14:07:55 -0700333
Paul Stewart2bf1d352011-12-06 15:02:55 -0800334 // Set an IP configuration flag on the device. |ip_version| should be
335 // "ipv6" or "ipv4". |flag| should be the name of the flag to be set
336 // and |value| is what this flag should be set to.
337 bool SetIPFlag(IPAddress::Family family, const std::string &flag,
338 const std::string &value);
339
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800340 std::vector<std::string> AvailableIPConfigs(Error *error);
Chris Masone4e851612011-07-01 10:46:53 -0700341 std::string GetRpcConnectionIdentifier();
342
Eric Shienbrood9a245532012-03-07 14:20:39 -0500343 // |enabled_persistent_| is the value of the Powered property, as
344 // read from the profile. If it is not found in the profile, it
345 // defaults to true. |enabled_| reflects the real-time state of
346 // the device, i.e., enabled or disabled. |enabled_pending_| reflects
347 // the target state of the device while an enable or disable operation
348 // is occurring.
349 //
350 // Some typical sequences for these state variables are shown below.
351 //
352 // Shill starts up, profile has been read:
353 // |enabled_persistent_|=true |enabled_|=false |enabled_pending_|=false
354 //
355 // Shill acts on the value of |enabled_persistent_|, calls SetEnabled(true):
356 // |enabled_persistent_|=true |enabled_|=false |enabled_pending_|=true
357 //
358 // SetEnabled completes successfully, device is enabled:
359 // |enabled_persistent_|=true |enabled_|=true |enabled_pending_|=true
360 //
361 // User presses "Disable" button, SetEnabled(false) is called:
362 // |enabled_persistent_|=false |enabled_|=true |enabled_pending_|=false
363 //
364 // SetEnabled completes successfully, device is disabled:
365 // |enabled_persistent_|=false |enabled_|=false |enabled_pending_|=false
366 bool enabled_;
367 bool enabled_persistent_;
368 bool enabled_pending_;
369
370 // Other properties
Paul Stewartac4ac002011-08-26 12:04:26 -0700371 bool reconnect_;
372 const std::string hardware_address_;
373
374 PropertyStore store_;
375
Paul Stewartac4ac002011-08-26 12:04:26 -0700376 const int interface_index_;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800377 bool running_; // indicates whether the device is actually in operation
Paul Stewartac4ac002011-08-26 12:04:26 -0700378 const std::string link_name_;
379 const std::string unique_id_;
380 ControlInterface *control_interface_;
381 EventDispatcher *dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800382 Metrics *metrics_;
Paul Stewartac4ac002011-08-26 12:04:26 -0700383 Manager *manager_;
384 IPConfigRefPtr ipconfig_;
385 ConnectionRefPtr connection_;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500386 base::WeakPtrFactory<Device> weak_ptr_factory_;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700387 scoped_ptr<DeviceAdaptorInterface> adaptor_;
Paul Stewart20088d82012-02-16 06:58:55 -0800388 scoped_ptr<PortalDetector> portal_detector_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500389 base::Callback<void(const PortalDetector::Result &)>
390 portal_detector_callback_;
Gaurav Shah435de2c2011-11-17 19:01:07 -0800391 Technology::Identifier technology_;
Thieu Le85e050b2012-03-13 15:04:38 -0700392 // The number of portal detection attempts from Connected to Online state.
393 // This includes all failure/timeout attempts and the final successful
394 // attempt.
395 int portal_attempts_to_online_;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700396
Paul Stewart03dba0b2011-08-22 16:32:45 -0700397 // Maintain a reference to the connected / connecting service
398 ServiceRefPtr selected_service_;
399
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700400 // Cache singleton pointers for performance and test purposes.
Darin Petkov77cb6812011-08-15 16:19:41 -0700401 DHCPProvider *dhcp_provider_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700402 RTNLHandler *rtnl_handler_;
Darin Petkov77cb6812011-08-15 16:19:41 -0700403
Chris Masone9be4a9d2011-05-16 15:44:09 -0700404 DISALLOW_COPY_AND_ASSIGN(Device);
Paul Stewart75897df2011-04-27 09:05:53 -0700405};
406
Paul Stewart75897df2011-04-27 09:05:53 -0700407} // namespace shill
408
409#endif // SHILL_DEVICE_