blob: f15c160b643e6a8246b7e7694bfb0fcd5ec0fdd2 [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
Darin Petkov2b8e44e2012-06-25 15:13:26 +02005#ifndef SHILL_DEVICE_H_
6#define SHILL_DEVICE_H_
Paul Stewart75897df2011-04-27 09:05:53 -07007
Ben Chancd477322014-10-17 14:19:30 -07008#include <memory>
Chris Masone46eaaf52011-05-24 13:08:30 -07009#include <string>
Chris Masone9be4a9d2011-05-16 15:44:09 -070010#include <vector>
11
Ben Chancc67c522014-09-03 07:19:18 -070012#include <base/macros.h>
Chris Masone487b8bf2011-05-13 16:27:57 -070013#include <base/memory/ref_counted.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"
Rebecca Silbersteinf4365a62014-09-16 11:40:32 -070019#include "shill/connection_tester.h"
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -070020#include "shill/connectivity_trial.h"
Peter Qiud670d032014-06-03 15:04:43 -070021#include "shill/dns_server_tester.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070022#include "shill/event_dispatcher.h"
Paul Stewart2bf1d352011-12-06 15:02:55 -080023#include "shill/ip_address.h"
Darin Petkovafa6fc42011-06-21 16:21:08 -070024#include "shill/ipconfig.h"
Paul Stewart20088d82012-02-16 06:58:55 -080025#include "shill/portal_detector.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070026#include "shill/property_store.h"
Chris Masone2b105542011-06-22 10:58:09 -070027#include "shill/refptr_types.h"
Paul Stewart03dba0b2011-08-22 16:32:45 -070028#include "shill/service.h"
Peter Qiua0572032014-09-26 10:07:37 -070029#include "shill/shill_time.h"
Paul Stewartfdd16072011-09-16 12:41:35 -070030#include "shill/technology.h"
Paul Stewart75897df2011-04-27 09:05:53 -070031
32namespace shill {
33
Chris Masone9be4a9d2011-05-16 15:44:09 -070034class ControlInterface;
Darin Petkov77cb6812011-08-15 16:19:41 -070035class DHCPProvider;
Chris Masone9be4a9d2011-05-16 15:44:09 -070036class DeviceAdaptorInterface;
Paul Stewartf1ce5d22011-05-19 13:10:20 -070037class Endpoint;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070038class Error;
39class EventDispatcher;
Gaurav Shah6d2c72d2012-10-16 16:30:44 -070040class GeolocationInfo;
Paul Stewart036dba02012-08-07 12:34:41 -070041class LinkMonitor;
Paul Stewartf1ce5d22011-05-19 13:10:20 -070042class Manager;
Thieu Le3426c8f2012-01-11 17:35:11 -080043class Metrics;
Thieu Lefb46caf2012-03-08 11:57:15 -080044class RTNLHandler;
Ben Chanb061f892013-02-27 17:46:55 -080045class TrafficMonitor;
Chris Masone9be4a9d2011-05-16 15:44:09 -070046
Paul Stewart75897df2011-04-27 09:05:53 -070047// Device superclass. Individual network interfaces types will inherit from
48// this class.
Chris Masone27c4aa52011-07-02 13:10:14 -070049class Device : public base::RefCounted<Device> {
Paul Stewart75897df2011-04-27 09:05:53 -070050 public:
Wade Guthrie68d41092013-04-02 12:56:02 -070051 // Progressively scanning for access points (APs) is done with multiple scans,
52 // each containing a group of channels. The scans are performed in order of
53 // decreasing likelihood of connecting on one of the channels in a group
54 // (the number of channels in a group is a matter for system tuning). Fully
55 // scanning for APs does a complete scan of all the channels in a single scan.
56 // Progressive scanning is supported for wifi devices; technologies that
57 // support scan but don't support progressive scan will always perform a full
58 // scan, regardless of the requested scan type.
59 enum ScanType { kProgressiveScan, kFullScan };
60
Chris Masone9be4a9d2011-05-16 15:44:09 -070061 // A constructor for the Device object
62 Device(ControlInterface *control_interface,
Paul Stewartb50f0b92011-05-16 16:31:42 -070063 EventDispatcher *dispatcher,
Thieu Le3426c8f2012-01-11 17:35:11 -080064 Metrics *metrics,
Paul Stewartf1ce5d22011-05-19 13:10:20 -070065 Manager *manager,
Darin Petkovafa6fc42011-06-21 16:21:08 -070066 const std::string &link_name,
Chris Masone626719f2011-08-18 16:58:48 -070067 const std::string &address,
Gaurav Shah435de2c2011-11-17 19:01:07 -080068 int interface_index,
69 Technology::Identifier technology);
Chris Masone9be4a9d2011-05-16 15:44:09 -070070
mukesh agrawal28185512013-10-18 16:57:09 -070071 // Enable or disable the device. This is a convenience method for
72 // cases where we want to SetEnabledNonPersistent, but don't care
73 // about the results.
Eric Shienbrood9a245532012-03-07 14:20:39 -050074 virtual void SetEnabled(bool enable);
mukesh agrawalb1136662013-10-14 16:39:38 -070075 // Enable or disable the device. Unlike SetEnabledPersistent, it does not
Ben Chan9f3dcf82013-09-25 18:04:58 -070076 // save the setting in the profile.
77 //
mukesh agrawal28185512013-10-18 16:57:09 -070078 // TODO(quiche): Replace both of the next two methods with calls to
79 // SetEnabledChecked.
Ben Chan9f3dcf82013-09-25 18:04:58 -070080 virtual void SetEnabledNonPersistent(bool enable,
81 Error *error,
82 const ResultCallback &callback);
Eric Shienbrood9a245532012-03-07 14:20:39 -050083 // Enable or disable the device, and save the setting in the profile.
84 // The setting is persisted before the enable or disable operation
85 // starts, so that even if it fails, the user's intent is still recorded
86 // for the next time shill restarts.
Jason Glasgowdf7c5532012-05-14 14:41:45 -040087 virtual void SetEnabledPersistent(bool enable,
88 Error *error,
89 const ResultCallback &callback);
mukesh agrawal28185512013-10-18 16:57:09 -070090 // Enable or disable the Device, depending on |enable|.
91 // Save the new setting to the profile, if |persist| is true.
92 // Report synchronous errors using |error|, and asynchronous completion
93 // with |callback|.
94 virtual void SetEnabledChecked(bool enable,
95 bool persist,
96 Error *error,
97 const ResultCallback &callback);
98 // Similar to SetEnabledChecked, but without sanity checking, and
99 // without saving the new value of |enable| to the profile. If you
100 // are sane (i.e. not Cellular), you should use
101 // SetEnabledChecked instead.
102 virtual void SetEnabledUnchecked(bool enable,
103 Error *error,
104 const ResultCallback &callback);
Gaurav Shah435de2c2011-11-17 19:01:07 -0800105
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400106 // Returns true if the underlying device reports that it is already enabled.
107 // Used when the device is registered with the Manager, so that shill can
108 // sync its state/ with the true state of the device. The default is to
109 // report false.
110 virtual bool IsUnderlyingDeviceEnabled() const;
111
Paul Stewartf1ce5d22011-05-19 13:10:20 -0700112 virtual void LinkEvent(unsigned flags, unsigned change);
Paul Stewart75897df2011-04-27 09:05:53 -0700113
Darin Petkov9ae310f2011-08-30 15:41:13 -0700114 // The default implementation sets |error| to kNotSupported.
Wade Guthrie4823f4f2013-07-25 10:03:03 -0700115 virtual void Scan(ScanType scan_type, Error *error,
116 const std::string &reason);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500117 virtual void RegisterOnNetwork(const std::string &network_id, Error *error,
118 const ResultCallback &callback);
119 virtual void RequirePIN(const std::string &pin, bool require,
120 Error *error, const ResultCallback &callback);
121 virtual void EnterPIN(const std::string &pin,
122 Error *error, const ResultCallback &callback);
Darin Petkove42e1012011-08-31 12:35:04 -0700123 virtual void UnblockPIN(const std::string &unblock_code,
124 const std::string &pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500125 Error *error, const ResultCallback &callback);
Darin Petkove42e1012011-08-31 12:35:04 -0700126 virtual void ChangePIN(const std::string &old_pin,
127 const std::string &new_pin,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500128 Error *error, const ResultCallback &callback);
Ben Chanad663e12013-01-08 01:58:47 -0800129 virtual void Reset(Error *error, const ResultCallback &callback);
130
Darin Petkovc37a9c42012-09-06 15:28:22 +0200131 virtual void SetCarrier(const std::string &carrier,
132 Error *error, const ResultCallback &callback);
Ben Chanbcc6e012013-11-04 14:28:37 -0800133
134 // Returns true if IPv6 is allowed and should be enabled when the device
135 // tries to acquire an IP configuration. The default implementation allows
136 // IPv6, which can be overridden by a derived class.
137 virtual bool IsIPv6Allowed() const;
138
Paul Stewart2bf1d352011-12-06 15:02:55 -0800139 virtual void DisableIPv6();
140 virtual void EnableIPv6();
141 virtual void EnableIPv6Privacy();
Darin Petkov9ae310f2011-08-30 15:41:13 -0700142
Paul Stewartc8f4bef2011-12-13 09:45:51 -0800143 // Request the removal of reverse-path filtering for this interface.
144 // This will allow packets destined for this interface to be accepted,
145 // even if this is not the default route for such a packet to arrive.
146 virtual void DisableReversePathFilter();
147
148 // Request reverse-path filtering for this interface.
149 virtual void EnableReversePathFilter();
150
Gaurav Shah435de2c2011-11-17 19:01:07 -0800151 // Returns true if the selected service on the device (if any) is connected.
152 // Returns false if there is no selected service, or if the selected service
153 // is not connected.
154 bool IsConnected() const;
155
Christopher Wiley5519e9e2013-01-08 16:55:56 -0800156 // Called by Device so that subclasses can run hooks on the selected service
157 // getting an IP. Subclasses should call up to the parent first.
158 virtual void OnConnected();
159
Paul Stewart8596f9f2013-03-14 07:58:26 -0700160 // Called by the Connection so that the Device can update the service sorting
161 // after one connection is bound to another.
162 virtual void OnConnectionUpdated();
163
Paul Stewartd215af62012-04-24 23:25:50 -0700164 // Returns true if the selected service on the device (if any) is connected
165 // and matches the passed-in argument |service|. Returns false if there is
166 // no connected service, or if it does not match |service|.
167 virtual bool IsConnectedToService(const ServiceRefPtr &service) const;
168
Paul Stewartfa11e282013-12-02 22:04:25 -0800169 // Returns true if the DHCP parameters provided indicate that we are tethered
170 // to a mobile device.
171 virtual bool IsConnectedViaTether() const;
172
Paul Stewartd215af62012-04-24 23:25:50 -0700173 // Restart the portal detection process on a connected device. This is
174 // useful if the properties on the connected service have changed in a
175 // way that may affect the decision to run portal detection at all.
176 // Returns true if portal detection was started.
177 virtual bool RestartPortalDetection();
178
Rebecca Silberstein6862b382014-09-11 08:24:51 -0700179 // Called by the manager to start a single connectivity test. This is used to
180 // log connection state triggered by a user feedback log request.
181 virtual bool StartConnectivityTest();
182
Ben Chanb061f892013-02-27 17:46:55 -0800183 // Get receive and transmit byte counters.
Ben Chan7fab8972014-08-10 17:14:46 -0700184 virtual uint64_t GetReceiveByteCount();
185 virtual uint64_t GetTransmitByteCount();
Ben Chanb061f892013-02-27 17:46:55 -0800186
Paul Stewartc6fbad92013-11-13 14:50:52 -0800187 // Perform a TDLS |operation| on the underlying device, with respect
188 // to a given |peer|. The string returned is empty for any operation
189 // other than kTDLSOperationStatus, which returns the state of the
190 // TDLS link with |peer|. This method is only valid for WiFi devices,
191 // but needs to be declared here since it is part of the Device RPC
192 // API.
193 virtual std::string PerformTDLSOperation(const std::string &operation,
194 const std::string &peer,
195 Error *error);
196
Paul Stewart6ff27f52012-07-11 06:51:41 -0700197 // Reset the persisted byte counters associated with the device.
198 void ResetByteCounters();
199
Paul Stewartc681fa02012-03-02 19:40:04 -0800200 // Requests that portal detection be done, if this device has the default
201 // connection. Returns true if portal detection was started.
202 virtual bool RequestPortalDetection();
203
mukesh agrawalf6b32092013-04-10 15:49:55 -0700204 std::string GetRpcIdentifier() const;
mukesh agrawal515873d2014-07-21 17:01:35 -0700205 std::string GetStorageIdentifier() const;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700206
Gaurav Shah6d2c72d2012-10-16 16:30:44 -0700207 // Returns a list of Geolocation objects. Each object is multiple
208 // key-value pairs representing one entity that can be used for
209 // Geolocation.
210 virtual std::vector<GeolocationInfo> GetGeolocationObjects() const;
211
Chris Masone9d779932011-08-25 16:33:41 -0700212 const std::string &address() const { return hardware_address_; }
Darin Petkove0a312e2011-07-20 13:45:28 -0700213 const std::string &link_name() const { return link_name_; }
214 int interface_index() const { return interface_index_; }
Paul Stewarte6132022011-08-16 09:11:02 -0700215 const ConnectionRefPtr &connection() const { return connection_; }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500216 bool enabled() const { return enabled_; }
217 bool enabled_persistent() const { return enabled_persistent_; }
Gaurav Shah435de2c2011-11-17 19:01:07 -0800218 virtual Technology::Identifier technology() const { return technology_; }
Jason Glasgowb5790052012-01-27 01:03:52 -0500219 std::string GetTechnologyString(Error *error);
Darin Petkove0a312e2011-07-20 13:45:28 -0700220
Thieu Le03026662013-04-04 10:45:11 -0700221 virtual const IPConfigRefPtr &ipconfig() const { return ipconfig_; }
Darin Petkov31a2eca2012-03-14 11:07:18 +0100222 void set_ipconfig(const IPConfigRefPtr &config) { ipconfig_ = config; }
223
Chris Masone19e30402011-07-19 15:48:47 -0700224 const std::string &FriendlyName() const;
Chris Masone27c4aa52011-07-02 13:10:14 -0700225
Darin Petkovafa6fc42011-06-21 16:21:08 -0700226 // Returns a string that is guaranteed to uniquely identify this Device
227 // instance.
228 const std::string &UniqueName() const;
Chris Masonea82b7112011-05-25 15:16:29 -0700229
mukesh agrawalde29fa82011-09-16 16:16:36 -0700230 PropertyStore *mutable_store() { return &store_; }
231 const PropertyStore &store() const { return store_; }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700232 RTNLHandler *rtnl_handler() { return rtnl_handler_; }
Ben Chan19f83972012-10-03 23:25:56 -0700233 bool running() const { return running_; }
Chris Masone19e30402011-07-19 15:48:47 -0700234
Darin Petkovb05315f2011-11-07 10:14:25 +0100235 EventDispatcher *dispatcher() const { return dispatcher_; }
236
Paul Stewarta41e38d2011-11-11 07:47:29 -0800237 // Load configuration for the device from |storage|. This may include
238 // instantiating non-visible services for which configuration has been
239 // stored.
240 virtual bool Load(StoreInterface *storage);
241
242 // Save configuration for the device to |storage|.
Chris Masone877ff982011-09-21 16:18:24 -0700243 virtual bool Save(StoreInterface *storage);
Chris Masone5dec5f42011-07-22 14:07:55 -0700244
Darin Petkov77cb6812011-08-15 16:19:41 -0700245 void set_dhcp_provider(DHCPProvider *provider) { dhcp_provider_ = provider; }
246
Darin Petkov3cfbf212011-11-21 16:02:09 +0100247 DeviceAdaptorInterface *adaptor() const { return adaptor_.get(); }
248
mukesh agrawal784566d2012-08-08 18:32:58 -0700249 // Suspend event handler. Called by Manager before the system
Samuel Tanfbe8d2b2014-09-15 20:23:59 -0700250 // suspends. This handler, along with any other suspend handlers,
mukesh agrawalb1136662013-10-14 16:39:38 -0700251 // will have Manager::kTerminationActionsTimeoutMilliseconds to
Samuel Tanfbe8d2b2014-09-15 20:23:59 -0700252 // execute before the system enters the suspend state. |callback|
253 // must be invoked after all synchronous and/or asynchronous actions
254 // this function performs complete.
mukesh agrawal784566d2012-08-08 18:32:58 -0700255 //
mukesh agrawalb1136662013-10-14 16:39:38 -0700256 // Code that needs to run on exit, as well as on suspend, should use
257 // Manager::AddTerminationAction, rather than OnBeforeSuspend.
Samuel Tanfbe8d2b2014-09-15 20:23:59 -0700258 virtual void OnBeforeSuspend(const ResultCallback &callback);
mukesh agrawal784566d2012-08-08 18:32:58 -0700259
260 // Resume event handler. Called by Manager as the system resumes.
261 // The base class implementation takes care of renewing a DHCP lease
262 // (if necessary). Derived classes may implement any technology
263 // specific requirements by overriding, but should include a call to
264 // the base class implementation.
265 virtual void OnAfterResume();
266
Prathmesh Prabhu64ad2382014-08-26 11:19:30 -0700267 // This method is invoked when the system resumes from suspend temporarily in
268 // the "dark resume" state. The system will reenter suspend in
Samuel Tan68b73d22014-10-28 17:00:56 -0700269 // Manager::kTerminationActionsTimeoutMilliseconds. |callback| must be invoked
270 // after all synchronous and/or asynchronous actions this function performs
271 // and/or posts complete.
272 virtual void OnDarkResume(const ResultCallback &callback);
Prathmesh Prabhu64ad2382014-08-26 11:19:30 -0700273
Albert Chaulk0e1cdea2013-02-27 15:32:55 -0800274 // Destroy the lease, if any, with this |name|.
275 // Called by the service during Unload() as part of the cleanup sequence.
276 virtual void DestroyIPConfigLease(const std::string &name);
277
Paul Stewartd55f6ae2014-04-24 16:34:21 -0700278 // Called by DeviceInfo when the kernel adds or removes a globally-scoped
279 // IPv6 address from this interface.
Paul Stewartd4f26482014-04-25 19:12:03 -0700280 virtual void OnIPv6AddressChanged();
Paul Stewartd55f6ae2014-04-24 16:34:21 -0700281
Peter Qiu98551702014-07-28 13:28:53 -0700282 // Called by DeviceInfo when the kernel receives a update for IPv6 DNS server
283 // addresses from this interface.
284 virtual void OnIPv6DnsServerAddressesChanged();
285
Peter Qiu8e1ad162014-10-02 15:58:24 -0700286 // Called when link becomes unreliable (multiple link monitor failures
287 // detected in short period of time).
288 virtual void OnUnreliableLink();
289
Samuel Tan3a1bf992014-09-23 15:05:55 -0700290 // Program a rule into the NIC to wake the system from suspend upon receiving
291 // packets from |ip_endpoint|. |error| indicates the result of the
292 // operation.
Samuel Tanfe734672014-08-07 15:50:48 -0700293 virtual void AddWakeOnPacketConnection(const IPAddress &ip_endpoint,
294 Error *error);
Samuel Tan3a1bf992014-09-23 15:05:55 -0700295 // Removes a rule previously programmed into the NIC to wake the system from
296 // suspend upon receiving packets from |ip_endpoint|. |error| indicates the
297 // result of the operation.
Samuel Tanfe734672014-08-07 15:50:48 -0700298 virtual void RemoveWakeOnPacketConnection(const IPAddress &ip_endpoint,
299 Error *error);
Samuel Tan3a1bf992014-09-23 15:05:55 -0700300 // Removes all wake-on-packet rules programmed into the NIC. |error| indicates
301 // the result of the operation.
Samuel Tanfe734672014-08-07 15:50:48 -0700302 virtual void RemoveAllWakeOnPacketConnections(Error *error);
303
Paul Stewartd5843772011-05-11 15:40:42 -0700304 protected:
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200305 friend class base::RefCounted<Device>;
Arman Ugurayf84a4242013-04-09 20:01:07 -0700306 friend class DeviceHealthCheckerTest;
Ben Chan19f83972012-10-03 23:25:56 -0700307 FRIEND_TEST(CellularServiceTest, IsAutoConnectable);
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700308 FRIEND_TEST(CellularTest, EnableTrafficMonitor);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400309 FRIEND_TEST(CellularTest, ModemStateChangeDisable);
Arman Ugurayed8e6102012-11-29 14:47:20 -0800310 FRIEND_TEST(CellularTest, UseNoArpGateway);
Darin Petkov13e6d552012-05-09 14:22:23 +0200311 FRIEND_TEST(ConnectionTest, OnRouteQueryResponse);
Prathmesh Prabhuba99b592013-04-17 15:13:14 -0700312 FRIEND_TEST(DeviceHealthCheckerTest, HealthCheckerPersistsAcrossDeviceReset);
Arman Ugurayf84a4242013-04-09 20:01:07 -0700313 FRIEND_TEST(DeviceHealthCheckerTest, RequestConnectionHealthCheck);
Prathmesh Prabhuba99b592013-04-17 15:13:14 -0700314 FRIEND_TEST(DeviceHealthCheckerTest, SetupHealthChecker);
Rebecca Silbersteinf4365a62014-09-16 11:40:32 -0700315 FRIEND_TEST(DevicePortalDetectionTest, RequestStartConnectivityTest);
Paul Stewart2bf1d352011-12-06 15:02:55 -0800316 FRIEND_TEST(DeviceTest, AcquireIPConfig);
Paul Stewartd4f26482014-04-25 19:12:03 -0700317 FRIEND_TEST(DeviceTest, AvailableIPConfigs);
Darin Petkovafa6fc42011-06-21 16:21:08 -0700318 FRIEND_TEST(DeviceTest, DestroyIPConfig);
319 FRIEND_TEST(DeviceTest, DestroyIPConfigNULL);
Ben Chanbcc6e012013-11-04 14:28:37 -0800320 FRIEND_TEST(DeviceTest, EnableIPv6);
Chris Masone95207da2011-06-29 16:50:49 -0700321 FRIEND_TEST(DeviceTest, GetProperties);
Peter Qiub25083f2014-08-25 13:22:31 -0700322 FRIEND_TEST(DeviceTest, IPConfigUpdatedFailureWithIPv6Config);
Paul Stewartfa11e282013-12-02 22:04:25 -0800323 FRIEND_TEST(DeviceTest, IsConnectedViaTether);
Peter Qiua0572032014-09-26 10:07:37 -0700324 FRIEND_TEST(DeviceTest, LinkMonitorFailure);
Paul Stewart6ff27f52012-07-11 06:51:41 -0700325 FRIEND_TEST(DeviceTest, Load);
Paul Stewartd4f26482014-04-25 19:12:03 -0700326 FRIEND_TEST(DeviceTest, OnIPv6AddressChanged);
Peter Qiub25083f2014-08-25 13:22:31 -0700327 FRIEND_TEST(DeviceTest, OnIPv6ConfigurationCompleted);
Peter Qiu25f1be62014-08-12 10:42:27 -0700328 FRIEND_TEST(DeviceTest, OnIPv6DnsServerAddressesChanged);
Samuel Tan815a6fb2014-10-23 16:53:59 -0700329 FRIEND_TEST(DeviceTest,
330 OnIPv6DnsServerAddressesChanged_LeaseExpirationUpdated);
Chris Masone5dec5f42011-07-22 14:07:55 -0700331 FRIEND_TEST(DeviceTest, Save);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700332 FRIEND_TEST(DeviceTest, SelectedService);
Ben Chan9f3dcf82013-09-25 18:04:58 -0700333 FRIEND_TEST(DeviceTest, SetEnabledNonPersistent);
Darin Petkove7c6ad32012-06-29 10:22:09 +0200334 FRIEND_TEST(DeviceTest, SetEnabledPersistent);
Paul Stewartc681fa02012-03-02 19:40:04 -0800335 FRIEND_TEST(DeviceTest, SetServiceConnectedState);
Paul Stewart75a68b92013-10-24 10:50:27 -0700336 FRIEND_TEST(DeviceTest, ShouldUseArpGateway);
Paul Stewart8c116a92012-05-02 18:30:03 -0700337 FRIEND_TEST(DeviceTest, Start);
Ben Chanb061f892013-02-27 17:46:55 -0800338 FRIEND_TEST(DeviceTest, StartTrafficMonitor);
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700339 FRIEND_TEST(DeviceTest, Stop);
Ben Chanb061f892013-02-27 17:46:55 -0800340 FRIEND_TEST(DeviceTest, StopTrafficMonitor);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800341 FRIEND_TEST(ManagerTest, DeviceRegistrationAndStart);
Gaurav Shah435de2c2011-11-17 19:01:07 -0800342 FRIEND_TEST(ManagerTest, ConnectedTechnologies);
343 FRIEND_TEST(ManagerTest, DefaultTechnology);
mukesh agrawal46c27cc2013-07-10 16:39:10 -0700344 FRIEND_TEST(ManagerTest, SetEnabledStateForTechnology);
mukesh agrawalf407d592013-07-31 11:37:57 -0700345 FRIEND_TEST(PPPDeviceTest, UpdateIPConfigFromPPP);
mukesh agrawal32399322011-09-01 10:53:43 -0700346 FRIEND_TEST(WiFiMainTest, Connect);
Arman Ugurayed8e6102012-11-29 14:47:20 -0800347 FRIEND_TEST(WiFiMainTest, UseArpGateway);
Darin Petkov3a4100c2012-06-14 11:36:59 +0200348 FRIEND_TEST(WiMaxTest, ConnectTimeout);
Arman Ugurayed8e6102012-11-29 14:47:20 -0800349 FRIEND_TEST(WiMaxTest, UseNoArpGateway);
Darin Petkovafa6fc42011-06-21 16:21:08 -0700350
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200351 virtual ~Device();
352
Eric Shienbrood9a245532012-03-07 14:20:39 -0500353 // Each device must implement this method to do the work needed to
354 // enable the device to operate for establishing network connections.
Ben Chancc225ef2014-09-30 13:26:51 -0700355 // The |error| argument, if not nullptr,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500356 // will refer to an Error that starts out with the value
357 // Error::kOperationInitiated. This reflects the assumption that
358 // enable (and disable) operations will usually be non-blocking,
359 // and their completion will be indicated by means of an asynchronous
360 // reply sometime later. There are two circumstances in which a
361 // device's Start() method may overwrite |error|:
362 //
363 // 1. If an early failure is detected, such that the non-blocking
364 // part of the operation never takes place, then |error| should
365 // be set to the appropriate value corresponding to the type
366 // of failure. This is the "immediate failure" case.
367 // 2. If the device is enabled without performing any non-blocking
368 // steps, then |error| should be Reset, i.e., its value set
369 // to Error::kSuccess. This is the "immediate success" case.
370 //
371 // In these two cases, because completion is immediate, |callback|
372 // is not used. If neither of these two conditions holds, then |error|
373 // should not be modified, and |callback| should be passed to the
374 // method that will initiate the non-blocking operation.
375 virtual void Start(Error *error,
376 const EnabledStateChangedCallback &callback) = 0;
377
378 // Each device must implement this method to do the work needed to
379 // disable the device, i.e., clear any running state, and make the
380 // device no longer capable of establishing network connections.
381 // The discussion for Start() regarding the use of |error| and
382 // |callback| apply to Stop() as well.
383 virtual void Stop(Error *error,
384 const EnabledStateChangedCallback &callback) = 0;
385
386 // The EnabledStateChangedCallback that gets passed to the device's
387 // Start() and Stop() methods is bound to this method. |callback|
388 // is the callback that was passed to SetEnabled().
389 void OnEnabledStateChanged(const ResultCallback &callback,
390 const Error &error);
391
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200392 // Drops the currently selected service along with its IP configuration and
393 // connection, if any.
mukesh agrawal5d851b12013-07-11 14:09:41 -0700394 virtual void DropConnection();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200395
Darin Petkovafa6fc42011-06-21 16:21:08 -0700396 // If there's an IP configuration in |ipconfig_|, releases the IP address and
397 // destroys the configuration instance.
398 void DestroyIPConfig();
399
400 // Creates a new DHCP IP configuration instance, stores it in |ipconfig_| and
Paul Stewartd408fdf2012-05-07 17:15:57 -0700401 // requests a new IP configuration. Saves the DHCP lease to the generic
402 // lease filename based on the interface name. Registers a callback to
Darin Petkovafa6fc42011-06-21 16:21:08 -0700403 // IPConfigUpdatedCallback on IP configuration changes. Returns true if the IP
404 // request was successfully sent.
Paul Stewart2bf1d352011-12-06 15:02:55 -0800405 bool AcquireIPConfig();
Darin Petkovafa6fc42011-06-21 16:21:08 -0700406
Paul Stewartd408fdf2012-05-07 17:15:57 -0700407 // Creates a new DHCP IP configuration instance, stores it in |ipconfig_| and
408 // requests a new IP configuration. Saves the DHCP lease to a filename
409 // based on the passed-in |lease_name|. Registers a callback to
410 // IPConfigUpdatedCallback on IP configuration changes. Returns true if the IP
411 // request was successfully sent.
412 bool AcquireIPConfigWithLeaseName(const std::string &lease_name);
413
Ben Chan539ab022014-02-03 16:34:57 -0800414 // Assigns the IP configuration |properties| to |ipconfig_|.
415 void AssignIPConfig(const IPConfig::Properties &properties);
416
Paul Stewartc5099532013-12-12 07:53:15 -0800417 // Callback invoked on successful IP configuration updates.
418 void OnIPConfigUpdated(const IPConfigRefPtr &ipconfig);
419
420 // Callback invoked on IP configuration failures.
421 void OnIPConfigFailed(const IPConfigRefPtr &ipconfig);
Darin Petkov79d74c92012-03-07 17:20:32 +0100422
Paul Stewart82236532013-12-10 15:33:11 -0800423 // Callback invoked when "Refresh" is invoked on an IPConfig. This usually
424 // signals a change in static IP parameters.
425 void OnIPConfigRefreshed(const IPConfigRefPtr &ipconfig);
426
Paul Stewart1f916e42013-12-23 09:52:54 -0800427 // Callback invoked when an IPConfig restarts due to lease expiry. This
428 // is advisory, since an "Updated" or "Failed" signal is guaranteed to
429 // follow.
430 void OnIPConfigExpired(const IPConfigRefPtr &ipconfig);
431
Paul Stewartf6f96482013-07-12 12:49:15 -0700432 // Called by Device so that subclasses can run hooks on the selected service
433 // failing to get an IP. The default implementation disconnects the selected
434 // service with Service::kFailureDHCP.
435 virtual void OnIPConfigFailure();
436
Paul Stewarte6132022011-08-16 09:11:02 -0700437 // Maintain connection state (Routes, IP Addresses and DNS) in the OS.
438 void CreateConnection();
439
440 // Remove connection state
441 void DestroyConnection();
442
Paul Stewart03dba0b2011-08-22 16:32:45 -0700443 // Selects a service to be "current" -- i.e. link-state or configuration
444 // events that happen to the device are attributed to this service.
445 void SelectService(const ServiceRefPtr &service);
446
mukesh agrawalfc362912013-08-06 18:10:07 -0700447 // Set the state of the |selected_service_|.
mukesh agrawal0381f9a2013-07-11 16:41:52 -0700448 virtual void SetServiceState(Service::ConnectState state);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700449
450 // Set the failure of the selected service (implicitly sets the state to
mukesh agrawalfc362912013-08-06 18:10:07 -0700451 // "failure").
mukesh agrawal0381f9a2013-07-11 16:41:52 -0700452 virtual void SetServiceFailure(Service::ConnectFailure failure_state);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700453
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400454 // Records the failure mode and time of the selected service, and
455 // sets the Service state of the selected service to "Idle".
456 // Avoids showing a failure mole in the UI.
mukesh agrawal0381f9a2013-07-11 16:41:52 -0700457 virtual void SetServiceFailureSilent(Service::ConnectFailure failure_state);
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400458
Paul Stewart20088d82012-02-16 06:58:55 -0800459 // Called by the Portal Detector whenever a trial completes. Device
460 // subclasses that choose unique mappings from portal results to connected
461 // states can override this method in order to do so.
462 virtual void PortalDetectorCallback(const PortalDetector::Result &result);
463
464 // Initiate portal detection, if enabled for this device type.
465 bool StartPortalDetection();
466
467 // Stop portal detection if it is running.
468 void StopPortalDetection();
469
Paul Stewarte8303eb2014-10-08 22:51:14 -0700470 // Stop connectivity tester if it exists.
471 void StopConnectivityTest();
472
Paul Stewart036dba02012-08-07 12:34:41 -0700473 // Initiate link monitoring, if enabled for this device type.
474 bool StartLinkMonitor();
475
476 // Stop link monitoring if it is running.
477 void StopLinkMonitor();
478
479 // Respond to a LinkMonitor failure in a Device-specific manner.
480 virtual void OnLinkMonitorFailure();
481
Peter Qiu9d581932014-04-14 16:37:37 -0700482 // Respond to a LinkMonitor gateway's MAC address found/change event.
483 virtual void OnLinkMonitorGatewayChange();
Peter Qiub5d124f2014-04-14 12:05:02 -0700484
Peter Qiudc335f82014-05-15 10:33:17 -0700485 // Returns true if traffic monitor is enabled on this device. The default
486 // implementation will return false, which can be overridden by a derived
487 // class.
488 virtual bool IsTrafficMonitorEnabled() const;
489
490 // Initiates traffic monitoring on the device if traffic monitor is enabled.
491 void StartTrafficMonitor();
492
493 // Stops traffic monitoring on the device if traffic monitor is enabled.
494 void StopTrafficMonitor();
495
Peter Qiu6f5618b2014-06-05 15:19:01 -0700496 // Start DNS test for the given servers. When retry_until_success is set,
497 // callback will only be invoke when the test succeed or the test failed to
498 // start (internal error). This function will return false if there is a test
499 // that's already running, and true otherwise.
500 virtual bool StartDNSTest(
501 const std::vector<std::string> &dns_servers,
502 const bool retry_until_success,
503 const base::Callback<void(const DNSServerTester::Status)> &callback);
504 // Stop DNS test if one is running.
505 virtual void StopDNSTest();
506
Peter Qiu25f1be62014-08-12 10:42:27 -0700507 // Timer function for monitoring IPv6 DNS server's lifetime.
508 void StartIPv6DNSServerTimer(uint32 lifetime_seconds);
509 void StopIPv6DNSServerTimer();
510
511 // Stop all monitoring/testing activities on this device. Called when tearing
512 // down or changing network connection on the device.
513 void StopAllActivities();
514
Peter Qiudc335f82014-05-15 10:33:17 -0700515 // Called by the Traffic Monitor when it detects a network problem. Device
516 // subclasses that want to roam to a different network when encountering
517 // network problems can override this method in order to do so. The parent
518 // implementation handles the metric reporting of the network problem.
519 virtual void OnEncounterNetworkProblem(int reason);
520
Paul Stewart20088d82012-02-16 06:58:55 -0800521 // Set the state of the selected service, with checks to make sure
522 // the service is already in a connected state before doing so.
523 void SetServiceConnectedState(Service::ConnectState state);
524
Arman Ugurayed8e6102012-11-29 14:47:20 -0800525 // Specifies whether an ARP gateway should be used for the
526 // device technology.
527 virtual bool ShouldUseArpGateway() const;
528
Paul Stewart316acef2014-05-29 18:40:48 -0700529 // Indicates if the selected service is configured with a static IP address.
530 bool IsUsingStaticIP() const;
531
Darin Petkov9893d9c2012-05-17 15:27:31 -0700532 const ServiceRefPtr &selected_service() const { return selected_service_; }
533
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700534 void HelpRegisterConstDerivedString(
Jason Glasgowb5790052012-01-27 01:03:52 -0500535 const std::string &name,
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700536 std::string(Device::*get)(Error *));
Chris Masoneb925cc82011-06-22 15:39:57 -0700537
Jason Glasgow08afdff2012-04-03 10:22:26 -0400538 void HelpRegisterConstDerivedRpcIdentifiers(
539 const std::string &name,
540 RpcIdentifiers(Device::*get)(Error *));
541
Paul Stewart6ff27f52012-07-11 06:51:41 -0700542 void HelpRegisterConstDerivedUint64(
543 const std::string &name,
Ben Chan7fab8972014-08-10 17:14:46 -0700544 uint64_t(Device::*get)(Error *));
Paul Stewart6ff27f52012-07-11 06:51:41 -0700545
Rebecca Silbersteinf4365a62014-09-16 11:40:32 -0700546 // Called by the ConnectionTester whenever a connectivity test completes.
547 virtual void ConnectionTesterCallback();
548
Paul Stewartac4ac002011-08-26 12:04:26 -0700549 // Property getters reserved for subclasses
550 ControlInterface *control_interface() const { return control_interface_; }
Thieu Le3426c8f2012-01-11 17:35:11 -0800551 Metrics *metrics() const { return metrics_; }
Paul Stewartac4ac002011-08-26 12:04:26 -0700552 Manager *manager() const { return manager_; }
Paul Stewart036dba02012-08-07 12:34:41 -0700553 const LinkMonitor *link_monitor() const { return link_monitor_.get(); }
554 void set_link_monitor(LinkMonitor *link_monitor);
Peter Qiudc335f82014-05-15 10:33:17 -0700555 // Use for unit test.
556 void set_traffic_monitor(TrafficMonitor *traffic_monitor);
Paul Stewartd5843772011-05-11 15:40:42 -0700557
Paul Stewart75897df2011-04-27 09:05:53 -0700558 private:
Darin Petkov3189a472012-10-05 09:55:33 +0200559 friend class CellularCapabilityTest;
560 friend class CellularTest;
Chris Masone413a3192011-05-09 17:10:05 -0700561 friend class DeviceAdaptorInterface;
Paul Stewart6ff27f52012-07-11 06:51:41 -0700562 friend class DeviceByteCountTest;
Paul Stewartc681fa02012-03-02 19:40:04 -0800563 friend class DevicePortalDetectionTest;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700564 friend class DeviceTest;
Paul Stewartced3ad72013-04-03 13:39:25 -0700565 friend class EthernetTest;
Darin Petkov3189a472012-10-05 09:55:33 +0200566 friend class OpenVPNDriverTest;
Ben Chanbcc6e012013-11-04 14:28:37 -0800567 friend class TestDevice;
mukesh agrawal4a165582013-08-02 15:58:21 -0700568 friend class VirtualDeviceTest;
Paul Stewarte369ece2012-05-22 09:11:03 -0700569 friend class WiFiObjectTest;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700570
Paul Stewart2bf1d352011-12-06 15:02:55 -0800571 static const char kIPFlagTemplate[];
572 static const char kIPFlagVersion4[];
573 static const char kIPFlagVersion6[];
574 static const char kIPFlagDisableIPv6[];
575 static const char kIPFlagUseTempAddr[];
576 static const char kIPFlagUseTempAddrUsedAndDefault[];
Paul Stewartc8f4bef2011-12-13 09:45:51 -0800577 static const char kIPFlagReversePathFilter[];
578 static const char kIPFlagReversePathFilterEnabled[];
579 static const char kIPFlagReversePathFilterLooseMode[];
Prathmesh Prabhuba99b592013-04-17 15:13:14 -0700580 static const char kStoragePowered[];
Paul Stewart6ff27f52012-07-11 06:51:41 -0700581 static const char kStorageReceiveByteCount[];
582 static const char kStorageTransmitByteCount[];
Peter Qiub9256f32014-05-09 15:27:29 -0700583 static const char kFallbackDnsTestHostname[];
584 static const char* kFallbackDnsServers[];
585 static const int kDNSTimeoutMilliseconds;
Chris Masone5dec5f42011-07-22 14:07:55 -0700586
Peter Qiua0572032014-09-26 10:07:37 -0700587 // Maximum seconds between two link monitor failures to declare this link
588 // (network) as unreliable.
589 static const int kLinkMonitorFailureUnreliableThresholdSeconds;
590
Paul Stewart1062d9d2012-04-27 10:42:27 -0700591 // Configure static IP address parameters if the service provides them.
592 void ConfigureStaticIPTask();
593
Chris Masone5dec5f42011-07-22 14:07:55 -0700594 // Right now, Devices reference IPConfigs directly when persisted to disk
595 // It's not clear that this makes sense long-term, but that's how it is now.
596 // This call generates a string in the right format for this persisting.
Chris Masone34af2182011-08-22 11:59:36 -0700597 // |suffix| is injected into the storage identifier used for the configs.
598 std::string SerializeIPConfigs(const std::string &suffix);
Chris Masone5dec5f42011-07-22 14:07:55 -0700599
Ben Chanbcc6e012013-11-04 14:28:37 -0800600 // Set an IP configuration flag on the device. |family| should be "ipv6" or
601 // "ipv4". |flag| should be the name of the flag to be set and |value| is
602 // what this flag should be set to. Overridden by unit tests to pretend
603 // writing to procfs.
604 virtual bool SetIPFlag(IPAddress::Family family,
605 const std::string &flag,
606 const std::string &value);
Paul Stewart2bf1d352011-12-06 15:02:55 -0800607
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800608 std::vector<std::string> AvailableIPConfigs(Error *error);
Chris Masone4e851612011-07-01 10:46:53 -0700609 std::string GetRpcConnectionIdentifier();
610
Paul Stewart036dba02012-08-07 12:34:41 -0700611 // Get the LinkMonitor's average response time.
Ben Chan7fab8972014-08-10 17:14:46 -0700612 uint64_t GetLinkMonitorResponseTime(Error *error);
Paul Stewart036dba02012-08-07 12:34:41 -0700613
Ben Chanb061f892013-02-27 17:46:55 -0800614 // Get receive and transmit byte counters. These methods simply wrap
615 // GetReceiveByteCount and GetTransmitByteCount in order to be used by
616 // HelpRegisterConstDerivedUint64.
Ben Chan7fab8972014-08-10 17:14:46 -0700617 uint64_t GetReceiveByteCountProperty(Error *error);
618 uint64_t GetTransmitByteCountProperty(Error *error);
Paul Stewart6ff27f52012-07-11 06:51:41 -0700619
Paul Stewartd4f26482014-04-25 19:12:03 -0700620 // Emit a property change signal for the "IPConfigs" property of this device.
621 void UpdateIPConfigsProperty();
622
Peter Qiu6f5618b2014-06-05 15:19:01 -0700623 // Called by DNS server tester when the fallback DNS servers test completes.
Peter Qiud670d032014-06-03 15:04:43 -0700624 void FallbackDNSResultCallback(const DNSServerTester::Status status);
Peter Qiub9256f32014-05-09 15:27:29 -0700625
Peter Qiu6f5618b2014-06-05 15:19:01 -0700626 // Called by DNS server tester when the configured DNS servers test completes.
627 void ConfigDNSResultCallback(const DNSServerTester::Status status);
628
Peter Qiua89154b2014-05-23 15:45:42 -0700629 // Update DNS setting with the given DNS servers for the current connection.
630 void SwitchDNSServers(const std::vector<std::string> &dns_servers);
631
Peter Qiu25f1be62014-08-12 10:42:27 -0700632 // Called when the lifetime for IPv6 DNS server expires.
633 void IPv6DNSServerExpired();
634
Peter Qiub25083f2014-08-25 13:22:31 -0700635 // Return true if given IP configuration contain both IP address and DNS
636 // servers. Hence, ready to be used for network connection.
637 bool IPConfigCompleted(const IPConfigRefPtr &ipconfig);
638
639 // Setup network connection with given IP configuration, and start portal
640 // detection on that connection.
641 void SetupConnection(const IPConfigRefPtr &ipconfig);
642
643 // Called when IPv6 configuration changes.
644 void OnIPv6ConfigUpdated();
645
Eric Shienbrood9a245532012-03-07 14:20:39 -0500646 // |enabled_persistent_| is the value of the Powered property, as
647 // read from the profile. If it is not found in the profile, it
648 // defaults to true. |enabled_| reflects the real-time state of
649 // the device, i.e., enabled or disabled. |enabled_pending_| reflects
650 // the target state of the device while an enable or disable operation
651 // is occurring.
652 //
653 // Some typical sequences for these state variables are shown below.
654 //
655 // Shill starts up, profile has been read:
656 // |enabled_persistent_|=true |enabled_|=false |enabled_pending_|=false
657 //
658 // Shill acts on the value of |enabled_persistent_|, calls SetEnabled(true):
659 // |enabled_persistent_|=true |enabled_|=false |enabled_pending_|=true
660 //
661 // SetEnabled completes successfully, device is enabled:
662 // |enabled_persistent_|=true |enabled_|=true |enabled_pending_|=true
663 //
664 // User presses "Disable" button, SetEnabled(false) is called:
665 // |enabled_persistent_|=false |enabled_|=true |enabled_pending_|=false
666 //
667 // SetEnabled completes successfully, device is disabled:
668 // |enabled_persistent_|=false |enabled_|=false |enabled_pending_|=false
669 bool enabled_;
670 bool enabled_persistent_;
671 bool enabled_pending_;
672
673 // Other properties
Paul Stewartac4ac002011-08-26 12:04:26 -0700674 bool reconnect_;
675 const std::string hardware_address_;
676
677 PropertyStore store_;
678
Paul Stewartac4ac002011-08-26 12:04:26 -0700679 const int interface_index_;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800680 bool running_; // indicates whether the device is actually in operation
Paul Stewartac4ac002011-08-26 12:04:26 -0700681 const std::string link_name_;
682 const std::string unique_id_;
683 ControlInterface *control_interface_;
684 EventDispatcher *dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800685 Metrics *metrics_;
Paul Stewartac4ac002011-08-26 12:04:26 -0700686 Manager *manager_;
687 IPConfigRefPtr ipconfig_;
Paul Stewartd4f26482014-04-25 19:12:03 -0700688 IPConfigRefPtr ip6config_;
Paul Stewartac4ac002011-08-26 12:04:26 -0700689 ConnectionRefPtr connection_;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500690 base::WeakPtrFactory<Device> weak_ptr_factory_;
Ben Chancd477322014-10-17 14:19:30 -0700691 std::unique_ptr<DeviceAdaptorInterface> adaptor_;
692 std::unique_ptr<PortalDetector> portal_detector_;
693 std::unique_ptr<LinkMonitor> link_monitor_;
Peter Qiu6f5618b2014-06-05 15:19:01 -0700694 // Used for verifying whether DNS server is functional.
Ben Chancd477322014-10-17 14:19:30 -0700695 std::unique_ptr<DNSServerTester> dns_server_tester_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500696 base::Callback<void(const PortalDetector::Result &)>
697 portal_detector_callback_;
Peter Qiu25f1be62014-08-12 10:42:27 -0700698 // Callback to invoke when IPv6 DNS servers lifetime expired.
699 base::CancelableClosure ipv6_dns_server_expired_callback_;
Ben Chancd477322014-10-17 14:19:30 -0700700 std::unique_ptr<TrafficMonitor> traffic_monitor_;
Peter Qiu6f5618b2014-06-05 15:19:01 -0700701 // DNS servers obtained from ipconfig (either from DHCP or static config)
702 // that are not working.
703 std::vector<std::string> config_dns_servers_;
Gaurav Shah435de2c2011-11-17 19:01:07 -0800704 Technology::Identifier technology_;
Thieu Le85e050b2012-03-13 15:04:38 -0700705 // The number of portal detection attempts from Connected to Online state.
706 // This includes all failure/timeout attempts and the final successful
707 // attempt.
708 int portal_attempts_to_online_;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700709
Paul Stewart6ff27f52012-07-11 06:51:41 -0700710 // Keep track of the offset between the interface-reported byte counters
711 // and our persisted value.
Ben Chan7fab8972014-08-10 17:14:46 -0700712 uint64_t receive_byte_offset_;
713 uint64_t transmit_byte_offset_;
Paul Stewart6ff27f52012-07-11 06:51:41 -0700714
Paul Stewart03dba0b2011-08-22 16:32:45 -0700715 // Maintain a reference to the connected / connecting service
716 ServiceRefPtr selected_service_;
717
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700718 // Cache singleton pointers for performance and test purposes.
Darin Petkov77cb6812011-08-15 16:19:41 -0700719 DHCPProvider *dhcp_provider_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700720 RTNLHandler *rtnl_handler_;
Darin Petkov77cb6812011-08-15 16:19:41 -0700721
Peter Qiua0572032014-09-26 10:07:37 -0700722 // Time when link monitor last failed.
723 Time *time_;
724 time_t last_link_monitor_failed_time_;
725
Ben Chancd477322014-10-17 14:19:30 -0700726 std::unique_ptr<ConnectionTester> connection_tester_;
Rebecca Silbersteinf4365a62014-09-16 11:40:32 -0700727 base::Callback<void()> connection_tester_callback_;
728
Chris Masone9be4a9d2011-05-16 15:44:09 -0700729 DISALLOW_COPY_AND_ASSIGN(Device);
Paul Stewart75897df2011-04-27 09:05:53 -0700730};
731
Paul Stewart75897df2011-04-27 09:05:53 -0700732} // namespace shill
733
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200734#endif // SHILL_DEVICE_H_