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_MANAGER_H_
     18 #define SHILL_MANAGER_H_
     19 
     20 #include <map>
     21 #include <memory>
     22 #include <string>
     23 #include <vector>
     24 
     25 #include <base/cancelable_callback.h>
     26 #include <base/files/file_path.h>
     27 #include <base/macros.h>
     28 #include <base/memory/ref_counted.h>
     29 #include <base/memory/weak_ptr.h>
     30 #if defined(__ANDROID__)
     31 #include <dbus/service_constants.h>
     32 #else
     33 #include <chromeos/dbus/service_constants.h>
     34 #endif  // __ANDROID__
     35 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
     36 
     37 #include "shill/cellular/modem_info.h"
     38 #include "shill/crypto_util_proxy.h"
     39 #include "shill/dhcp_properties.h"
     40 #include "shill/device.h"
     41 #include "shill/device_info.h"
     42 #include "shill/event_dispatcher.h"
     43 #include "shill/geolocation_info.h"
     44 #include "shill/hook_table.h"
     45 #include "shill/metrics.h"
     46 #include "shill/net/ip_address.h"
     47 #include "shill/power_manager.h"
     48 #include "shill/profile.h"
     49 #include "shill/property_store.h"
     50 #include "shill/service.h"
     51 #include "shill/upstart/upstart.h"
     52 #include "shill/wimax/wimax_provider.h"
     53 
     54 namespace shill {
     55 
     56 class ControlInterface;
     57 class DeviceClaimer;
     58 class DefaultProfile;
     59 class Error;
     60 class EventDispatcher;
     61 class IPAddressStore;
     62 class ManagerAdaptorInterface;
     63 class Resolver;
     64 class StoreInterface;
     65 class VPNProvider;
     66 
     67 #if !defined(DISABLE_WIFI)
     68 class WiFiProvider;
     69 #if defined(__BRILLO__)
     70 class RPCServiceWatcherInterface;
     71 class WiFiDriverHal;
     72 #endif  // __BRILLO__
     73 #endif  // DISABLE_WIFI
     74 
     75 #if !defined(DISABLE_WIRED_8021X)
     76 class EthernetEapProvider;
     77 #endif  // DISABLE_WIRED_8021X
     78 
     79 class Manager : public base::SupportsWeakPtr<Manager> {
     80  public:
     81   typedef base::Callback<void(const ServiceRefPtr& service)> ServiceCallback;
     82 
     83   struct Properties {
     84    public:
     85     Properties()
     86         : offline_mode(false),
     87           portal_check_interval_seconds(0),
     88           arp_gateway(true),
     89           connection_id_salt(0),
     90           minimum_mtu(IPConfig::kUndefinedMTU) {}
     91     bool offline_mode;
     92     std::string check_portal_list;
     93     std::string country;
     94     int32_t portal_check_interval_seconds;
     95     std::string portal_url;
     96     std::string host_name;
     97     // Whether to ARP for the default gateway in the DHCP client after
     98     // acquiring a lease.
     99     bool arp_gateway;
    100     // Comma-separated list of technologies for which link-monitoring is
    101     // enabled.
    102     std::string link_monitor_technologies;
    103     // Comma-separated list of technologies for which auto-connect is disabled.
    104     std::string no_auto_connect_technologies;
    105     // Comma-separated list of technologies that should never be enabled.
    106     std::string prohibited_technologies;
    107     // Comma-separated list of DNS search paths to be ignored.
    108     std::string ignored_dns_search_paths;
    109     // Comma-separated list of DNS servers to prepend to resolver list.
    110     std::string prepend_dns_servers;
    111     // Salt value use for calculating network connection ID.
    112     int connection_id_salt;
    113     // The minimum MTU value that will be respected in DHCP responses.
    114     int minimum_mtu;
    115   };
    116 
    117   Manager(ControlInterface* control_interface,
    118           EventDispatcher* dispatcher,
    119           Metrics* metrics,
    120           const std::string& run_directory,
    121           const std::string& storage_directory,
    122           const std::string& user_storage_directory);
    123   virtual ~Manager();
    124 
    125   void RegisterAsync(const base::Callback<void(bool)>& completion_callback);
    126 
    127   virtual void SetBlacklistedDevices(
    128       const std::vector<std::string>& blacklisted_devices);
    129   virtual void SetWhitelistedDevices(
    130       const std::vector<std::string>& whitelisted_devices);
    131 
    132   // Returns true if |device_name| is either not in the blacklist, or in the
    133   // whitelist, depending on which list was supplied in startup settings.
    134   virtual bool DeviceManagementAllowed(const std::string& device_name);
    135 
    136   virtual void Start();
    137   virtual void Stop();
    138   bool running() const { return running_; }
    139 
    140   const ProfileRefPtr& ActiveProfile() const;
    141   bool IsActiveProfile(const ProfileRefPtr& profile) const;
    142   bool MoveServiceToProfile(const ServiceRefPtr& to_move,
    143                             const ProfileRefPtr& destination);
    144   ProfileRefPtr LookupProfileByRpcIdentifier(const std::string& profile_rpcid);
    145 
    146   // Called via RPC call on Service (|to_set|) to set the "Profile" property.
    147   virtual void SetProfileForService(const ServiceRefPtr& to_set,
    148                                     const std::string& profile,
    149                                     Error* error);
    150 
    151   virtual void RegisterDevice(const DeviceRefPtr& to_manage);
    152   virtual void DeregisterDevice(const DeviceRefPtr& to_forget);
    153 
    154   virtual bool HasService(const ServiceRefPtr& service);
    155   // Register a Service with the Manager. Manager may choose to
    156   // connect to it immediately.
    157   virtual void RegisterService(const ServiceRefPtr& to_manage);
    158   // Deregister a Service from the Manager. Caller is responsible
    159   // for disconnecting the Service before-hand.
    160   virtual void DeregisterService(const ServiceRefPtr& to_forget);
    161   virtual void UpdateService(const ServiceRefPtr& to_update);
    162 
    163   // Persists |to_update| into an appropriate profile.
    164   virtual void UpdateDevice(const DeviceRefPtr& to_update);
    165 
    166 #if !defined(DISABLE_WIFI)
    167   virtual void UpdateWiFiProvider();
    168 #endif  // DISABLE_WIFI
    169 
    170   std::vector<DeviceRefPtr>
    171       FilterByTechnology(Technology::Identifier tech) const;
    172 
    173   ServiceRefPtr FindService(const std::string& name);
    174   RpcIdentifiers EnumerateAvailableServices(Error* error);
    175 
    176   // Return the complete list of services, including those that are not visible.
    177   RpcIdentifiers EnumerateCompleteServices(Error* error);
    178 
    179   // called via RPC (e.g., from ManagerDBusAdaptor)
    180   std::map<std::string, std::string> GetLoadableProfileEntriesForService(
    181       const ServiceConstRefPtr& service);
    182   ServiceRefPtr GetService(const KeyValueStore& args, Error* error);
    183   ServiceRefPtr ConfigureService(const KeyValueStore& args, Error* error);
    184   ServiceRefPtr ConfigureServiceForProfile(
    185       const std::string& profile_rpcid,
    186       const KeyValueStore& args,
    187       Error* error);
    188   ServiceRefPtr FindMatchingService(const KeyValueStore& args, Error* error);
    189 
    190   // Retrieve geolocation data from the Manager.
    191   const std::map<std::string, GeolocationInfos>
    192       &GetNetworksForGeolocation() const;
    193 
    194   // Called by Device when its geolocation data has been updated.
    195   virtual void OnDeviceGeolocationInfoUpdated(const DeviceRefPtr& device);
    196 
    197   void ConnectToBestServices(Error* error);
    198 
    199   // Method to create connectivity report for connected services.
    200   void CreateConnectivityReport(Error* error);
    201 
    202   // Request portal detection checks on each registered device until a portal
    203   // detection attempt starts on one of them.
    204   void RecheckPortal(Error* error);
    205   // Request portal detection be restarted on the device connected to
    206   // |service|.
    207   virtual void RecheckPortalOnService(const ServiceRefPtr& service);
    208 
    209   virtual void RequestScan(Device::ScanType scan_type,
    210                            const std::string& technology, Error* error);
    211   // Configure scheduled scan for wifi devices.
    212   virtual void SetSchedScan(bool enable, Error* error);
    213   std::string GetTechnologyOrder();
    214   virtual void SetTechnologyOrder(const std::string& order, Error* error);
    215   // Set up the profile list starting with a default profile along with
    216   // an (optional) list of startup profiles.
    217   void InitializeProfiles();
    218   // Create a profile.  This does not affect the profile stack.  Returns
    219   // the RPC path of the created profile in |path|.
    220   void CreateProfile(const std::string& name, std::string* path, Error* error);
    221   // Pushes existing profile with name |name| onto stack of managed profiles.
    222   // Returns the RPC path of the pushed profile in |path|.
    223   void PushProfile(const std::string& name, std::string* path, Error* error);
    224   // Insert an existing user profile with name |name| into the stack of
    225   // managed profiles.  Associate |user_hash| with this profile entry.
    226   // Returns the RPC path of the pushed profile in |path|.
    227   void InsertUserProfile(const std::string& name,
    228                          const std::string& user_hash,
    229                          std::string* path,
    230                          Error* error);
    231   // Pops profile named |name| off the top of the stack of managed profiles.
    232   void PopProfile(const std::string& name, Error* error);
    233   // Remove the active profile.
    234   void PopAnyProfile(Error* error);
    235   // Remove all user profiles from the stack of managed profiles leaving only
    236   // default profiles.
    237   void PopAllUserProfiles(Error* error);
    238   // Remove the underlying persistent storage for a profile.
    239   void RemoveProfile(const std::string& name, Error* error);
    240   // Give the ownership of the device with name |device_name| to claimer with
    241   // name |claimer_name|. This will cause shill to stop managing this device.
    242   virtual void ClaimDevice(const std::string& claimer_name,
    243                            const std::string& interface_name,
    244                            Error* error);
    245   // Claimer |claimer_name| release the ownership of the device with
    246   // |interface_name| back to shill. This method will set |claimer_removed|
    247   // to true iff Claimer |claimer_name| is not the default claimer and no
    248   // longer claims any devices.
    249   virtual void ReleaseDevice(const std::string& claimer_name,
    250                              const std::string& interface_name,
    251                              bool* claimer_removed,
    252                              Error* error);
    253 #if !defined(DISABLE_WIFI) && defined(__BRILLO__)
    254   // Setup an AP mode interface using WiFi driver HAL.  The driver
    255   // may or may not teardown the station mode interface as a result
    256   // of this call.  This behavior will be driver specific.
    257   // Returns true and sets |interface_name| on success, false otherwise.
    258   virtual bool SetupApModeInterface(std::string* out_interface_name,
    259                                     Error* error);
    260 
    261   // Setup a station mode interface using WiFi driver HAL.  The driver
    262   // may or may not teardown the AP mode interface as a result of this
    263   // call.  This behavior will be driver specific.
    264   // Returns true and sets |interface_name| on success, false otherwise.
    265   virtual bool SetupStationModeInterface(std::string* out_interface_name,
    266                                          Error* error);
    267 
    268   virtual void OnApModeSetterVanished();
    269 #endif  // !DISABLE_WIFI && __BRILLO__
    270 
    271   // Called by a service to remove its associated configuration.  If |service|
    272   // is associated with a non-ephemeral profile, this configuration entry
    273   // will be removed and the manager will search for another matching profile.
    274   // If the service ends up with no matching profile, it is unloaded (which
    275   // may also remove the service from the manager's list, e.g. WiFi services
    276   // that are not visible)..
    277   void RemoveService(const ServiceRefPtr& service);
    278   // Handle the event where a profile is about to remove a profile entry.
    279   // Any Services that are dependent on this storage identifier will need
    280   // to find new profiles.  Return true if any service has been moved to a new
    281   // profile.  Any such services will have had the profile group removed from
    282   // the profile.
    283   virtual bool HandleProfileEntryDeletion(const ProfileRefPtr& profile,
    284                                           const std::string& entry_name);
    285   // Find a registered service that contains a GUID property that
    286   // matches |guid|.
    287   virtual ServiceRefPtr GetServiceWithGUID(const std::string& guid,
    288                                            Error* error);
    289   // Find a service that is both the member of |profile| and has a
    290   // storage identifier that matches |entry_name|.  This function is
    291   // called by the Profile in order to return a profile entry's properties.
    292   virtual ServiceRefPtr GetServiceWithStorageIdentifier(
    293       const ProfileRefPtr& profile,
    294       const std::string& entry_name,
    295       Error* error);
    296   // Create a temporary service for an entry |entry_name| within |profile|.
    297   // Callers must not register this service with the Manager or connect it
    298   // since it was never added to the provider's service list.
    299   virtual ServiceRefPtr CreateTemporaryServiceFromProfile(
    300       const ProfileRefPtr& profile,
    301       const std::string& entry_name,
    302       Error* error);
    303   // Return a reference to the Service associated with the default connection.
    304   // If there is no such connection, this function returns a reference to NULL.
    305   virtual ServiceRefPtr GetDefaultService() const;
    306 
    307   // Set enabled state of all |technology_name| devices to |enabled_state|.
    308   // Persist the state to storage is |persist| is true.
    309   void SetEnabledStateForTechnology(const std::string& technology_name,
    310                                     bool enabled_state,
    311                                     bool persist,
    312                                     Error* error,
    313                                     const ResultCallback& callback);
    314   // Return whether a technology is marked as enabled for portal detection.
    315   virtual bool IsPortalDetectionEnabled(Technology::Identifier tech);
    316   // Set the start-up value for the portal detection list.  This list will
    317   // be used until a value set explicitly over the control API.  Until
    318   // then, we ignore but do not overwrite whatever value is stored in the
    319   // profile.
    320   virtual void SetStartupPortalList(const std::string& portal_list);
    321 
    322   // Returns true if profile |a| has been pushed on the Manager's
    323   // |profiles_| stack before profile |b|.
    324   virtual bool IsProfileBefore(const ProfileRefPtr& a,
    325                                const ProfileRefPtr& b) const;
    326 
    327   // Return whether a service belongs to the ephemeral profile.
    328   virtual bool IsServiceEphemeral(const ServiceConstRefPtr& service) const;
    329 
    330   // Return whether a Technology has any connected Services.
    331   virtual bool IsTechnologyConnected(Technology::Identifier technology) const;
    332 
    333   // Return whether a technology is enabled for link monitoring.
    334   virtual bool IsTechnologyLinkMonitorEnabled(
    335       Technology::Identifier technology) const;
    336 
    337   // Return whether the Wake on LAN feature is enabled.
    338   virtual bool IsWakeOnLanEnabled() const { return is_wake_on_lan_enabled_; }
    339 
    340   // Return whether a technology is disabled for auto-connect.
    341   virtual bool IsTechnologyAutoConnectDisabled(
    342       Technology::Identifier technology) const;
    343 
    344   // Report whether |technology| is prohibited from being enabled.
    345   virtual bool IsTechnologyProhibited(Technology::Identifier technology) const;
    346 
    347   // Called by Profile when a |storage| completes initialization.
    348   void OnProfileStorageInitialized(Profile* storage);
    349 
    350   // Return a Device with technology |technology| in the enabled state.
    351   virtual DeviceRefPtr GetEnabledDeviceWithTechnology(
    352       Technology::Identifier technology) const;
    353 
    354   // Return a Device with link_name |link_name| in the enabled state.
    355   virtual DeviceRefPtr GetEnabledDeviceByLinkName(
    356       const std::string& link_name) const;
    357 
    358   // Returns true if at least one connection exists, and false if there's no
    359   // connected service.
    360   virtual bool IsConnected() const;
    361   // Returns true if at least one connection exists that have Internet
    362   // connectivity, and false if there's no such service.
    363   virtual bool IsOnline() const;
    364   std::string CalculateState(Error* error);
    365 
    366   // Recalculate the |connected_state_| string and emit a singal if it has
    367   // changed.
    368   void RefreshConnectionState();
    369 
    370   virtual int GetPortalCheckInterval() const {
    371     return props_.portal_check_interval_seconds;
    372   }
    373   virtual const std::string& GetPortalCheckURL() const {
    374     return props_.portal_url;
    375   }
    376 
    377   virtual DeviceInfo* device_info() { return &device_info_; }
    378 #if !defined(DISABLE_CELLULAR)
    379   virtual ModemInfo* modem_info() { return &modem_info_; }
    380 #endif  // DISABLE_CELLULAR
    381   PowerManager* power_manager() const { return power_manager_.get(); }
    382 #if !defined(DISABLE_WIRED_8021X)
    383   virtual EthernetEapProvider* ethernet_eap_provider() const {
    384     return ethernet_eap_provider_.get();
    385   }
    386 #endif  // DISABLE_WIRED_8021X
    387   VPNProvider* vpn_provider() const { return vpn_provider_.get(); }
    388 #if !defined(DISABLE_WIFI)
    389   WiFiProvider* wifi_provider() const { return wifi_provider_.get(); }
    390 #endif  // DISABLE_WIFI
    391 #if !defined(DISABLE_WIMAX)
    392   virtual WiMaxProvider* wimax_provider() { return wimax_provider_.get(); }
    393 #endif  // DISABLE_WIMAX
    394   PropertyStore* mutable_store() { return &store_; }
    395   virtual const PropertyStore& store() const { return store_; }
    396   virtual const base::FilePath& run_path() const { return run_path_; }
    397   const base::FilePath& storage_path() const { return storage_path_; }
    398   IPAddressStore* health_checker_remote_ips() const {
    399     return health_checker_remote_ips_.get();
    400   }
    401 
    402   bool GetArpGateway() const { return props_.arp_gateway; }
    403 
    404   virtual int GetMinimumMTU() const { return props_.minimum_mtu; }
    405   virtual void SetMinimumMTU(const int mtu) { props_.minimum_mtu = mtu; }
    406 
    407   virtual void UpdateEnabledTechnologies();
    408   virtual void UpdateUninitializedTechnologies();
    409 
    410   const DhcpProperties& dhcp_properties() const {
    411     return *dhcp_properties_;
    412   }
    413 
    414   // Writes the service |to_update| to persistant storage.  If the service's is
    415   // ephemeral, it is moved to the current profile.
    416   void SaveServiceToProfile(const ServiceRefPtr& to_update);
    417 
    418   // Adds a closure to be executed when ChromeOS suspends or shill terminates.
    419   // |name| should be unique; otherwise, a previous closure by the same name
    420   // will be replaced.  |start| will be called when RunTerminationActions() is
    421   // called.  When an action completed, TerminationActionComplete() must be
    422   // called.
    423   void AddTerminationAction(const std::string& name,
    424                             const base::Closure& start);
    425 
    426   // Users call this function to report the completion of an action |name|.
    427   // This function should be called once for each action.
    428   void TerminationActionComplete(const std::string& name);
    429 
    430   // Removes the action associtated with |name|.
    431   void RemoveTerminationAction(const std::string& name);
    432 
    433   // Runs the termination actions and notifies the metrics framework
    434   // that the termination actions started running, only if any termination
    435   // actions have been registered. If all actions complete within
    436   // |kTerminationActionsTimeoutMilliseconds|, |done_callback| is called with a
    437   // value of Error::kSuccess. Otherwise, it is called with
    438   // Error::kOperationTimeout.
    439   //
    440   // Returns true, if termination actions were run.
    441   bool RunTerminationActionsAndNotifyMetrics(
    442       const ResultCallback& done_callback);
    443 
    444   // Registers a |callback| that's invoked whenever the default service
    445   // changes. Returns a unique tag that can be used to deregister the
    446   // callback. A tag equal to 0 is invalid.
    447   virtual int RegisterDefaultServiceCallback(const ServiceCallback& callback);
    448   virtual void DeregisterDefaultServiceCallback(int tag);
    449 
    450 #if !defined(DISABLE_WIFI)
    451   // Verifies that the destination described by certificate is valid, and that
    452   // we're currently connected to that destination.  A full description of the
    453   // rules being enforced is in doc/manager-api.txt.  Returns true iff all
    454   // checks pass, false otherwise.  On false, error is filled with a
    455   // descriptive error code and message.
    456   //
    457   // |certificate| is a PEM encoded x509 certificate, |public_key| is a base64
    458   // encoded public half of an RSA key, |nonce| is a random string, and
    459   // |signed_data| is a base64 encoded string as described in
    460   // doc/manager-api.txt.
    461   void VerifyDestination(const std::string& certificate,
    462                          const std::string& public_key,
    463                          const std::string& nonce,
    464                          const std::string& signed_data,
    465                          const std::string& destination_udn,
    466                          const std::string& hotspot_ssid,
    467                          const std::string& hotspot_bssid,
    468                          const ResultBoolCallback& cb,
    469                          Error* error);
    470 
    471   // After verifying the destination, encrypt the string data with
    472   // |public_key|, the base64 encoded public half of an RSA key pair.  Returns
    473   // the base64 encoded result if successful, or an empty string on failure.
    474   // On failure, |error| will be filled with an appropriately descriptive
    475   // message and error code.
    476   void VerifyAndEncryptData(const std::string& certificate,
    477                             const std::string& public_key,
    478                             const std::string& nonce,
    479                             const std::string& signed_data,
    480                             const std::string& destination_udn,
    481                             const std::string& hotspot_ssid,
    482                             const std::string& hotspot_bssid,
    483                             const std::string& data,
    484                             const ResultStringCallback& cb,
    485                             Error* error);
    486 
    487   // After verifying the destination, encrypt the password for |network_path|
    488   // under |public_key|.  Similar to EncryptData above except that the
    489   // information being encrypted is implicitly the authentication credentials
    490   // of the given network.
    491   void VerifyAndEncryptCredentials(const std::string& certificate,
    492                                    const std::string& public_key,
    493                                    const std::string& nonce,
    494                                    const std::string& signed_data,
    495                                    const std::string& destination_udn,
    496                                    const std::string& hotspot_ssid,
    497                                    const std::string& hotspot_bssid,
    498                                    const std::string& network_path,
    499                                    const ResultStringCallback& cb,
    500                                    Error* error);
    501 #endif  // DISABLE_WIFI
    502 
    503   // Calculate connection identifier, which is hash of salt value, gateway IP
    504   // address, and gateway MAC address.
    505   int CalcConnectionId(std::string gateway_ip, std::string gateway_mac);
    506 
    507   // Report the number of services associated with given connection
    508   // |connection_id|.
    509   void ReportServicesOnSameNetwork(int connection_id);
    510 
    511   // Running in passive mode, manager will not manage any devices (all devices
    512   // are blacklisted) by default. Remote application can specify devices for
    513   // shill to manage through ReleaseInterface/ClaimInterface DBus API using
    514   // default claimer (with "" as claimer_name).
    515   virtual void SetPassiveMode();
    516 
    517   // Decides whether Ethernet-like devices are treated as unknown devices
    518   // if they do not indicate a driver name.
    519   virtual void SetIgnoreUnknownEthernet(bool ignore);
    520   virtual bool ignore_unknown_ethernet() const {
    521     return ignore_unknown_ethernet_;
    522   }
    523 
    524   // Set the list of prepended DNS servers to |prepend_dns_servers|.
    525   virtual void SetPrependDNSServers(const std::string& prepend_dns_servers);
    526 
    527   // Accept hostname from DHCP server for devices matching |hostname_from|.
    528   virtual void SetAcceptHostnameFrom(const std::string& hostname_from);
    529   virtual bool ShouldAcceptHostnameFrom(const std::string& device_name) const;
    530 
    531   // Set DHCPv6 enabled device list.
    532   virtual void SetDHCPv6EnabledDevices(
    533       const std::vector<std::string>& device_list);
    534 
    535   // Return true if DHCPv6 is enabled for the given device with |device_name|.
    536   virtual bool IsDHCPv6EnabledForDevice(const std::string& device_name) const;
    537 
    538   // Filter the list of prepended DNS servers, copying only those that match
    539   // |family| into |dns_servers|.  |dns_servers| is cleared, regardless of
    540   // whether or not there are any addresses that match |family|.
    541   virtual std::vector<std::string> FilterPrependDNSServersByFamily(
    542       IPAddress::Family family) const;
    543 
    544   // Returns true iff |power_manager_| exists and is suspending (i.e.
    545   // power_manager->suspending() is true), false otherwise.
    546   virtual bool IsSuspending();
    547 
    548   void RecordDarkResumeWakeReason(const std::string& wake_reason);
    549 
    550   // Called when service's inner device changed.
    551   virtual void OnInnerDevicesChanged();
    552 
    553   void set_suppress_autoconnect(bool val) { suppress_autoconnect_ = val; }
    554   bool suppress_autoconnect() { return suppress_autoconnect_; }
    555 
    556   // Called when remote device claimer vanishes.
    557   virtual void OnDeviceClaimerVanished();
    558 
    559  private:
    560   friend class CellularTest;
    561   friend class DeviceInfoTest;
    562   friend class ManagerAdaptorInterface;
    563   friend class ManagerTest;
    564   friend class ModemInfoTest;
    565   friend class ModemManagerTest;
    566   friend class ServiceTest;
    567   friend class VPNServiceTest;
    568   friend class WiFiObjectTest;
    569   friend class WiMaxProviderTest;
    570 
    571   FRIEND_TEST(CellularCapabilityUniversalMainTest, TerminationAction);
    572   FRIEND_TEST(CellularCapabilityUniversalMainTest,
    573               TerminationActionRemovedByStopModem);
    574   FRIEND_TEST(CellularTest, LinkEventWontDestroyService);
    575   FRIEND_TEST(DefaultProfileTest, LoadManagerDefaultProperties);
    576   FRIEND_TEST(DefaultProfileTest, LoadManagerProperties);
    577   FRIEND_TEST(DefaultProfileTest, Save);
    578   FRIEND_TEST(DeviceTest, AcquireIPConfigWithoutSelectedService);
    579   FRIEND_TEST(DeviceTest, AcquireIPConfigWithSelectedService);
    580   FRIEND_TEST(DeviceTest, StartProhibited);
    581   FRIEND_TEST(ManagerTest, AvailableTechnologies);
    582   FRIEND_TEST(ManagerTest, ClaimBlacklistedDevice);
    583   FRIEND_TEST(ManagerTest, ClaimDeviceWhenClaimerNotVerified);
    584   FRIEND_TEST(ManagerTest, ClaimDeviceWithoutClaimer);
    585   FRIEND_TEST(ManagerTest, ConnectedTechnologies);
    586   FRIEND_TEST(ManagerTest, ConnectionStatusCheck);
    587   FRIEND_TEST(ManagerTest, ConnectToBestServices);
    588   FRIEND_TEST(ManagerTest, CreateConnectivityReport);
    589   FRIEND_TEST(ManagerTest, DefaultTechnology);
    590   FRIEND_TEST(ManagerTest, DetectMultiHomedDevices);
    591   FRIEND_TEST(ManagerTest, DeviceClaimerVanishedTask);
    592   FRIEND_TEST(ManagerTest, DevicePresenceStatusCheck);
    593   FRIEND_TEST(ManagerTest, DeviceRegistrationAndStart);
    594   FRIEND_TEST(ManagerTest, DisableTechnology);
    595   FRIEND_TEST(ManagerTest, EnableTechnology);
    596   FRIEND_TEST(ManagerTest, EnumerateProfiles);
    597   FRIEND_TEST(ManagerTest, EnumerateServiceInnerDevices);
    598   FRIEND_TEST(ManagerTest, HandleProfileEntryDeletionWithUnload);
    599   FRIEND_TEST(ManagerTest, InitializeProfilesInformsProviders);
    600   FRIEND_TEST(ManagerTest, InitializeProfilesHandlesDefaults);
    601   FRIEND_TEST(ManagerTest, IsDefaultProfile);
    602   FRIEND_TEST(ManagerTest, IsTechnologyAutoConnectDisabled);
    603   FRIEND_TEST(ManagerTest, IsTechnologyProhibited);
    604   FRIEND_TEST(ManagerTest, IsWifiIdle);
    605   FRIEND_TEST(ManagerTest, LinkMonitorEnabled);
    606   FRIEND_TEST(ManagerTest, MoveService);
    607   FRIEND_TEST(ManagerTest, NotifyDefaultServiceChanged);
    608   FRIEND_TEST(ManagerTest, OnApModeSetterVanished);
    609   FRIEND_TEST(ManagerTest, OnDeviceClaimerAppeared);
    610   FRIEND_TEST(ManagerTest, PopProfileWithUnload);
    611   FRIEND_TEST(ManagerTest, RegisterKnownService);
    612   FRIEND_TEST(ManagerTest, RegisterUnknownService);
    613   FRIEND_TEST(ManagerTest, ReleaseBlacklistedDevice);
    614   FRIEND_TEST(ManagerTest, ReleaseDevice);
    615   FRIEND_TEST(ManagerTest, RunTerminationActions);
    616   FRIEND_TEST(ManagerTest, ServiceRegistration);
    617   FRIEND_TEST(ManagerTest, SetupApModeInterface);
    618   FRIEND_TEST(ManagerTest, SetupStationModeInterface);
    619   FRIEND_TEST(ManagerTest, SortServicesWithConnection);
    620   FRIEND_TEST(ManagerTest, StartupPortalList);
    621   FRIEND_TEST(ServiceTest, IsAutoConnectable);
    622 
    623   struct DeviceClaim {
    624     DeviceClaim() {}
    625     DeviceClaim(const std::string& in_device_name,
    626                 const ResultCallback& in_result_callback)
    627         : device_name(in_device_name),
    628           result_callback(in_result_callback) {}
    629     std::string device_name;
    630     ResultCallback result_callback;
    631   };
    632 
    633   static const char kErrorNoDevice[];
    634   static const char kErrorTypeRequired[];
    635   static const char kErrorUnsupportedServiceType[];
    636 
    637   // Technologies to probe for.
    638   static const char* kProbeTechnologies[];
    639 
    640   // Name of the default claimer.
    641   static const char kDefaultClaimerName[];
    642 
    643   // Timeout interval for probing various device status, and report them to
    644   // UMA stats.
    645   static const int kDeviceStatusCheckIntervalMilliseconds;
    646   // Time to wait for termination actions to complete.
    647   static const int kTerminationActionsTimeoutMilliseconds;
    648 
    649   void AutoConnect();
    650   std::vector<std::string> AvailableTechnologies(Error* error);
    651   std::vector<std::string> ConnectedTechnologies(Error* error);
    652   std::string DefaultTechnology(Error* error);
    653   std::vector<std::string> EnabledTechnologies(Error* error);
    654   std::vector<std::string> UninitializedTechnologies(Error* error);
    655   RpcIdentifiers EnumerateDevices(Error* error);
    656   RpcIdentifiers EnumerateProfiles(Error* error);
    657   RpcIdentifiers EnumerateWatchedServices(Error* error);
    658   std::string GetActiveProfileRpcIdentifier(Error* error);
    659   std::string GetCheckPortalList(Error* error);
    660   RpcIdentifier GetDefaultServiceRpcIdentifier(Error* error);
    661   std::string GetIgnoredDNSSearchPaths(Error* error);
    662   ServiceRefPtr GetServiceInner(const KeyValueStore& args, Error* error);
    663   bool SetCheckPortalList(const std::string& portal_list, Error* error);
    664   bool SetIgnoredDNSSearchPaths(const std::string& ignored_paths, Error* error);
    665   void EmitDefaultService();
    666   bool IsTechnologyInList(const std::string& technology_list,
    667                           Technology::Identifier tech) const;
    668   void EmitDeviceProperties();
    669 #if !defined(DISABLE_WIFI)
    670   bool SetDisableWiFiVHT(const bool& disable_wifi_vht, Error* error);
    671   bool GetDisableWiFiVHT(Error* error);
    672 #endif  // DISABLE_WIFI
    673   bool SetProhibitedTechnologies(const std::string& prohibited_technologies,
    674                                  Error* error);
    675   std::string GetProhibitedTechnologies(Error* error);
    676   void OnTechnologyProhibited(Technology::Identifier technology,
    677                               const Error& error);
    678 
    679   // For every device instance that is sharing the same connectivity with
    680   // another device, enable the multi-home flag.
    681   void DetectMultiHomedDevices();
    682 
    683   // Unload a service while iterating through |services_|.  Returns true if
    684   // service was erased (which means the caller loop should not increment
    685   // |service_iterator|), false otherwise (meaning the caller should
    686   // increment |service_iterator|).
    687   bool UnloadService(std::vector<ServiceRefPtr>::iterator* service_iterator);
    688 
    689   // Load Manager default properties from |profile|.
    690   void LoadProperties(const scoped_refptr<DefaultProfile>& profile);
    691 
    692   // Configure the device with profile data from all current profiles.
    693   void LoadDeviceFromProfiles(const DeviceRefPtr& device);
    694 
    695   void HelpRegisterConstDerivedRpcIdentifier(
    696       const std::string& name,
    697       RpcIdentifier(Manager::*get)(Error*));
    698   void HelpRegisterConstDerivedRpcIdentifiers(
    699       const std::string& name,
    700       RpcIdentifiers(Manager::*get)(Error*));
    701   void HelpRegisterDerivedString(
    702       const std::string& name,
    703       std::string(Manager::*get)(Error* error),
    704       bool(Manager::*set)(const std::string&, Error*));
    705   void HelpRegisterConstDerivedStrings(
    706       const std::string& name,
    707       Strings(Manager::*get)(Error*));
    708   void HelpRegisterDerivedBool(
    709       const std::string& name,
    710       bool(Manager::*get)(Error* error),
    711       bool(Manager::*set)(const bool& value, Error* error));
    712 
    713   bool HasProfile(const Profile::Identifier& ident);
    714   void PushProfileInternal(const Profile::Identifier& ident,
    715                            std::string* path,
    716                            Error* error);
    717   void PopProfileInternal();
    718   void OnProfilesChanged();
    719 
    720   void SortServices();
    721   void SortServicesTask();
    722   void DeviceStatusCheckTask();
    723   void ConnectionStatusCheck();
    724   void DevicePresenceStatusCheck();
    725 
    726   bool MatchProfileWithService(const ServiceRefPtr& service);
    727 
    728   // Sets the profile of |service| to |profile|, without notifying its
    729   // previous profile.  Configures a |service| with |args|, then saves
    730   // the resulting configuration to |profile|.  This method is useful
    731   // when copying a service configuration from one profile to another,
    732   // or writing a newly created service config to a specific profile.
    733   static void SetupServiceInProfile(ServiceRefPtr service,
    734                                     ProfileRefPtr profile,
    735                                     const KeyValueStore& args,
    736                                     Error* error);
    737 
    738   // For each technology present, connect to the "best" service available,
    739   // as determined by sorting all services independent of their current state.
    740   void ConnectToBestServicesTask();
    741 
    742   void NotifyDefaultServiceChanged(const ServiceRefPtr& service);
    743 
    744   // Runs the termination actions.  If all actions complete within
    745   // |kTerminationActionsTimeoutMilliseconds|, |done_callback| is called with a
    746   // value of Error::kSuccess.  Otherwise, it is called with
    747   // Error::kOperationTimeout.
    748   void RunTerminationActions(const ResultCallback& done_callback);
    749 
    750   // Called when the system is about to be suspended.  Each call will be
    751   // followed by a call to OnSuspendDone().
    752   void OnSuspendImminent();
    753 
    754   // Called when the system has completed a suspend attempt (possibly without
    755   // actually suspending, in the event of the user canceling the attempt).
    756   void OnSuspendDone();
    757 
    758   // Called when the system is entering a dark resume phase (and hence a dark
    759   // suspend is imminent).
    760   void OnDarkSuspendImminent();
    761 
    762   void OnSuspendActionsComplete(const Error& error);
    763   void OnDarkResumeActionsComplete(const Error& error);
    764 
    765 #if !defined(DISABLE_WIFI)
    766   void VerifyToEncryptLink(std::string public_key, std::string data,
    767                            ResultStringCallback cb, const Error& error,
    768                            bool success);
    769 #endif  // DISABLE_WIFI
    770 
    771   // Return true if wifi device is enabled with no existing connection (pending
    772   // or connected).
    773   bool IsWifiIdle();
    774 
    775   // For unit testing.
    776   void set_metrics(Metrics* metrics) { metrics_ = metrics; }
    777   void UpdateProviderMapping();
    778 
    779   // Used by tests to set a mock PowerManager.  Takes ownership of
    780   // power_manager.
    781   void set_power_manager(PowerManager* power_manager) {
    782     power_manager_.reset(power_manager);
    783   }
    784 
    785   DeviceRefPtr GetDeviceConnectedToService(ServiceRefPtr service);
    786 
    787   void DeregisterDeviceByLinkName(const std::string& link_name);
    788 
    789   // Returns the names of all of the devices that have been claimed by the
    790   // current DeviceClaimer.  Returns an empty vector if no DeviceClaimer is set.
    791   std::vector<std::string> ClaimedDevices(Error* error);
    792 
    793   EventDispatcher* dispatcher_;
    794   const base::FilePath run_path_;
    795   const base::FilePath storage_path_;
    796   const base::FilePath user_storage_path_;
    797   base::FilePath user_profile_list_path_;  // Changed in tests.
    798   std::unique_ptr<ManagerAdaptorInterface> adaptor_;
    799   DeviceInfo device_info_;
    800 #if !defined(DISABLE_CELLULAR)
    801   ModemInfo modem_info_;
    802 #endif  // DISABLE_CELLULAR
    803 #if !defined(DISABLE_WIRED_8021X)
    804   std::unique_ptr<EthernetEapProvider> ethernet_eap_provider_;
    805 #endif  // DISABLE_WIRED_8021X
    806   std::unique_ptr<VPNProvider> vpn_provider_;
    807 #if !defined(DISABLE_WIFI)
    808   std::unique_ptr<WiFiProvider> wifi_provider_;
    809 #if defined(__BRILLO__)
    810   WiFiDriverHal* wifi_driver_hal_;
    811 #endif  // __BRILLO__
    812 #endif  // DISABLE_WIFI
    813 #if !defined(DISABLE_WIMAX)
    814   std::unique_ptr<WiMaxProvider> wimax_provider_;
    815 #endif  // DISABLE_WIMAX
    816   // Hold pointer to singleton Resolver instance for testing purposes.
    817   Resolver* resolver_;
    818   bool running_;
    819   // Used to facilitate unit tests which can't use RPC.
    820   bool connect_profiles_to_rpc_;
    821   std::vector<DeviceRefPtr> devices_;
    822   // We store Services in a vector, because we want to keep them sorted.
    823   // Services that are connected appear first in the vector.  See
    824   // Service::Compare() for details of the sorting criteria.
    825   std::vector<ServiceRefPtr> services_;
    826   // Map of technologies to Provider instances.  These pointers are owned
    827   // by the respective scoped_reptr objects that are held over the lifetime
    828   // of the Manager object.
    829   std::map<Technology::Identifier, ProviderInterface*> providers_;
    830   // List of startup profile names to push on the profile stack on startup.
    831   std::vector<ProfileRefPtr> profiles_;
    832   ProfileRefPtr ephemeral_profile_;
    833   ControlInterface* control_interface_;
    834   Metrics* metrics_;
    835   std::unique_ptr<PowerManager> power_manager_;
    836   std::unique_ptr<Upstart> upstart_;
    837 
    838   // The priority order of technologies
    839   std::vector<Technology::Identifier> technology_order_;
    840 
    841   // This is the last Service RPC Identifier for which we emitted a
    842   // "DefaultService" signal for.
    843   RpcIdentifier default_service_rpc_identifier_;
    844 
    845   // Manager can be optionally configured with a list of technologies to
    846   // do portal detection on at startup.  We need to keep track of that list
    847   // as well as a flag that tells us whether we should continue using it
    848   // instead of the configured portal list.
    849   std::string startup_portal_list_;
    850   bool use_startup_portal_list_;
    851 
    852   // Properties to be get/set via PropertyStore calls.
    853   Properties props_;
    854   PropertyStore store_;
    855 
    856   // Accept hostname supplied by the DHCP server from the specified devices.
    857   // eg. eth0 or eth*
    858   std::string accept_hostname_from_;
    859 
    860   base::CancelableClosure sort_services_task_;
    861 
    862   // Task for periodically checking various device status.
    863   base::CancelableClosure device_status_check_task_;
    864 
    865   // TODO(petkov): Currently this handles both terminate and suspend
    866   // actions. Rename all relevant identifiers to capture this.
    867   HookTable termination_actions_;
    868 
    869   // Is a suspend delay currently registered with the power manager?
    870   bool suspend_delay_registered_;
    871 
    872   // Whether Wake on LAN should be enabled for all Ethernet devices.
    873   bool is_wake_on_lan_enabled_;
    874 
    875   // Whether to ignore Ethernet-like devices that don't have an assigned driver.
    876   bool ignore_unknown_ethernet_;
    877 
    878   // Maps tags to callbacks for monitoring default service changes.
    879   std::map<int, ServiceCallback> default_service_callbacks_;
    880   int default_service_callback_tag_;
    881 
    882   // Delegate to handle destination verification operations for the manager.
    883   std::unique_ptr<CryptoUtilProxy> crypto_util_proxy_;
    884 
    885   // Stores IP addresses of some remote hosts that accept port 80 TCP
    886   // connections. ConnectionHealthChecker uses these IPs.
    887   // The store resides in Manager so that it persists across Device reset.
    888   std::unique_ptr<IPAddressStore> health_checker_remote_ips_;
    889 
    890   // Stores the most recent copy of geolocation information for each
    891   // technology type.
    892   std::map<std::string, GeolocationInfos> networks_for_geolocation_;
    893 
    894   // Stores the state of the highest ranked connected service.
    895   std::string connection_state_;
    896 
    897   // Stores the most recent state of all watched services.
    898   std::map<std::string, Service::ConnectState> watched_service_states_;
    899 
    900   // Device claimer is a remote application/service that claim/release devices
    901   // from/to shill. To reduce complexity, only allow one device claimer at a
    902   // time.
    903   std::unique_ptr<DeviceClaimer> device_claimer_;
    904 
    905   // When true, suppresses autoconnects in Manager::AutoConnect.
    906   bool suppress_autoconnect_;
    907 
    908   // Whether any of the services is in connected state or not.
    909   bool is_connected_state_;
    910 
    911   // List of blacklisted devices specified from command line.
    912   std::vector<std::string> blacklisted_devices_;
    913 
    914   // List of whitelisted devices specified from command line.
    915   std::vector<std::string> whitelisted_devices_;
    916 
    917   // List of DHCPv6 enabled devices.
    918   std::vector<std::string> dhcpv6_enabled_devices_;
    919 
    920   // DhcpProperties stored for the default profile.
    921   std::unique_ptr<DhcpProperties> dhcp_properties_;
    922 
    923   DISALLOW_COPY_AND_ASSIGN(Manager);
    924 };
    925 
    926 }  // namespace shill
    927 
    928 #endif  // SHILL_MANAGER_H_
    929