Home | History | Annotate | Download | only in shill
      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 
    235   const std::string& address() const { return hardware_address_; }
    236   const std::string& link_name() const { return link_name_; }
    237   int interface_index() const { return interface_index_; }
    238   virtual const ConnectionRefPtr& connection() const { return connection_; }
    239   bool enabled() const { return enabled_; }
    240   bool enabled_persistent() const { return enabled_persistent_; }
    241   virtual Technology::Identifier technology() const { return technology_; }
    242   std::string GetTechnologyString(Error* error);
    243 
    244   virtual const IPConfigRefPtr& ipconfig() const { return ipconfig_; }
    245   virtual const IPConfigRefPtr& ip6config() const { return ip6config_; }
    246   virtual const IPConfigRefPtr& dhcpv6_config() const { return dhcpv6_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 
    255   PropertyStore* mutable_store() { return &store_; }
    256   const PropertyStore& store() const { return store_; }
    257   RTNLHandler* rtnl_handler() { return rtnl_handler_; }
    258   bool running() const { return running_; }
    259 
    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 
    270   void set_dhcp_provider(DHCPProvider* provider) { dhcp_provider_ = provider; }
    271 
    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 
    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
    656   ControlInterface* control_interface() const { return control_interface_; }
    657   Metrics* metrics() const { return metrics_; }
    658   Manager* manager() const { return manager_; }
    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