• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (C) 2012 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #ifndef SHILL_DEVICE_H_
18 #define SHILL_DEVICE_H_
19 
20 #include <memory>
21 #include <set>
22 #include <string>
23 #include <vector>
24 
25 #include <base/macros.h>
26 #include <base/memory/ref_counted.h>
27 #include <base/memory/weak_ptr.h>
28 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
29 
30 #include "shill/adaptor_interfaces.h"
31 #include "shill/callbacks.h"
32 #include "shill/connection_diagnostics.h"
33 #include "shill/connection_tester.h"
34 #include "shill/connectivity_trial.h"
35 #include "shill/dns_server_tester.h"
36 #include "shill/event_dispatcher.h"
37 #include "shill/ipconfig.h"
38 #include "shill/net/ip_address.h"
39 #include "shill/net/shill_time.h"
40 #include "shill/portal_detector.h"
41 #include "shill/property_store.h"
42 #include "shill/refptr_types.h"
43 #include "shill/service.h"
44 #include "shill/technology.h"
45 
46 namespace shill {
47 
48 class ControlInterface;
49 class DHCPProvider;
50 class DeviceAdaptorInterface;
51 class Endpoint;
52 class Error;
53 class EventDispatcher;
54 class GeolocationInfo;
55 class LinkMonitor;
56 class Manager;
57 class Metrics;
58 class RTNLHandler;
59 class TrafficMonitor;
60 
61 // Device superclass.  Individual network interfaces types will inherit from
62 // this class.
63 class Device : public base::RefCounted<Device> {
64  public:
65   // Progressively scanning for access points (APs) is done with multiple scans,
66   // each containing a group of channels.  The scans are performed in order of
67   // decreasing likelihood of connecting on one of the channels in a group
68   // (the number of channels in a group is a matter for system tuning).  Fully
69   // scanning for APs does a complete scan of all the channels in a single scan.
70   // Progressive scanning is supported for wifi devices; technologies that
71   // support scan but don't support progressive scan will always perform a full
72   // scan, regardless of the requested scan type.
73   enum ScanType { kProgressiveScan, kFullScan };
74 
75   // A constructor for the Device object
76   Device(ControlInterface* control_interface,
77          EventDispatcher* dispatcher,
78          Metrics* metrics,
79          Manager* manager,
80          const std::string& link_name,
81          const std::string& address,
82          int interface_index,
83          Technology::Identifier technology);
84 
85   // Initialize type-specific network interface properties.
86   virtual void Initialize();
87 
88   // Enable or disable the device. This is a convenience method for
89   // cases where we want to SetEnabledNonPersistent, but don't care
90   // about the results.
91   virtual void SetEnabled(bool enable);
92   // Enable or disable the device. Unlike SetEnabledPersistent, it does not
93   // save the setting in the profile.
94   //
95   // TODO(quiche): Replace both of the next two methods with calls to
96   // SetEnabledChecked.
97   virtual void SetEnabledNonPersistent(bool enable,
98                                        Error* error,
99                                        const ResultCallback& callback);
100   // Enable or disable the device, and save the setting in the profile.
101   // The setting is persisted before the enable or disable operation
102   // starts, so that even if it fails, the user's intent is still recorded
103   // for the next time shill restarts.
104   virtual void SetEnabledPersistent(bool enable,
105                                     Error* error,
106                                     const ResultCallback& callback);
107   // Enable or disable the Device, depending on |enable|.
108   // Save the new setting to the profile, if |persist| is true.
109   // Report synchronous errors using |error|, and asynchronous completion
110   // with |callback|.
111   virtual void SetEnabledChecked(bool enable,
112                                  bool persist,
113                                  Error* error,
114                                  const ResultCallback& callback);
115   // Similar to SetEnabledChecked, but without sanity checking, and
116   // without saving the new value of |enable| to the profile. If you
117   // are sane (i.e. not Cellular), you should use
118   // SetEnabledChecked instead.
119   virtual void SetEnabledUnchecked(bool enable,
120                                    Error* error,
121                                    const ResultCallback& callback);
122 
123   // Returns true if the underlying device reports that it is already enabled.
124   // Used when the device is registered with the Manager, so that shill can
125   // sync its state/ with the true state of the device. The default is to
126   // report false.
127   virtual bool IsUnderlyingDeviceEnabled() const;
128 
129   virtual void LinkEvent(unsigned flags, unsigned change);
130 
131   // The default implementation sets |error| to kNotSupported.
132   virtual void Scan(ScanType scan_type, Error* error,
133                     const std::string& reason);
134   // The default implementation sets |error| to kNotSupported.
135   virtual void SetSchedScan(bool enable, Error* error);
136   virtual void RegisterOnNetwork(const std::string& network_id, Error* error,
137                                  const ResultCallback& callback);
138   virtual void RequirePIN(const std::string& pin, bool require,
139                           Error* error, const ResultCallback& callback);
140   virtual void EnterPIN(const std::string& pin,
141                         Error* error, const ResultCallback& callback);
142   virtual void UnblockPIN(const std::string& unblock_code,
143                           const std::string& pin,
144                           Error* error, const ResultCallback& callback);
145   virtual void ChangePIN(const std::string& old_pin,
146                          const std::string& new_pin,
147                          Error* error, const ResultCallback& callback);
148   virtual void Reset(Error* error, const ResultCallback& callback);
149 
150   virtual void SetCarrier(const std::string& carrier,
151                           Error* error, const ResultCallback& callback);
152 
153   // Returns true if IPv6 is allowed and should be enabled when the device
154   // tries to acquire an IP configuration. The default implementation allows
155   // IPv6, which can be overridden by a derived class.
156   virtual bool IsIPv6Allowed() const;
157 
158   virtual void DisableIPv6();
159   virtual void EnableIPv6();
160   virtual void EnableIPv6Privacy();
161 
162   // Returns true if the selected service on the device (if any) is connected.
163   // Returns false if there is no selected service, or if the selected service
164   // is not connected.
165   bool IsConnected() const;
166 
167   // Called by Device so that subclasses can run hooks on the selected service
168   // getting an IP.  Subclasses should call up to the parent first.
169   virtual void OnConnected();
170 
171   // Called by the Connection so that the Device can update the service sorting
172   // after one connection is bound to another.
173   virtual void OnConnectionUpdated();
174 
175   // Returns true if the selected service on the device (if any) is connected
176   // and matches the passed-in argument |service|.  Returns false if there is
177   // no connected service, or if it does not match |service|.
178   virtual bool IsConnectedToService(const ServiceRefPtr& service) const;
179 
180   // Returns true if the DHCP parameters provided indicate that we are tethered
181   // to a mobile device.
182   virtual bool IsConnectedViaTether() const;
183 
184   // Restart the portal detection process on a connected device.  This is
185   // useful if the properties on the connected service have changed in a
186   // way that may affect the decision to run portal detection at all.
187   // Returns true if portal detection was started.
188   virtual bool RestartPortalDetection();
189 
190   // Called by the manager to start a single connectivity test.  This is used to
191   // log connection state triggered by a user feedback log request.
192   virtual bool StartConnectivityTest();
193 
194   // Get receive and transmit byte counters.
195   virtual uint64_t GetReceiveByteCount();
196   virtual uint64_t GetTransmitByteCount();
197 
198   // Perform a TDLS |operation| on the underlying device, with respect
199   // to a given |peer|.  The string returned is empty for any operation
200   // other than kTDLSOperationStatus, which returns the state of the
201   // TDLS link with |peer|.  This method is only valid for WiFi devices,
202   // but needs to be declared here since it is part of the Device RPC
203   // API.
204   virtual std::string PerformTDLSOperation(const std::string& operation,
205                                            const std::string& peer,
206                                            Error* error);
207 
208   // Reset the persisted byte counters associated with the device.
209   void ResetByteCounters();
210 
211   // Requests that portal detection be done, if this device has the default
212   // connection.  Returns true if portal detection was started.
213   virtual bool RequestPortalDetection();
214 
215   std::string GetRpcIdentifier() const;
216   std::string GetStorageIdentifier() const;
217 
218   // Returns a list of Geolocation objects. Each object is multiple
219   // key-value pairs representing one entity that can be used for
220   // Geolocation.
221   virtual std::vector<GeolocationInfo> GetGeolocationObjects() const;
222 
223   // Enable or disable this interface to receive packets even if it is not
224   // the default connection.  This is useful in limited situations such as
225   // during portal detection.
226   virtual void SetLooseRouting(bool is_loose_routing);
227 
228   // Enable or disable same-net multi-home support for this interface.  When
229   // enabled, ARP filtering is enabled in order to avoid the "ARP Flux"
230   // effect where peers may end up with inaccurate IP address mappings due to
231   // the default Linux ARP transmit / reply behavior.  See
232   // http://linux-ip.net/html/ether-arp.html for more details on this effect.
233   virtual void SetIsMultiHomed(bool is_multi_homed);
234 
address()235   const std::string& address() const { return hardware_address_; }
link_name()236   const std::string& link_name() const { return link_name_; }
interface_index()237   int interface_index() const { return interface_index_; }
connection()238   virtual const ConnectionRefPtr& connection() const { return connection_; }
enabled()239   bool enabled() const { return enabled_; }
enabled_persistent()240   bool enabled_persistent() const { return enabled_persistent_; }
technology()241   virtual Technology::Identifier technology() const { return technology_; }
242   std::string GetTechnologyString(Error* error);
243 
ipconfig()244   virtual const IPConfigRefPtr& ipconfig() const { return ipconfig_; }
ip6config()245   virtual const IPConfigRefPtr& ip6config() const { return ip6config_; }
dhcpv6_config()246   virtual const IPConfigRefPtr& dhcpv6_config() const { return dhcpv6_config_; }
set_ipconfig(const IPConfigRefPtr & config)247   void set_ipconfig(const IPConfigRefPtr& config) { ipconfig_ = config; }
248 
249   const std::string& FriendlyName() const;
250 
251   // Returns a string that is guaranteed to uniquely identify this Device
252   // instance.
253   const std::string& UniqueName() const;
254 
mutable_store()255   PropertyStore* mutable_store() { return &store_; }
store()256   const PropertyStore& store() const { return store_; }
rtnl_handler()257   RTNLHandler* rtnl_handler() { return rtnl_handler_; }
running()258   bool running() const { return running_; }
259 
dispatcher()260   EventDispatcher* dispatcher() const { return dispatcher_; }
261 
262   // Load configuration for the device from |storage|.  This may include
263   // instantiating non-visible services for which configuration has been
264   // stored.
265   virtual bool Load(StoreInterface* storage);
266 
267   // Save configuration for the device to |storage|.
268   virtual bool Save(StoreInterface* storage);
269 
set_dhcp_provider(DHCPProvider * provider)270   void set_dhcp_provider(DHCPProvider* provider) { dhcp_provider_ = provider; }
271 
adaptor()272   DeviceAdaptorInterface* adaptor() const { return adaptor_.get(); }
273 
274   // Suspend event handler. Called by Manager before the system
275   // suspends. This handler, along with any other suspend handlers,
276   // will have Manager::kTerminationActionsTimeoutMilliseconds to
277   // execute before the system enters the suspend state. |callback|
278   // must be invoked after all synchronous and/or asynchronous actions
279   // this function performs complete. Code that needs to run on exit should use
280   // Manager::AddTerminationAction, rather than OnBeforeSuspend.
281   //
282   // The default implementation invokes the |callback| immediately, since
283   // there is nothing to be done in the general case.
284   virtual void OnBeforeSuspend(const ResultCallback& callback);
285 
286   // Resume event handler. Called by Manager as the system resumes.
287   // The base class implementation takes care of renewing a DHCP lease
288   // (if necessary). Derived classes may implement any technology
289   // specific requirements by overriding, but should include a call to
290   // the base class implementation.
291   virtual void OnAfterResume();
292 
293   // This method is invoked when the system resumes from suspend temporarily in
294   // the "dark resume" state. The system will reenter suspend in
295   // Manager::kTerminationActionsTimeoutMilliseconds. |callback| must be invoked
296   // after all synchronous and/or asynchronous actions this function performs
297   // and/or posts complete.
298   //
299   // The default implementation invokes the |callback| immediately, since
300   // there is nothing to be done in the general case.
301   virtual void OnDarkResume(const ResultCallback& callback);
302 
303   // Destroy the lease, if any, with this |name|.
304   // Called by the service during Unload() as part of the cleanup sequence.
305   virtual void DestroyIPConfigLease(const std::string& name);
306 
307   // Called by DeviceInfo when the kernel adds or removes a globally-scoped
308   // IPv6 address from this interface.
309   virtual void OnIPv6AddressChanged();
310 
311   // Called by DeviceInfo when the kernel receives a update for IPv6 DNS server
312   // addresses from this interface.
313   virtual void OnIPv6DnsServerAddressesChanged();
314 
315   // Called when link becomes unreliable (multiple link monitor failures
316   // detected in short period of time).
317   virtual void OnUnreliableLink();
318 
319   // Called when link becomes reliable (no link failures in a predefined period
320   // of time).
321   virtual void OnReliableLink();
322 
323   // Program a rule into the NIC to wake the system from suspend upon receiving
324   // packets from |ip_endpoint|. |error| indicates the result of the
325   // operation.
326   virtual void AddWakeOnPacketConnection(const std::string& ip_endpoint,
327                                          Error* error);
328   // Removes a rule previously programmed into the NIC to wake the system from
329   // suspend upon receiving packets from |ip_endpoint|. |error| indicates the
330   // result of the operation.
331   virtual void RemoveWakeOnPacketConnection(const std::string& ip_endpoint,
332                                             Error* error);
333   // Removes all wake-on-packet rules programmed into the NIC. |error| indicates
334   // the result of the operation.
335   virtual void RemoveAllWakeOnPacketConnections(Error* error);
336 
337   // Initiate renewal of existing DHCP lease.
338   void RenewDHCPLease();
339 
340   // Resolve the |input| string into a MAC address for a peer local to this
341   // device. This could be a trivial operation if the |input| is already a MAC
342   // address, or could involve an ARP table lookup.  Returns true and populates
343   // |output| if the resolution completes, otherwise returns false and
344   // populates |error|.
345   virtual bool ResolvePeerMacAddress(const std::string& input,
346                                      std::string* output,
347                                      Error* error);
348 
349   // Creates a byte vector from a colon-separated hardware address string.
350   static std::vector<uint8_t> MakeHardwareAddressFromString(
351       const std::string& address_string);
352 
353   // Creates a colon-separated hardware address string from a byte vector.
354   static std::string MakeStringFromHardwareAddress(
355       const std::vector<uint8_t>& address_data);
356 
357   // Request the WiFi device to roam to AP with |addr|.
358   // This call will send Roam command to wpa_supplicant.
359   virtual bool RequestRoam(const std::string& addr, Error* error);
360 
361  protected:
362   friend class base::RefCounted<Device>;
363   friend class DeviceHealthCheckerTest;
364   FRIEND_TEST(CellularServiceTest, IsAutoConnectable);
365   FRIEND_TEST(CellularTest, EnableTrafficMonitor);
366   FRIEND_TEST(CellularTest, ModemStateChangeDisable);
367   FRIEND_TEST(CellularTest, UseNoArpGateway);
368   FRIEND_TEST(DeviceHealthCheckerTest, HealthCheckerPersistsAcrossDeviceReset);
369   FRIEND_TEST(DeviceHealthCheckerTest, RequestConnectionHealthCheck);
370   FRIEND_TEST(DeviceHealthCheckerTest, SetupHealthChecker);
371   FRIEND_TEST(DevicePortalDetectionTest, RequestStartConnectivityTest);
372   FRIEND_TEST(DeviceTest, AcquireIPConfigWithoutSelectedService);
373   FRIEND_TEST(DeviceTest, AcquireIPConfigWithSelectedService);
374   FRIEND_TEST(DeviceTest, AvailableIPConfigs);
375   FRIEND_TEST(DeviceTest, DestroyIPConfig);
376   FRIEND_TEST(DeviceTest, DestroyIPConfigNULL);
377   FRIEND_TEST(DeviceTest, ConfigWithMinimumMTU);
378   FRIEND_TEST(DeviceTest, EnableIPv6);
379   FRIEND_TEST(DeviceTest, GetProperties);
380   FRIEND_TEST(DeviceTest, IPConfigUpdatedFailureWithIPv6Config);
381   FRIEND_TEST(DeviceTest, IPConfigUpdatedFailureWithIPv6Connection);
382   FRIEND_TEST(DeviceTest, IsConnectedViaTether);
383   FRIEND_TEST(DeviceTest, LinkMonitorFailure);
384   FRIEND_TEST(DeviceTest, Load);
385   FRIEND_TEST(DeviceTest, OnDHCPv6ConfigExpired);
386   FRIEND_TEST(DeviceTest, OnDHCPv6ConfigFailed);
387   FRIEND_TEST(DeviceTest, OnDHCPv6ConfigUpdated);
388   FRIEND_TEST(DeviceTest, OnIPv6AddressChanged);
389   FRIEND_TEST(DeviceTest, OnIPv6ConfigurationCompleted);
390   FRIEND_TEST(DeviceTest, OnIPv6DnsServerAddressesChanged);
391   FRIEND_TEST(DeviceTest,
392               OnIPv6DnsServerAddressesChanged_LeaseExpirationUpdated);
393   FRIEND_TEST(DeviceTest, PrependIPv4DNSServers);
394   FRIEND_TEST(DeviceTest, PrependIPv6DNSServers);
395   FRIEND_TEST(DeviceTest, Save);
396   FRIEND_TEST(DeviceTest, SelectedService);
397   FRIEND_TEST(DeviceTest, SetEnabledNonPersistent);
398   FRIEND_TEST(DeviceTest, SetEnabledPersistent);
399   FRIEND_TEST(DeviceTest, SetServiceConnectedState);
400   FRIEND_TEST(DeviceTest, ShouldUseArpGateway);
401   FRIEND_TEST(DeviceTest, Start);
402   FRIEND_TEST(DeviceTest, StartTrafficMonitor);
403   FRIEND_TEST(DeviceTest, Stop);
404   FRIEND_TEST(DeviceTest, StopTrafficMonitor);
405   FRIEND_TEST(ManagerTest, ConnectedTechnologies);
406   FRIEND_TEST(ManagerTest, DefaultTechnology);
407   FRIEND_TEST(ManagerTest, DeviceRegistrationAndStart);
408   FRIEND_TEST(ManagerTest, GetEnabledDeviceWithTechnology);
409   FRIEND_TEST(ManagerTest, SetEnabledStateForTechnology);
410   FRIEND_TEST(ManagerTest, GetEnabledDeviceByLinkName);
411   FRIEND_TEST(PPPDeviceTest, UpdateIPConfigFromPPP);
412   FRIEND_TEST(WiFiMainTest, Connect);
413   FRIEND_TEST(WiFiMainTest, UseArpGateway);
414   FRIEND_TEST(WiMaxTest, ConnectTimeout);
415   FRIEND_TEST(WiMaxTest, UseNoArpGateway);
416 
417   virtual ~Device();
418 
419   // Each device must implement this method to do the work needed to
420   // enable the device to operate for establishing network connections.
421   // The |error| argument, if not nullptr,
422   // will refer to an Error that starts out with the value
423   // Error::kOperationInitiated. This reflects the assumption that
424   // enable (and disable) operations will usually be non-blocking,
425   // and their completion will be indicated by means of an asynchronous
426   // reply sometime later. There are two circumstances in which a
427   // device's Start() method may overwrite |error|:
428   //
429   // 1. If an early failure is detected, such that the non-blocking
430   //    part of the operation never takes place, then |error| should
431   //    be set to the appropriate value corresponding to the type
432   //    of failure. This is the "immediate failure" case.
433   // 2. If the device is enabled without performing any non-blocking
434   //    steps, then |error| should be Reset, i.e., its value set
435   //    to Error::kSuccess. This is the "immediate success" case.
436   //
437   // In these two cases, because completion is immediate, |callback|
438   // is not used. If neither of these two conditions holds, then |error|
439   // should not be modified, and |callback| should be passed to the
440   // method that will initiate the non-blocking operation.
441   virtual void Start(Error* error,
442                      const EnabledStateChangedCallback& callback) = 0;
443 
444   // Each device must implement this method to do the work needed to
445   // disable the device, i.e., clear any running state, and make the
446   // device no longer capable of establishing network connections.
447   // The discussion for Start() regarding the use of |error| and
448   // |callback| apply to Stop() as well.
449   virtual void Stop(Error* error,
450                     const EnabledStateChangedCallback& callback) = 0;
451 
452   // The EnabledStateChangedCallback that gets passed to the device's
453   // Start() and Stop() methods is bound to this method. |callback|
454   // is the callback that was passed to SetEnabled().
455   void OnEnabledStateChanged(const ResultCallback& callback,
456                              const Error& error);
457 
458   // Drops the currently selected service along with its IP configuration and
459   // connection, if any.
460   virtual void DropConnection();
461 
462   // If there's an IP configuration in |ipconfig_|, releases the IP address and
463   // destroys the configuration instance.
464   void DestroyIPConfig();
465 
466   // Creates a new DHCP IP configuration instance, stores it in |ipconfig_| and
467   // requests a new IP configuration.  Saves the DHCP lease to the generic
468   // lease filename based on the interface name.  Registers a callback to
469   // IPConfigUpdatedCallback on IP configuration changes. Returns true if the IP
470   // request was successfully sent.
471   bool AcquireIPConfig();
472 
473   // Creates a new DHCP IP configuration instance, stores it in |ipconfig_| and
474   // requests a new IP configuration.  Saves the DHCP lease to a filename
475   // based on the passed-in |lease_name|.  Registers a callback to
476   // IPConfigUpdatedCallback on IP configuration changes. Returns true if the IP
477   // request was successfully sent.
478   bool AcquireIPConfigWithLeaseName(const std::string& lease_name);
479 
480 #ifndef DISABLE_DHCPV6
481   // Creates a new DHCPv6 configuration instances, stores it in
482   // |dhcpv6_config_| and requests a new configuration.  Saves the DHCPv6
483   // lease to a filename based on the passed-in |lease_name|.
484   // The acquired configurations will not be used to setup a connection
485   // for the device.
486   bool AcquireIPv6ConfigWithLeaseName(const std::string& lease_name);
487 #endif
488 
489   // Assigns the IP configuration |properties| to |ipconfig_|.
490   void AssignIPConfig(const IPConfig::Properties& properties);
491 
492   // Callback invoked on successful IP configuration updates.
493   virtual void OnIPConfigUpdated(const IPConfigRefPtr& ipconfig,
494                                  bool new_lease_acquired);
495 
496   // Called when IPv6 configuration changes.
497   virtual void OnIPv6ConfigUpdated();
498 
499   // Callback invoked on IP configuration failures.
500   void OnIPConfigFailed(const IPConfigRefPtr& ipconfig);
501 
502   // Callback invoked when "Refresh" is invoked on an IPConfig.  This usually
503   // signals a change in static IP parameters.
504   void OnIPConfigRefreshed(const IPConfigRefPtr& ipconfig);
505 
506   // Callback invoked when an IPConfig restarts due to lease expiry.  This
507   // is advisory, since an "Updated" or "Failed" signal is guaranteed to
508   // follow.
509   void OnIPConfigExpired(const IPConfigRefPtr& ipconfig);
510 
511   // Called by Device so that subclasses can run hooks on the selected service
512   // failing to get an IP.  The default implementation disconnects the selected
513   // service with Service::kFailureDHCP.
514   virtual void OnIPConfigFailure();
515 
516   // Callback invoked on successful DHCPv6 configuration updates.
517   void OnDHCPv6ConfigUpdated(const IPConfigRefPtr& ipconfig,
518                              bool new_lease_acquired);
519 
520   // Callback invoked on DHCPv6 configuration failures.
521   void OnDHCPv6ConfigFailed(const IPConfigRefPtr& ipconfig);
522 
523   // Callback invoked when an DHCPv6Config restarts due to lease expiry.  This
524   // is advisory, since an "Updated" or "Failed" signal is guaranteed to
525   // follow.
526   void OnDHCPv6ConfigExpired(const IPConfigRefPtr& ipconfig);
527 
528   // Maintain connection state (Routes, IP Addresses and DNS) in the OS.
529   void CreateConnection();
530 
531   // Remove connection state
532   void DestroyConnection();
533 
534   // Selects a service to be "current" -- i.e. link-state or configuration
535   // events that happen to the device are attributed to this service.
536   void SelectService(const ServiceRefPtr& service);
537 
538   // Set the state of the |selected_service_|.
539   virtual void SetServiceState(Service::ConnectState state);
540 
541   // Set the failure of the selected service (implicitly sets the state to
542   // "failure").
543   virtual void SetServiceFailure(Service::ConnectFailure failure_state);
544 
545   // Records the failure mode and time of the selected service, and
546   // sets the Service state of the selected service to "Idle".
547   // Avoids showing a failure mole in the UI.
548   virtual void SetServiceFailureSilent(Service::ConnectFailure failure_state);
549 
550   // Called by the Portal Detector whenever a trial completes.  Device
551   // subclasses that choose unique mappings from portal results to connected
552   // states can override this method in order to do so.
553   virtual void PortalDetectorCallback(const PortalDetector::Result& result);
554 
555   // Initiate portal detection, if enabled for this device type.
556   bool StartPortalDetection();
557 
558   // Stop portal detection if it is running.
559   void StopPortalDetection();
560 
561   // Initiate connection diagnostics with the |result| from a completed portal
562   // detection attempt.
563   virtual bool StartConnectionDiagnosticsAfterPortalDetection(
564       const PortalDetector::Result& result);
565 
566   // Stop connection diagnostics if it is running.
567   void StopConnectionDiagnostics();
568 
569   // Stop connectivity tester if it exists.
570   void StopConnectivityTest();
571 
572   // Initiate link monitoring, if enabled for this device type.
573   bool StartLinkMonitor();
574 
575   // Stop link monitoring if it is running.
576   void StopLinkMonitor();
577 
578   // Respond to a LinkMonitor failure in a Device-specific manner.
579   virtual void OnLinkMonitorFailure();
580 
581   // Respond to a LinkMonitor gateway's MAC address found/change event.
582   virtual void OnLinkMonitorGatewayChange();
583 
584   // Returns true if traffic monitor is enabled on this device. The default
585   // implementation will return false, which can be overridden by a derived
586   // class.
587   virtual bool IsTrafficMonitorEnabled() const;
588 
589   // Initiates traffic monitoring on the device if traffic monitor is enabled.
590   void StartTrafficMonitor();
591 
592   // Stops traffic monitoring on the device if traffic monitor is enabled.
593   void StopTrafficMonitor();
594 
595   // Start DNS test for the given servers. When retry_until_success is set,
596   // callback will only be invoke when the test succeed or the test failed to
597   // start (internal error). This function will return false if there is a test
598   // that's already running, and true otherwise.
599   virtual bool StartDNSTest(
600       const std::vector<std::string>& dns_servers,
601       const bool retry_until_success,
602       const base::Callback<void(const DNSServerTester::Status)>& callback);
603   // Stop DNS test if one is running.
604   virtual void StopDNSTest();
605 
606   // Timer function for monitoring IPv6 DNS server's lifetime.
607   void StartIPv6DNSServerTimer(uint32_t lifetime_seconds);
608   void StopIPv6DNSServerTimer();
609 
610   // Stop all monitoring/testing activities on this device. Called when tearing
611   // down or changing network connection on the device.
612   void StopAllActivities();
613 
614   // Called by the Traffic Monitor when it detects a network problem. Device
615   // subclasses that want to roam to a different network when encountering
616   // network problems can override this method in order to do so. The parent
617   // implementation handles the metric reporting of the network problem.
618   virtual void OnEncounterNetworkProblem(int reason);
619 
620   // Set the state of the selected service, with checks to make sure
621   // the service is already in a connected state before doing so.
622   void SetServiceConnectedState(Service::ConnectState state);
623 
624   // Specifies whether an ARP gateway should be used for the
625   // device technology.
626   virtual bool ShouldUseArpGateway() const;
627 
628   // Indicates if the selected service is configured with a static IP address.
629   bool IsUsingStaticIP() const;
630 
631   // Indicates if the selected service is configured with static nameservers.
632   bool IsUsingStaticNameServers() const;
633 
selected_service()634   const ServiceRefPtr& selected_service() const { return selected_service_; }
635 
636   void HelpRegisterConstDerivedString(
637       const std::string& name,
638       std::string(Device::*get)(Error*));
639 
640   void HelpRegisterConstDerivedRpcIdentifier(
641       const std::string& name,
642       RpcIdentifier(Device::*get)(Error*));
643 
644   void HelpRegisterConstDerivedRpcIdentifiers(
645       const std::string& name,
646       RpcIdentifiers(Device::*get)(Error*));
647 
648   void HelpRegisterConstDerivedUint64(
649       const std::string& name,
650       uint64_t(Device::*get)(Error*));
651 
652   // Called by the ConnectionTester whenever a connectivity test completes.
653   virtual void ConnectionTesterCallback();
654 
655   // Property getters reserved for subclasses
control_interface()656   ControlInterface* control_interface() const { return control_interface_; }
metrics()657   Metrics* metrics() const { return metrics_; }
manager()658   Manager* manager() const { return manager_; }
link_monitor()659   const LinkMonitor* link_monitor() const { return link_monitor_.get(); }
660   void set_link_monitor(LinkMonitor* link_monitor);
661   // Use for unit test.
662   void set_traffic_monitor(TrafficMonitor* traffic_monitor);
663 
664   // Calculates the time (in seconds) till a DHCP lease is due for renewal,
665   // and stores this value in |result|. Returns false is there is no upcoming
666   // DHCP lease renewal, true otherwise.
667   bool TimeToNextDHCPLeaseRenewal(uint32_t* result);
668 
669  private:
670   friend class CellularCapabilityTest;
671   friend class CellularTest;
672   friend class DeviceAdaptorInterface;
673   friend class DeviceByteCountTest;
674   friend class DevicePortalDetectionTest;
675   friend class DeviceTest;
676   friend class EthernetTest;
677   friend class OpenVPNDriverTest;
678   friend class TestDevice;
679   friend class VirtualDeviceTest;
680   friend class WiFiObjectTest;
681 
682   static const char kIPFlagTemplate[];
683   static const char kIPFlagVersion4[];
684   static const char kIPFlagVersion6[];
685   static const char kIPFlagDisableIPv6[];
686   static const char kIPFlagUseTempAddr[];
687   static const char kIPFlagUseTempAddrUsedAndDefault[];
688   static const char kIPFlagReversePathFilter[];
689   static const char kIPFlagReversePathFilterEnabled[];
690   static const char kIPFlagReversePathFilterLooseMode[];
691   static const char kIPFlagArpAnnounce[];
692   static const char kIPFlagArpAnnounceDefault[];
693   static const char kIPFlagArpAnnounceBestLocal[];
694   static const char kIPFlagArpIgnore[];
695   static const char kIPFlagArpIgnoreDefault[];
696   static const char kIPFlagArpIgnoreLocalOnly[];
697   static const char kStoragePowered[];
698   static const char kStorageReceiveByteCount[];
699   static const char kStorageTransmitByteCount[];
700   static const char kFallbackDnsTestHostname[];
701   static const char* kFallbackDnsServers[];
702   static const int kDNSTimeoutMilliseconds;
703 
704   // Maximum seconds between two link monitor failures to declare this link
705   // (network) as unreliable.
706   static const int kLinkUnreliableThresholdSeconds;
707 
708   static const size_t kHardwareAddressLength;
709 
710   // Configure static IP address parameters if the service provides them.
711   void ConfigureStaticIPTask();
712 
713   // Right now, Devices reference IPConfigs directly when persisted to disk
714   // It's not clear that this makes sense long-term, but that's how it is now.
715   // This call generates a string in the right format for this persisting.
716   // |suffix| is injected into the storage identifier used for the configs.
717   std::string SerializeIPConfigs(const std::string& suffix);
718 
719   // Set an IP configuration flag on the device. |family| should be "ipv6" or
720   // "ipv4". |flag| should be the name of the flag to be set and |value| is
721   // what this flag should be set to. Overridden by unit tests to pretend
722   // writing to procfs.
723   virtual bool SetIPFlag(IPAddress::Family family,
724                          const std::string& flag,
725                          const std::string& value);
726 
727   // Request the removal of reverse-path filtering for this interface.
728   // This will allow packets destined for this interface to be accepted,
729   // even if this is not the default route for such a packet to arrive.
730   void DisableReversePathFilter();
731 
732   // Request reverse-path filtering for this interface.
733   void EnableReversePathFilter();
734 
735   // Disable ARP filtering on the device.  The interface will exhibit the
736   // default Linux behavior -- incoming ARP requests are responded to by all
737   // interfaces.  Outgoing ARP requests can contain any local address.
738   void DisableArpFiltering();
739 
740   // Enable ARP filtering on the device.  Incoming ARP requests are responded
741   // to only by the interface(s) owning the address.  Outgoing ARP requests
742   // will contain the best local address for the target.
743   void EnableArpFiltering();
744 
745   std::string GetSelectedServiceRpcIdentifier(Error* error);
746   std::vector<std::string> AvailableIPConfigs(Error* error);
747 
748   // Get the LinkMonitor's average response time.
749   uint64_t GetLinkMonitorResponseTime(Error* error);
750 
751   // Get receive and transmit byte counters. These methods simply wrap
752   // GetReceiveByteCount and GetTransmitByteCount in order to be used by
753   // HelpRegisterConstDerivedUint64.
754   uint64_t GetReceiveByteCountProperty(Error* error);
755   uint64_t GetTransmitByteCountProperty(Error* error);
756 
757   // Emit a property change signal for the "IPConfigs" property of this device.
758   void UpdateIPConfigsProperty();
759 
760   // Called by DNS server tester when the fallback DNS servers test completes.
761   void FallbackDNSResultCallback(const DNSServerTester::Status status);
762 
763   // Called by DNS server tester when the configured DNS servers test completes.
764   void ConfigDNSResultCallback(const DNSServerTester::Status status);
765 
766   // Update DNS setting with the given DNS servers for the current connection.
767   void SwitchDNSServers(const std::vector<std::string>& dns_servers);
768 
769   // Called when the lifetime for IPv6 DNS server expires.
770   void IPv6DNSServerExpired();
771 
772   // Return true if given IP configuration contain both IP address and DNS
773   // servers. Hence, ready to be used for network connection.
774   bool IPConfigCompleted(const IPConfigRefPtr& ipconfig);
775 
776   // Setup network connection with given IP configuration, and start portal
777   // detection on that connection.
778   void SetupConnection(const IPConfigRefPtr& ipconfig);
779 
780   // Set the system hostname to |hostname| if this device is configured to
781   // do so.  If |hostname| is too long, truncate this parameter to fit within
782   // the maximum hostname size.
783   bool SetHostname(const std::string& hostname);
784 
785   // Prepend the Manager's configured list of DNS servers into |ipconfig|
786   // ensuring that only DNS servers of the same address family as |ipconfig| are
787   // included in the final list.
788   void PrependDNSServersIntoIPConfig(const IPConfigRefPtr& ipconfig);
789 
790   // Mutate |servers| to include the Manager's prepended list of DNS servers for
791   // |family|.  On return, it is guaranteed that there are no duplicate entries
792   // in |servers|.
793   void PrependDNSServers(const IPAddress::Family family,
794                          std::vector<std::string>* servers);
795 
796   // Called by |connection_diagnostics| after diagnostics have finished.
797   void ConnectionDiagnosticsCallback(
798       const std::string& connection_issue,
799       const std::vector<ConnectionDiagnostics::Event>& diagnostic_events);
800 
801   // |enabled_persistent_| is the value of the Powered property, as
802   // read from the profile. If it is not found in the profile, it
803   // defaults to true. |enabled_| reflects the real-time state of
804   // the device, i.e., enabled or disabled. |enabled_pending_| reflects
805   // the target state of the device while an enable or disable operation
806   // is occurring.
807   //
808   // Some typical sequences for these state variables are shown below.
809   //
810   // Shill starts up, profile has been read:
811   //  |enabled_persistent_|=true   |enabled_|=false   |enabled_pending_|=false
812   //
813   // Shill acts on the value of |enabled_persistent_|, calls SetEnabled(true):
814   //  |enabled_persistent_|=true   |enabled_|=false   |enabled_pending_|=true
815   //
816   // SetEnabled completes successfully, device is enabled:
817   //  |enabled_persistent_|=true   |enabled_|=true    |enabled_pending_|=true
818   //
819   // User presses "Disable" button, SetEnabled(false) is called:
820   //  |enabled_persistent_|=false   |enabled_|=true    |enabled_pending_|=false
821   //
822   // SetEnabled completes successfully, device is disabled:
823   //  |enabled_persistent_|=false   |enabled_|=false    |enabled_pending_|=false
824   bool enabled_;
825   bool enabled_persistent_;
826   bool enabled_pending_;
827 
828   // Other properties
829   bool reconnect_;
830   const std::string hardware_address_;
831 
832   PropertyStore store_;
833 
834   const int interface_index_;
835   bool running_;  // indicates whether the device is actually in operation
836   const std::string link_name_;
837   const std::string unique_id_;
838   ControlInterface* control_interface_;
839   EventDispatcher* dispatcher_;
840   Metrics* metrics_;
841   Manager* manager_;
842   IPConfigRefPtr ipconfig_;
843   IPConfigRefPtr ip6config_;
844   IPConfigRefPtr dhcpv6_config_;
845   ConnectionRefPtr connection_;
846   base::WeakPtrFactory<Device> weak_ptr_factory_;
847   std::unique_ptr<DeviceAdaptorInterface> adaptor_;
848   std::unique_ptr<PortalDetector> portal_detector_;
849   std::unique_ptr<LinkMonitor> link_monitor_;
850   // Used for verifying whether DNS server is functional.
851   std::unique_ptr<DNSServerTester> dns_server_tester_;
852   base::Callback<void(const PortalDetector::Result&)>
853       portal_detector_callback_;
854   // Callback to invoke when IPv6 DNS servers lifetime expired.
855   base::CancelableClosure ipv6_dns_server_expired_callback_;
856   std::unique_ptr<TrafficMonitor> traffic_monitor_;
857   // DNS servers obtained from ipconfig (either from DHCP or static config)
858   // that are not working.
859   std::vector<std::string> config_dns_servers_;
860   Technology::Identifier technology_;
861   // The number of portal detection attempts from Connected to Online state.
862   // This includes all failure/timeout attempts and the final successful
863   // attempt.
864   int portal_attempts_to_online_;
865 
866   // Keep track of the offset between the interface-reported byte counters
867   // and our persisted value.
868   uint64_t receive_byte_offset_;
869   uint64_t transmit_byte_offset_;
870 
871   // Maintain a reference to the connected / connecting service
872   ServiceRefPtr selected_service_;
873 
874   // Cache singleton pointers for performance and test purposes.
875   DHCPProvider* dhcp_provider_;
876   RTNLHandler* rtnl_handler_;
877 
878   // Time when link monitor last failed.
879   Time* time_;
880   time_t last_link_monitor_failed_time_;
881   // Callback to invoke when link becomes reliable again after it was previously
882   // unreliable.
883   base::CancelableClosure reliable_link_callback_;
884 
885   std::unique_ptr<ConnectionTester> connection_tester_;
886   base::Callback<void()> connection_tester_callback_;
887 
888   // Track whether packets from non-optimal routes will be accepted by this
889   // device.  This is referred to as "loose mode" (see RFC3704).
890   bool is_loose_routing_;
891 
892   // Track the current same-net multi-home state.
893   bool is_multi_homed_;
894 
895   // Remember which flag files were previously successfully written.
896   std::set<std::string> written_flags_;
897 
898   std::unique_ptr<ConnectionDiagnostics> connection_diagnostics_;
899   base::Callback<void(const std::string&,
900                       const std::vector<ConnectionDiagnostics::Event>&)>
901       connection_diagnostics_callback_;
902 
903   DISALLOW_COPY_AND_ASSIGN(Device);
904 };
905 
906 }  // namespace shill
907 
908 #endif  // SHILL_DEVICE_H_
909