// // Copyright (C) 2013 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SHILL_SERVICE_H_ #define SHILL_SERVICE_H_ #include #include #include #include #include #include #include #include #include #include // for FRIEND_TEST #include "shill/accessor_interface.h" #include "shill/adaptor_interfaces.h" #include "shill/callbacks.h" #include "shill/dhcp_properties.h" #include "shill/net/event_history.h" #include "shill/net/shill_time.h" #include "shill/property_store.h" #include "shill/refptr_types.h" #include "shill/static_ip_parameters.h" #include "shill/technology.h" namespace chromeos_metrics { class Timer; } namespace shill { class ControlInterface; class DhcpProperties; class DiagnosticsReporter; class Endpoint; class Error; class EventDispatcher; class HTTPProxy; class KeyValueStore; class Manager; class Metrics; class MockManager; class ServiceAdaptorInterface; class ServiceMockAdaptor; class ServicePropertyChangeNotifier; class Sockets; class StoreInterface; #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X) class EapCredentials; #endif // DISABLE_WIFI || DISABLE_WIRED_8021X // A Service is a uniquely named entity, which the system can // connect in order to begin sending and receiving network traffic. // All Services are bound to an Entry, which represents the persistable // state of the Service. If the Entry is populated at the time of Service // creation, that information is used to prime the Service. If not, the Entry // becomes populated over time. class Service : public base::RefCounted { public: static const char kCheckPortalAuto[]; static const char kCheckPortalFalse[]; static const char kCheckPortalTrue[]; static const char kErrorDetailsNone[]; // TODO(pstew): Storage constants shouldn't need to be public // crbug.com/208736 static const char kStorageAutoConnect[]; static const char kStorageCheckPortal[]; static const char kStorageDNSAutoFallback[]; static const char kStorageError[]; static const char kStorageFavorite[]; static const char kStorageGUID[]; static const char kStorageHasEverConnected[]; static const char kStorageName[]; static const char kStoragePriority[]; static const char kStoragePriorityWithinTechnology[]; static const char kStorageProxyConfig[]; static const char kStorageSaveCredentials[]; static const char kStorageType[]; static const char kStorageUIData[]; static const char kStorageConnectionId[]; static const char kStorageLinkMonitorDisabled[]; static const char kStorageManagedCredentials[]; static const uint8_t kStrengthMax; static const uint8_t kStrengthMin; enum ConnectFailure { kFailureUnknown, kFailureAAA, kFailureActivation, kFailureBadPassphrase, kFailureBadWEPKey, kFailureConnect, kFailureDHCP, kFailureDNSLookup, kFailureEAPAuthentication, kFailureEAPLocalTLS, kFailureEAPRemoteTLS, kFailureHTTPGet, kFailureIPSecCertAuth, kFailureIPSecPSKAuth, kFailureInternal, kFailureNeedEVDO, kFailureNeedHomeNetwork, kFailureOTASP, kFailureOutOfRange, kFailurePPPAuth, kFailurePinMissing, kFailureMax }; enum ConnectState { kStateUnknown, kStateIdle, kStateAssociating, kStateConfiguring, kStateConnected, kStatePortal, kStateFailure, kStateOnline }; enum CryptoAlgorithm { kCryptoNone, kCryptoRc4, kCryptoAes }; enum UpdateCredentialsReason{ kReasonCredentialsLoaded, kReasonPropertyUpdate }; static const int kPriorityNone; // A constructor for the Service object Service(ControlInterface* control_interface, EventDispatcher* dispatcher, Metrics* metrics, Manager* manager, Technology::Identifier technology); // AutoConnect MAY choose to ignore the connection request in some // cases. For example, if the corresponding Device only supports one // concurrent connection, and another Service is already connected // or connecting. // // AutoConnect MAY issue RPCs immediately. So AutoConnect MUST NOT // be called from a D-Bus signal handler context. virtual void AutoConnect(); // Queue up a connection attempt. Derived classes SHOULD call the // base class implementation before beginning a connect. The base // class will log the connection attempt, and update base-class // state. virtual void Connect(Error* error, const char* reason); // Disconnect this service. Override this method to add your service specific // disconnect logic, but call the super class's Disconnect() first. virtual void Disconnect(Error* error, const char* reason); // Disconnects this service via Disconnect(). Marks the service as having // failed with |failure|. Do not override this method. virtual void DisconnectWithFailure(ConnectFailure failure, Error* error, const char* reason); // Disconnects this service via Disconnect(). The service will not be eligible // for auto-connect until a subsequent call to Connect, or Load. Do not // override this method. virtual void UserInitiatedDisconnect(Error* error); // Connect to this service via Connect(). This function indicates that the // connection attempt is user-initiated. virtual void UserInitiatedConnect(Error* error); // The default implementation returns the error kInvalidArguments. virtual void ActivateCellularModem(const std::string& carrier, Error* error, const ResultCallback& callback); // The default implementation returns the error kNotSupported. virtual void CompleteCellularActivation(Error* error); virtual bool IsActive(Error* error); // Returns whether services of this type should be auto-connect by default. virtual bool IsAutoConnectByDefault() const { return false; } virtual ConnectState state() const { return state_; } // Updates the state of the Service and alerts the manager. Also // clears |failure_| if the new state isn't a failure. virtual void SetState(ConnectState state); std::string GetStateString() const; // Set portal detection failure phase and status (reason). This function // is called when portal detection failed for the Service. virtual void SetPortalDetectionFailure(const std::string& phase, const std::string& status); // State utility functions static bool IsConnectedState(ConnectState state); static bool IsConnectingState(ConnectState state); virtual bool IsConnected() const; virtual bool IsConnecting() const; virtual bool IsFailed() const { // We sometimes lie about the failure state, to keep Chrome happy // (see comment in WiFi::HandleDisconnect). Hence, we check both // state and |failed_time_|. return state() == kStateFailure || failed_time_ > 0; } virtual bool IsInFailState() const { return state() == kStateFailure; } virtual bool IsOnline() const { return state() == kStateOnline; } // Returns true if the connection for |this| depends on service |b|. virtual bool IsDependentOn(const ServiceRefPtr& b) const; virtual bool IsPortalled() const { return state() == kStatePortal; } // Return true if service is allowed to automatically switch to fallback // DNS server. virtual bool is_dns_auto_fallback_allowed() const { return is_dns_auto_fallback_allowed_; } virtual bool link_monitor_disabled() const { return link_monitor_disabled_; } virtual ConnectFailure failure() const { return failure_; } // Sets the |previous_error_| property based on the current |failure_|, and // sets a serial number for this failure. virtual void SaveFailure(); // Records the failure mode and time. Sets the Service state to "Failure". virtual void SetFailure(ConnectFailure failure); // Records the failure mode and time. Sets the Service state to "Idle". // Avoids showing a failure mole in the UI. virtual void SetFailureSilent(ConnectFailure failure); // Returns a string that is guaranteed to uniquely identify this Service // instance. const std::string& unique_name() const { return unique_name_; } virtual std::string GetRpcIdentifier() const; // Returns the unique persistent storage identifier for the service. virtual std::string GetStorageIdentifier() const = 0; // Returns the identifier within |storage| from which configuration for // this service can be loaded. Returns an empty string if no entry in // |storage| can be used. virtual std::string GetLoadableStorageIdentifier( const StoreInterface& storage) const; // Returns whether the service configuration can be loaded from |storage|. virtual bool IsLoadableFrom(const StoreInterface& storage) const; // Returns true if the service uses 802.1x for key management. virtual bool Is8021x() const { return false; } // Loads the service from persistent |storage|. Returns true on success. virtual bool Load(StoreInterface* storage); // Indicate to service that it is no longer persisted to storage. It // should purge any stored profile state (e.g., credentials). Returns // true to indicate that this service should also be unregistered from // the manager, false otherwise. virtual bool Unload(); // Attempt to remove the service. On failure, no changes in state will occur. virtual void Remove(Error* error); // Saves the service to persistent |storage|. Returns true on success. virtual bool Save(StoreInterface* storage); // Applies all the properties in |args| to this service object's mutable // store, except for those in parameters_ignored_for_configure_. // Returns an error in |error| if one or more parameter set attempts // fails, but will only return the first error. virtual void Configure(const KeyValueStore& args, Error* error); // Iterate over all the properties in |args| and test for an identical // value in this service object's store. Returns false if one or more // keys in |args| do not exist or have different values, true otherwise. virtual bool DoPropertiesMatch(const KeyValueStore& args) const; // Returns whether portal detection is explicitly disabled on this service // via a property set on it. virtual bool IsPortalDetectionDisabled() const; // Returns whether portal detection is set to follow the default setting // of this service's technology via a property set on it. virtual bool IsPortalDetectionAuto() const; // Returns true if the service is persisted to a non-ephemeral profile. virtual bool IsRemembered() const; // Returns true if the service RPC identifier should be part of the // manager's advertised services list, false otherwise. virtual bool IsVisible() const { return true; } // Returns true if there is a proxy configuration set on this service. virtual bool HasProxyConfig() const { return !proxy_config_.empty(); } // Returns whether this service has had recent connection issues. virtual bool HasRecentConnectionIssues(); // If the AutoConnect property has not already been marked as saved, set // its value to true and mark it saved. virtual void EnableAndRetainAutoConnect(); // Set the connection for this service. If the connection is non-NULL, create // an HTTP Proxy that will utilize this service's connection to serve // requests. virtual void SetConnection(const ConnectionRefPtr& connection); virtual const ConnectionRefPtr& connection() const { return connection_; } // Emit service's IP config change event to chrome. virtual void NotifyIPConfigChanges(); #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X) // Examines the EAP credentials for the service and returns true if a // connection attempt can be made. virtual bool Is8021xConnectable() const; // Add an EAP certification id |name| at position |depth| in the stack. // Returns true if entry was added, false otherwise. virtual bool AddEAPCertification(const std::string& name, size_t depth); // Clear all EAP certification elements. virtual void ClearEAPCertification(); #endif // DISABLE_WIFI || DISABLE_WIRED_8021X // Returns true if this service contains a IP address in its static IP // parameters, false otherwise. virtual bool HasStaticIPAddress() const; // Returns true if this service contains nameservers in its static IP // parameters, false otherwise. virtual bool HasStaticNameServers() const; // The inherited class that needs to send metrics after the service has // transitioned to the ready state should override this method. // |time_resume_to_ready_milliseconds| holds the elapsed time from when // the system was resumed until when the service transitioned to the // connected state. This value is non-zero for the first service transition // to the connected state after a resume. virtual void SendPostReadyStateMetrics( int64_t /*time_resume_to_ready_milliseconds*/) const {} bool auto_connect() const { return auto_connect_; } void SetAutoConnect(bool connect); bool connectable() const { return connectable_; } // Sets the connectable property of the service, and broadcast the // new value. Does not update the manager. // TODO(petkov): Remove this method in favor of SetConnectableFull. void SetConnectable(bool connectable); // Sets the connectable property of the service, broadcasts the new // value, and alerts the manager if necessary. void SetConnectableFull(bool connectable); virtual bool explicitly_disconnected() const { return explicitly_disconnected_; } // Return RPC identifier for device that's internal to this service, which is // not registered with the manager. virtual std::string GetInnerDeviceRpcIdentifier() const { return ""; } bool retain_auto_connect() const { return retain_auto_connect_; } // Setter is deliberately omitted; use EnableAndRetainAutoConnect. void set_friendly_name(const std::string& n) { friendly_name_ = n; } const std::string& friendly_name() const { return friendly_name_; } // Sets the kNameProperty and broadcasts the change. void SetFriendlyName(const std::string& friendly_name); const std::string& guid() const { return guid_; } bool SetGuid(const std::string& guid, Error* error); bool has_ever_connected() const { return has_ever_connected_; } // Sets the has_ever_connected_ property of the service // and broadcasts the new value void SetHasEverConnected(bool has_ever_connected); int32_t priority() const { return priority_; } bool SetPriority(const int32_t& priority, Error* error); int32_t priority_within_technology() const { return priority_within_technology_; } bool SetPriorityWithinTechnology(const int32_t& priority, Error* error); size_t crypto_algorithm() const { return crypto_algorithm_; } bool key_rotation() const { return key_rotation_; } bool endpoint_auth() const { return endpoint_auth_; } void SetStrength(uint8_t strength); // uint8_t streams out as a char. Coerce to a larger type, so that // it prints as a number. uint16_t strength() const { return strength_; } virtual Technology::Identifier technology() const { return technology_; } std::string GetTechnologyString() const; #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X) virtual const EapCredentials* eap() const { return eap_.get(); } void SetEapCredentials(EapCredentials* eap); #endif // DISABLE_WIFI || DISABLE_WIRED_8021X bool save_credentials() const { return save_credentials_; } void set_save_credentials(bool save) { save_credentials_ = save; } const std::string& error() const { return error_; } void set_error(const std::string& error) { error_ = error; } const std::string& error_details() const { return error_details_; } void SetErrorDetails(const std::string& details); static const char* ConnectFailureToString(const ConnectFailure& state); static const char* ConnectStateToString(const ConnectState& state); // Compare two services. Returns true if Service |a| should be displayed // above |b|. If |compare_connectivity_state| is true, the connectivity // state of the service (service->state()) is used as the most significant // criteria for comparsion, otherwise the service state is ignored. Use // |tech_order| to rank services if more decisive criteria do not yield a // difference. |reason| is populated with the exact criteria used for the // ultimate comparison. static bool Compare(Manager* manager, ServiceRefPtr a, ServiceRefPtr b, bool compare_connectivity_state, const std::vector& tech_order, const char** reason); // These are defined in service.cc so that we don't have to include profile.h // TODO(cmasone): right now, these are here only so that we can get the // profile name as a property. Can we store just the name, and then handle // setting the profile for this service via |manager_|? const ProfileRefPtr& profile() const; // Sets the profile property of this service. Broadcasts the new value if it's // not nullptr. If the new value is nullptr, the service will either be set to // another profile afterwards or it will not be visible and not monitored // anymore. void SetProfile(const ProfileRefPtr& p); // This is called from tests and shouldn't be called otherwise. Use SetProfile // instead. void set_profile(const ProfileRefPtr& p); // Notification that occurs when a service now has profile data saved // on its behalf. Some service types like WiFi can choose to register // themselves at this point. virtual void OnProfileConfigured() {} // Notification that occurs when a single property has been changed via // the RPC adaptor. virtual void OnPropertyChanged(const std::string& property); // Notification that occurs when an EAP credential property has been // changed. Some service subclasses can choose to respond to this // event. virtual void OnEapCredentialsChanged(UpdateCredentialsReason reason) {} // Called by the manager once after a resume. virtual void OnAfterResume(); // Called by the manager once when entering dark resume. virtual void OnDarkResume(); // Called by the manager to clear remembered state of being explicitly // disconnected. virtual void ClearExplicitlyDisconnected(); #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X) EapCredentials* mutable_eap() { return eap_.get(); } #endif // DISABLE_WIFI || DISABLE_WIRED_8021X const DhcpProperties& dhcp_properties() const { return *dhcp_properties_; } PropertyStore* mutable_store() { return &store_; } const PropertyStore& store() const { return store_; } StaticIPParameters* mutable_static_ip_parameters() { return &static_ip_parameters_; } const StaticIPParameters& static_ip_parameters() const { return static_ip_parameters_; } // Retrieves |key| from |id| in |storage| to |value|. If this key does // not exist, assign |default_value| to |value|. static void LoadString(StoreInterface* storage, const std::string& id, const std::string& key, const std::string& default_value, std::string* value); // Assigns |value| to |key| in |storage| if |value| is non-empty and |save| is // true. Otherwise, removes |key| from |storage|. If |crypted| is true, the // value is encrypted. static void SaveString(StoreInterface* storage, const std::string& id, const std::string& key, const std::string& value, bool crypted, bool save); // Called via RPC to get a dict containing profile-to-entry_name mappings // of all the profile entires which contain configuration applicable to // this service. std::map GetLoadableProfileEntries(); void set_connection_id(int connection_id) { connection_id_ = connection_id; } int connection_id() const { return connection_id_; } void set_unreliable(bool unreliable) { unreliable_ = unreliable; } bool unreliable() const { return unreliable_; } protected: friend class base::RefCounted; static const char kAutoConnBusy[]; virtual ~Service(); // Returns true if a character is allowed to be in a service storage id. static bool LegalChar(char a) { return isalnum(a) || a == '_'; } // Returns true if a character is disallowed to be in a service storage id. static bool IllegalChar(char a) { return !LegalChar(a); } virtual std::string CalculateState(Error* error); std::string CalculateTechnology(Error* error); bool GetVisibleProperty(Error* error); // Returns whether this service is in a state conducive to auto-connect. // This should include any tests used for computing connectable(), // as well as other critera such as whether the device associated with // this service is busy with another connection. // // If the service is not auto-connectable, |*reason| will be set to // point to C-string explaining why the service is not auto-connectable. virtual bool IsAutoConnectable(const char** reason) const; // HelpRegisterDerived*: Expose a property over RPC, with the name |name|. // // Reads of the property will be handled by invoking |get|. // Writes to the property will be handled by invoking |set|. // Clearing the property will be handled by PropertyStore. void HelpRegisterDerivedBool( const std::string& name, bool(Service::*get)(Error* error), bool(Service::*set)(const bool& value, Error* error), void(Service::*clear)(Error* error)); void HelpRegisterDerivedInt32( const std::string& name, int32_t(Service::*get)(Error* error), bool(Service::*set)(const int32_t& value, Error* error)); void HelpRegisterDerivedString( const std::string& name, std::string(Service::*get)(Error* error), bool(Service::*set)(const std::string& value, Error* error)); void HelpRegisterConstDerivedUint16( const std::string& name, uint16_t(Service::*get)(Error* error) const); void HelpRegisterConstDerivedRpcIdentifier( const std::string& name, std::string(Service::*get)(Error*) const); void HelpRegisterConstDerivedStrings( const std::string& name, Strings(Service::*get)(Error* error) const); void HelpRegisterConstDerivedString( const std::string& name, std::string(Service::*get)(Error* error) const); // HelpRegisterObservedDerived*: Expose an property over RPC, with the // name |name|, for which property changes are automatically generated. // void HelpRegisterObservedDerivedBool( const std::string& name, bool(Service::*get)(Error* error), bool(Service::*set)(const bool& value, Error* error), void(Service::*clear)(Error* error)); ServiceAdaptorInterface* adaptor() const { return adaptor_.get(); } #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X) void UnloadEapCredentials(); #endif // DISABLE_WIFI || DISABLE_WIRED_8021X // Ignore |parameter| when performing a Configure() operation. void IgnoreParameterForConfigure(const std::string& parameter); // Update the service's string-based "Error" RPC property based on the // failure_ enum. void UpdateErrorProperty(); // RPC setter for the the "AutoConnect" property. Updates the |manager_|. // (cf. SetAutoConnect, which does not update the manager.) virtual bool SetAutoConnectFull(const bool& connect, Error* error); // RPC clear method for the "AutoConnect" property. Sets the AutoConnect // property back to its default value, and clears the retain_auto_connect_ // property to allow the AutoConnect property to be enabled automatically. void ClearAutoConnect(Error* error); // Property accessors reserved for subclasses EventDispatcher* dispatcher() const { return dispatcher_; } ControlInterface* control_interface() const { return control_interface_; } #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X) const std::string& GetEAPKeyManagement() const; virtual void SetEAPKeyManagement(const std::string& key_management); #endif // DISABLE_WIFI || DISABLE_WIRED_8021X Manager* manager() const { return manager_; } Metrics* metrics() const { return metrics_; } // Save the serivce's auto_connect value, without affecting its auto_connect // property itself. (cf. EnableAndRetainAutoConnect) void RetainAutoConnect(); // Inform base class of the security properties for the service. // // NB: When adding a call to this function from a subclass, please check // that the semantics of SecurityLevel() are appropriate for the subclass. void SetSecurity(CryptoAlgorithm crypt, bool rotation, bool endpoint_auth); // Return whether this service is suspected or confirmed to be // provided by a mobile device, which is likely to be using a // metered backhaul for internet connectivity. virtual std::string GetTethering(Error* error) const; // Emit property change notifications for all observed properties. void NotifyPropertyChanges(); private: friend class ActivePassiveOutOfCreditsDetectorTest; friend class EthernetEapServiceTest; friend class EthernetServiceTest; friend class MetricsTest; friend class ManagerTest; friend class ServiceAdaptorInterface; friend class ServiceTest; friend class SubscriptionStateOutOfCreditsDetectorTest; friend class VPNProviderTest; friend class VPNServiceTest; friend class WiFiServiceTest; friend class WiMaxProviderTest; friend class WiMaxServiceTest; friend void TestCommonPropertyChanges(ServiceRefPtr, ServiceMockAdaptor*); friend void TestCustomSetterNoopChange(ServiceRefPtr, MockManager*); friend void TestNamePropertyChange(ServiceRefPtr, ServiceMockAdaptor*); FRIEND_TEST(AllMockServiceTest, AutoConnectWithFailures); FRIEND_TEST(CellularCapabilityGSMTest, SetStorageIdentifier); FRIEND_TEST(CellularServiceTest, IsAutoConnectable); FRIEND_TEST(DeviceTest, AcquireIPConfigWithoutSelectedService); FRIEND_TEST(DeviceTest, AcquireIPConfigWithSelectedService); FRIEND_TEST(DeviceTest, IPConfigUpdatedFailureWithStatic); FRIEND_TEST(ManagerTest, ConnectToBestServices); FRIEND_TEST(ServiceTest, AutoConnectLogging); FRIEND_TEST(ServiceTest, CalculateState); FRIEND_TEST(ServiceTest, CalculateTechnology); FRIEND_TEST(ServiceTest, Certification); FRIEND_TEST(ServiceTest, Compare); FRIEND_TEST(ServiceTest, ConfigureEapStringProperty); FRIEND_TEST(ServiceTest, ConfigureIgnoredProperty); FRIEND_TEST(ServiceTest, Constructor); FRIEND_TEST(ServiceTest, CustomSetterNoopChange); FRIEND_TEST(ServiceTest, GetIPConfigRpcIdentifier); FRIEND_TEST(ServiceTest, GetProperties); FRIEND_TEST(ServiceTest, GetTethering); FRIEND_TEST(ServiceTest, IsAutoConnectable); FRIEND_TEST(ServiceTest, IsDependentOn); FRIEND_TEST(ServiceTest, Load); FRIEND_TEST(ServiceTest, LoadAutoConnect); FRIEND_TEST(ServiceTest, PortalDetectionFailure); FRIEND_TEST(ServiceTest, RecheckPortal); FRIEND_TEST(ServiceTest, Save); FRIEND_TEST(ServiceTest, SaveString); FRIEND_TEST(ServiceTest, SaveStringCrypted); FRIEND_TEST(ServiceTest, SaveStringDontSave); FRIEND_TEST(ServiceTest, SaveStringEmpty); FRIEND_TEST(ServiceTest, SecurityLevel); FRIEND_TEST(ServiceTest, SetCheckPortal); FRIEND_TEST(ServiceTest, SetConnectableFull); FRIEND_TEST(ServiceTest, SetFriendlyName); FRIEND_TEST(ServiceTest, SetProperty); FRIEND_TEST(ServiceTest, State); FRIEND_TEST(ServiceTest, StateResetAfterFailure); FRIEND_TEST(ServiceTest, UniqueAttributes); FRIEND_TEST(ServiceTest, Unload); FRIEND_TEST(ServiceTest, UserInitiatedConnectionResult); FRIEND_TEST(WiFiServiceTest, SetPassphraseResetHasEverConnected); FRIEND_TEST(WiFiServiceTest, SuspectedCredentialFailure); FRIEND_TEST(WiFiServiceTest, SetPassphraseRemovesCachedCredentials); FRIEND_TEST(WiFiServiceTest, LoadPassphraseClearCredentials); FRIEND_TEST(WiFiTimerTest, ReconnectTimer); FRIEND_TEST(WiFiMainTest, EAPEvent); // For eap_. FRIEND_TEST(WiMaxServiceTest, ChangeCredResetHasEverConnected); FRIEND_TEST(EthernetEapServiceTest, OnEapCredentialsChanged); static const char kAutoConnConnected[]; static const char kAutoConnConnecting[]; static const char kAutoConnExplicitDisconnect[]; static const char kAutoConnNotConnectable[]; static const char kAutoConnOffline[]; static const char kAutoConnTechnologyNotConnectable[]; static const char kAutoConnThrottled[]; #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X) static const size_t kEAPMaxCertificationElements; #endif // DISABLE_WIFI || DISABLE_WIRED_8021X static const char kServiceSortAutoConnect[]; static const char kServiceSortConnectable[]; static const char kServiceSortHasEverConnected[]; static const char kServiceSortIsConnected[]; static const char kServiceSortDependency[]; static const char kServiceSortIsConnecting[]; static const char kServiceSortIsFailed[]; static const char kServiceSortIsOnline[]; static const char kServiceSortIsPortalled[]; static const char kServiceSortPriority[]; static const char kServiceSortPriorityWithinTechnology[]; static const char kServiceSortSecurity[]; static const char kServiceSortProfileOrder[]; static const char kServiceSortEtc[]; static const char kServiceSortSerialNumber[]; static const char kServiceSortTechnology[]; static const uint64_t kMaxAutoConnectCooldownTimeMilliseconds; static const uint64_t kMinAutoConnectCooldownTimeMilliseconds; static const uint64_t kAutoConnectCooldownBackoffFactor; static const int kDisconnectsMonitorSeconds; static const int kMisconnectsMonitorSeconds; static const int kReportDisconnectsThreshold; static const int kReportMisconnectsThreshold; static const int kMaxDisconnectEventHistory; static const int kMaxMisconnectEventHistory; bool GetAutoConnect(Error* error); std::string GetCheckPortal(Error* error); bool SetCheckPortal(const std::string& check_portal, Error* error); std::string GetGuid(Error* error); virtual std::string GetDeviceRpcId(Error* error) const = 0; std::string GetIPConfigRpcIdentifier(Error* error) const; std::string GetNameProperty(Error* error); // The base implementation asserts that |name| matches the current Name // property value. virtual bool SetNameProperty(const std::string& name, Error* error); int32_t GetPriority(Error* error); int32_t GetPriorityWithinTechnology(Error* error); std::string GetProfileRpcId(Error* error); bool SetProfileRpcId(const std::string& profile, Error* error); // Returns TCP port of service's HTTP proxy in host order. uint16_t GetHTTPProxyPort(Error* error) const; std::string GetProxyConfig(Error* error); bool SetProxyConfig(const std::string& proxy_config, Error* error); Strings GetDisconnectsProperty(Error* error) const; Strings GetMisconnectsProperty(Error* error) const; void ReEnableAutoConnectTask(); // Disables autoconnect and posts a task to re-enable it after a cooldown. // Note that autoconnect could be disabled for other reasons as well. void ThrottleFutureAutoConnects(); // Saves settings to profile, if we have one. Unlike // SaveServiceToProfile, SaveToProfile never assigns this service // into a profile. void SaveToProfile(); // Qualify the conditions under which the most recent disconnect occurred. // Make note ot the fact that there was a problem connecting / staying // connected if the disconnection did not occur as a clear result of user // action. void NoteDisconnectEvent(); // Utility function that returns true if a is different from b. When they // are, "decision" is populated with the boolean value of "a > b". static bool DecideBetween(int a, int b, bool* decision); // Report the result of user-initiated connection attempt to UMA stats. // Currently only report stats for wifi service. void ReportUserInitiatedConnectionResult(ConnectState state); // Linearize security parameters (crypto algorithm, key rotation, endpoint // authentication) for comparison. uint16_t SecurityLevel(); // WeakPtrFactory comes first, so that other fields can use it. base::WeakPtrFactory weak_ptr_factory_; ConnectState state_; ConnectState previous_state_; ConnectFailure failure_; bool auto_connect_; // Denotes whether the value of auto_connect_ property value should be // retained, i.e. only be allowed to change via explicit property changes // from the UI. bool retain_auto_connect_; std::string check_portal_; bool connectable_; std::string error_; std::string error_details_; std::string previous_error_; int32_t previous_error_serial_number_; bool explicitly_disconnected_; bool is_in_user_connect_; int32_t priority_; int32_t priority_within_technology_; uint8_t crypto_algorithm_; bool key_rotation_; bool endpoint_auth_; std::string portal_detection_failure_phase_; std::string portal_detection_failure_status_; uint8_t strength_; std::string proxy_config_; std::string ui_data_; std::string guid_; bool save_credentials_; #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X) std::unique_ptr eap_; #endif // DISABLE_WIFI || DISABLE_WIRED_8021X std::unique_ptr dhcp_properties_; Technology::Identifier technology_; // The time of the most recent failure. Value is 0 if the service is // not currently failed. time_t failed_time_; // Whether or not this service has ever reached kStateConnected. bool has_ever_connected_; EventHistory disconnects_; // Connection drops. EventHistory misconnects_; // Failures to connect. base::CancelableClosure reenable_auto_connect_task_; uint64_t auto_connect_cooldown_milliseconds_; ProfileRefPtr profile_; PropertyStore store_; std::set parameters_ignored_for_configure_; EventDispatcher* dispatcher_; ControlInterface* control_interface_; unsigned int serial_number_; std::string unique_name_; // MUST be unique amongst service instances // Service's friendly name is presented through the UI. By default it's the // same as |unique_name_| but normally Service subclasses override // it. WARNING: Don't log the friendly name at the default logging level due // to PII concerns. std::string friendly_name_; // List of subject names reported by remote entity during TLS setup. std::vector remote_certification_; std::unique_ptr adaptor_; std::unique_ptr property_change_notifier_; std::unique_ptr http_proxy_; ConnectionRefPtr connection_; StaticIPParameters static_ip_parameters_; Metrics* metrics_; Manager* manager_; std::unique_ptr sockets_; Time* time_; DiagnosticsReporter* diagnostics_reporter_; // The |serial_number_| for the next Service. static unsigned int next_serial_number_; // Network identifier indicating the network (gateway) the service is // connected to. int connection_id_; // When set to true, this service will automatically fallback to Google's DNS // servers if the portal detection failed due to DNS failure and Google's DNS // servers are working. bool is_dns_auto_fallback_allowed_; // When set to true, will not start link monitor when the connection to this // service is established. bool link_monitor_disabled_; // When set to true, the credentials for this service will be considered // valid, and will not require an initial connection to rank it highly for // auto-connect. bool managed_credentials_; // Flag indicating if this service is unreliable (experiencing multiple // link monitor failures in a short period of time). bool unreliable_; DISALLOW_COPY_AND_ASSIGN(Service); }; } // namespace shill #endif // SHILL_SERVICE_H_