• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (C) 2013 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_SERVICE_H_
18 #define SHILL_SERVICE_H_
19 
20 #include <time.h>
21 
22 #include <map>
23 #include <memory>
24 #include <set>
25 #include <string>
26 #include <vector>
27 
28 #include <base/cancelable_callback.h>
29 #include <base/memory/ref_counted.h>
30 #include <base/memory/weak_ptr.h>
31 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
32 
33 #include "shill/accessor_interface.h"
34 #include "shill/adaptor_interfaces.h"
35 #include "shill/callbacks.h"
36 #include "shill/dhcp_properties.h"
37 #include "shill/net/event_history.h"
38 #include "shill/net/shill_time.h"
39 #include "shill/property_store.h"
40 #include "shill/refptr_types.h"
41 #include "shill/static_ip_parameters.h"
42 #include "shill/technology.h"
43 
44 namespace chromeos_metrics {
45 class Timer;
46 }
47 
48 namespace shill {
49 
50 class ControlInterface;
51 class DhcpProperties;
52 class DiagnosticsReporter;
53 class Endpoint;
54 class Error;
55 class EventDispatcher;
56 class HTTPProxy;
57 class KeyValueStore;
58 class Manager;
59 class Metrics;
60 class MockManager;
61 class ServiceAdaptorInterface;
62 class ServiceMockAdaptor;
63 class ServicePropertyChangeNotifier;
64 class Sockets;
65 class StoreInterface;
66 
67 #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X)
68 class EapCredentials;
69 #endif  // DISABLE_WIFI || DISABLE_WIRED_8021X
70 
71 // A Service is a uniquely named entity, which the system can
72 // connect in order to begin sending and receiving network traffic.
73 // All Services are bound to an Entry, which represents the persistable
74 // state of the Service.  If the Entry is populated at the time of Service
75 // creation, that information is used to prime the Service.  If not, the Entry
76 // becomes populated over time.
77 class Service : public base::RefCounted<Service> {
78  public:
79   static const char kCheckPortalAuto[];
80   static const char kCheckPortalFalse[];
81   static const char kCheckPortalTrue[];
82 
83   static const char kErrorDetailsNone[];
84 
85   // TODO(pstew): Storage constants shouldn't need to be public
86   // crbug.com/208736
87   static const char kStorageAutoConnect[];
88   static const char kStorageCheckPortal[];
89   static const char kStorageDNSAutoFallback[];
90   static const char kStorageError[];
91   static const char kStorageFavorite[];
92   static const char kStorageGUID[];
93   static const char kStorageHasEverConnected[];
94   static const char kStorageName[];
95   static const char kStoragePriority[];
96   static const char kStoragePriorityWithinTechnology[];
97   static const char kStorageProxyConfig[];
98   static const char kStorageSaveCredentials[];
99   static const char kStorageType[];
100   static const char kStorageUIData[];
101   static const char kStorageConnectionId[];
102   static const char kStorageLinkMonitorDisabled[];
103   static const char kStorageManagedCredentials[];
104 
105   static const uint8_t kStrengthMax;
106   static const uint8_t kStrengthMin;
107 
108   enum ConnectFailure {
109     kFailureUnknown,
110     kFailureAAA,
111     kFailureActivation,
112     kFailureBadPassphrase,
113     kFailureBadWEPKey,
114     kFailureConnect,
115     kFailureDHCP,
116     kFailureDNSLookup,
117     kFailureEAPAuthentication,
118     kFailureEAPLocalTLS,
119     kFailureEAPRemoteTLS,
120     kFailureHTTPGet,
121     kFailureIPSecCertAuth,
122     kFailureIPSecPSKAuth,
123     kFailureInternal,
124     kFailureNeedEVDO,
125     kFailureNeedHomeNetwork,
126     kFailureOTASP,
127     kFailureOutOfRange,
128     kFailurePPPAuth,
129     kFailurePinMissing,
130     kFailureMax
131   };
132   enum ConnectState {
133     kStateUnknown,
134     kStateIdle,
135     kStateAssociating,
136     kStateConfiguring,
137     kStateConnected,
138     kStatePortal,
139     kStateFailure,
140     kStateOnline
141   };
142   enum CryptoAlgorithm {
143     kCryptoNone,
144     kCryptoRc4,
145     kCryptoAes
146   };
147 
148   enum UpdateCredentialsReason{
149     kReasonCredentialsLoaded,
150     kReasonPropertyUpdate
151   };
152 
153   static const int kPriorityNone;
154 
155   // A constructor for the Service object
156   Service(ControlInterface* control_interface,
157           EventDispatcher* dispatcher,
158           Metrics* metrics,
159           Manager* manager,
160           Technology::Identifier technology);
161 
162   // AutoConnect MAY choose to ignore the connection request in some
163   // cases. For example, if the corresponding Device only supports one
164   // concurrent connection, and another Service is already connected
165   // or connecting.
166   //
167   // AutoConnect MAY issue RPCs immediately. So AutoConnect MUST NOT
168   // be called from a D-Bus signal handler context.
169   virtual void AutoConnect();
170   // Queue up a connection attempt. Derived classes SHOULD call the
171   // base class implementation before beginning a connect. The base
172   // class will log the connection attempt, and update base-class
173   // state.
174   virtual void Connect(Error* error, const char* reason);
175   // Disconnect this service.  Override this method to add your service specific
176   // disconnect logic, but call the super class's Disconnect() first.
177   virtual void Disconnect(Error* error, const char* reason);
178   // Disconnects this service via Disconnect().  Marks the service as having
179   // failed with |failure|.  Do not override this method.
180   virtual void DisconnectWithFailure(ConnectFailure failure,
181                                      Error* error,
182                                      const char* reason);
183   // Disconnects this service via Disconnect(). The service will not be eligible
184   // for auto-connect until a subsequent call to Connect, or Load.  Do not
185   // override this method.
186   virtual void UserInitiatedDisconnect(Error* error);
187   // Connect to this service via Connect(). This function indicates that the
188   // connection attempt is user-initiated.
189   virtual void UserInitiatedConnect(Error* error);
190 
191   // The default implementation returns the error kInvalidArguments.
192   virtual void ActivateCellularModem(const std::string& carrier,
193                                      Error* error,
194                                      const ResultCallback& callback);
195   // The default implementation returns the error kNotSupported.
196   virtual void CompleteCellularActivation(Error* error);
197 
198   virtual bool IsActive(Error* error);
199 
200   // Returns whether services of this type should be auto-connect by default.
IsAutoConnectByDefault()201   virtual bool IsAutoConnectByDefault() const { return false; }
202 
state()203   virtual ConnectState state() const { return state_; }
204   // Updates the state of the Service and alerts the manager.  Also
205   // clears |failure_| if the new state isn't a failure.
206   virtual void SetState(ConnectState state);
207   std::string GetStateString() const;
208 
209   // Set portal detection failure phase and status (reason). This function
210   // is called when portal detection failed for the Service.
211   virtual void SetPortalDetectionFailure(const std::string& phase,
212                                          const std::string& status);
213 
214   // State utility functions
215   static bool IsConnectedState(ConnectState state);
216   static bool IsConnectingState(ConnectState state);
217 
218   virtual bool IsConnected() const;
219   virtual bool IsConnecting() const;
IsFailed()220   virtual bool IsFailed() const {
221     // We sometimes lie about the failure state, to keep Chrome happy
222     // (see comment in WiFi::HandleDisconnect). Hence, we check both
223     // state and |failed_time_|.
224     return state() == kStateFailure || failed_time_ > 0;
225   }
226 
IsInFailState()227   virtual bool IsInFailState() const {
228     return state() == kStateFailure;
229   }
230 
IsOnline()231   virtual bool IsOnline() const {
232     return state() == kStateOnline;
233   }
234 
235   // Returns true if the connection for |this| depends on service |b|.
236   virtual bool IsDependentOn(const ServiceRefPtr& b) const;
237 
IsPortalled()238   virtual bool IsPortalled() const {
239     return state() == kStatePortal;
240   }
241 
242   // Return true if service is allowed to automatically switch to fallback
243   // DNS server.
is_dns_auto_fallback_allowed()244   virtual bool is_dns_auto_fallback_allowed() const {
245     return is_dns_auto_fallback_allowed_;
246   }
247 
link_monitor_disabled()248   virtual bool link_monitor_disabled() const { return link_monitor_disabled_; }
249 
failure()250   virtual ConnectFailure failure() const { return failure_; }
251   // Sets the |previous_error_| property based on the current |failure_|, and
252   // sets a serial number for this failure.
253   virtual void SaveFailure();
254   // Records the failure mode and time. Sets the Service state to "Failure".
255   virtual void SetFailure(ConnectFailure failure);
256   // Records the failure mode and time. Sets the Service state to "Idle".
257   // Avoids showing a failure mole in the UI.
258   virtual void SetFailureSilent(ConnectFailure failure);
259 
260   // Returns a string that is guaranteed to uniquely identify this Service
261   // instance.
unique_name()262   const std::string& unique_name() const { return unique_name_; }
263 
264   virtual std::string GetRpcIdentifier() const;
265 
266   // Returns the unique persistent storage identifier for the service.
267   virtual std::string GetStorageIdentifier() const = 0;
268 
269   // Returns the identifier within |storage| from which configuration for
270   // this service can be loaded.  Returns an empty string if no entry in
271   // |storage| can be used.
272   virtual std::string GetLoadableStorageIdentifier(
273       const StoreInterface& storage) const;
274 
275   // Returns whether the service configuration can be loaded from |storage|.
276   virtual bool IsLoadableFrom(const StoreInterface& storage) const;
277 
278   // Returns true if the service uses 802.1x for key management.
Is8021x()279   virtual bool Is8021x() const { return false; }
280 
281   // Loads the service from persistent |storage|. Returns true on success.
282   virtual bool Load(StoreInterface* storage);
283 
284   // Indicate to service that it is no longer persisted to storage.  It
285   // should purge any stored profile state (e.g., credentials).  Returns
286   // true to indicate that this service should also be unregistered from
287   // the manager, false otherwise.
288   virtual bool Unload();
289 
290   // Attempt to remove the service. On failure, no changes in state will occur.
291   virtual void Remove(Error* error);
292 
293   // Saves the service to persistent |storage|. Returns true on success.
294   virtual bool Save(StoreInterface* storage);
295 
296   // Applies all the properties in |args| to this service object's mutable
297   // store, except for those in parameters_ignored_for_configure_.
298   // Returns an error in |error| if one or more parameter set attempts
299   // fails, but will only return the first error.
300   virtual void Configure(const KeyValueStore& args, Error* error);
301 
302   // Iterate over all the properties in |args| and test for an identical
303   // value in this service object's store.  Returns false if one or more
304   // keys in |args| do not exist or have different values, true otherwise.
305   virtual bool DoPropertiesMatch(const KeyValueStore& args) const;
306 
307   // Returns whether portal detection is explicitly disabled on this service
308   // via a property set on it.
309   virtual bool IsPortalDetectionDisabled() const;
310 
311   // Returns whether portal detection is set to follow the default setting
312   // of this service's technology via a property set on it.
313   virtual bool IsPortalDetectionAuto() const;
314 
315   // Returns true if the service is persisted to a non-ephemeral profile.
316   virtual bool IsRemembered() const;
317 
318   // Returns true if the service RPC identifier should be part of the
319   // manager's advertised services list, false otherwise.
IsVisible()320   virtual bool IsVisible() const { return true; }
321 
322   // Returns true if there is a proxy configuration set on this service.
HasProxyConfig()323   virtual bool HasProxyConfig() const { return !proxy_config_.empty(); }
324 
325   // Returns whether this service has had recent connection issues.
326   virtual bool HasRecentConnectionIssues();
327 
328   // If the AutoConnect property has not already been marked as saved, set
329   // its value to true and mark it saved.
330   virtual void EnableAndRetainAutoConnect();
331 
332   // Set the connection for this service.  If the connection is non-NULL, create
333   // an HTTP Proxy that will utilize this service's connection to serve
334   // requests.
335   virtual void SetConnection(const ConnectionRefPtr& connection);
connection()336   virtual const ConnectionRefPtr& connection() const { return connection_; }
337 
338   // Emit service's IP config change event to chrome.
339   virtual void NotifyIPConfigChanges();
340 
341 #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X)
342   // Examines the EAP credentials for the service and returns true if a
343   // connection attempt can be made.
344   virtual bool Is8021xConnectable() const;
345 
346   // Add an EAP certification id |name| at position |depth| in the stack.
347   // Returns true if entry was added, false otherwise.
348   virtual bool AddEAPCertification(const std::string& name, size_t depth);
349   // Clear all EAP certification elements.
350   virtual void ClearEAPCertification();
351 #endif  // DISABLE_WIFI || DISABLE_WIRED_8021X
352 
353   // Returns true if this service contains a IP address in its static IP
354   // parameters, false otherwise.
355   virtual bool HasStaticIPAddress() const;
356 
357   // Returns true if this service contains nameservers in its static IP
358   // parameters, false otherwise.
359   virtual bool HasStaticNameServers() const;
360 
361   // The inherited class that needs to send metrics after the service has
362   // transitioned to the ready state should override this method.
363   // |time_resume_to_ready_milliseconds| holds the elapsed time from when
364   // the system was resumed until when the service transitioned to the
365   // connected state.  This value is non-zero for the first service transition
366   // to the connected state after a resume.
SendPostReadyStateMetrics(int64_t)367   virtual void SendPostReadyStateMetrics(
368       int64_t /*time_resume_to_ready_milliseconds*/) const {}
369 
auto_connect()370   bool auto_connect() const { return auto_connect_; }
371   void SetAutoConnect(bool connect);
372 
connectable()373   bool connectable() const { return connectable_; }
374   // Sets the connectable property of the service, and broadcast the
375   // new value. Does not update the manager.
376   // TODO(petkov): Remove this method in favor of SetConnectableFull.
377   void SetConnectable(bool connectable);
378   // Sets the connectable property of the service, broadcasts the new
379   // value, and alerts the manager if necessary.
380   void SetConnectableFull(bool connectable);
381 
explicitly_disconnected()382   virtual bool explicitly_disconnected() const {
383     return explicitly_disconnected_;
384   }
385 
386   // Return RPC identifier for device that's internal to this service, which is
387   // not registered with the manager.
GetInnerDeviceRpcIdentifier()388   virtual std::string GetInnerDeviceRpcIdentifier() const { return ""; }
389 
retain_auto_connect()390   bool retain_auto_connect() const { return retain_auto_connect_; }
391   // Setter is deliberately omitted; use EnableAndRetainAutoConnect.
392 
set_friendly_name(const std::string & n)393   void set_friendly_name(const std::string& n) { friendly_name_ = n; }
friendly_name()394   const std::string& friendly_name() const { return friendly_name_; }
395   // Sets the kNameProperty and broadcasts the change.
396   void SetFriendlyName(const std::string& friendly_name);
397 
guid()398   const std::string& guid() const { return guid_; }
399   bool SetGuid(const std::string& guid, Error* error);
400 
has_ever_connected()401   bool has_ever_connected() const { return has_ever_connected_; }
402   // Sets the has_ever_connected_ property of the service
403   // and broadcasts the new value
404   void SetHasEverConnected(bool has_ever_connected);
405 
priority()406   int32_t priority() const { return priority_; }
407   bool SetPriority(const int32_t& priority, Error* error);
priority_within_technology()408   int32_t priority_within_technology() const {
409       return priority_within_technology_;
410   }
411   bool SetPriorityWithinTechnology(const int32_t& priority, Error* error);
412 
crypto_algorithm()413   size_t crypto_algorithm() const { return crypto_algorithm_; }
key_rotation()414   bool key_rotation() const { return key_rotation_; }
endpoint_auth()415   bool endpoint_auth() const { return endpoint_auth_; }
416 
417   void SetStrength(uint8_t strength);
418 
419   // uint8_t streams out as a char. Coerce to a larger type, so that
420   // it prints as a number.
strength()421   uint16_t strength() const { return strength_; }
422 
technology()423   virtual Technology::Identifier technology() const { return technology_; }
424   std::string GetTechnologyString() const;
425 
426 #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X)
eap()427   virtual const EapCredentials* eap() const { return eap_.get(); }
428   void SetEapCredentials(EapCredentials* eap);
429 #endif  // DISABLE_WIFI || DISABLE_WIRED_8021X
430 
save_credentials()431   bool save_credentials() const { return save_credentials_; }
set_save_credentials(bool save)432   void set_save_credentials(bool save) { save_credentials_ = save; }
433 
error()434   const std::string& error() const { return error_; }
set_error(const std::string & error)435   void set_error(const std::string& error) { error_ = error; }
436 
error_details()437   const std::string& error_details() const { return error_details_; }
438   void SetErrorDetails(const std::string& details);
439 
440   static const char* ConnectFailureToString(const ConnectFailure& state);
441   static const char* ConnectStateToString(const ConnectState& state);
442 
443   // Compare two services.  Returns true if Service |a| should be displayed
444   // above |b|.  If |compare_connectivity_state| is true, the connectivity
445   // state of the service (service->state()) is used as the most significant
446   // criteria for comparsion, otherwise the service state is ignored.  Use
447   // |tech_order| to rank services if more decisive criteria do not yield a
448   // difference.  |reason| is populated with the exact criteria used for the
449   // ultimate comparison.
450   static bool Compare(Manager* manager,
451                       ServiceRefPtr a,
452                       ServiceRefPtr b,
453                       bool compare_connectivity_state,
454                       const std::vector<Technology::Identifier>& tech_order,
455                       const char** reason);
456 
457   // These are defined in service.cc so that we don't have to include profile.h
458   // TODO(cmasone): right now, these are here only so that we can get the
459   // profile name as a property.  Can we store just the name, and then handle
460   // setting the profile for this service via |manager_|?
461   const ProfileRefPtr& profile() const;
462 
463   // Sets the profile property of this service. Broadcasts the new value if it's
464   // not nullptr. If the new value is nullptr, the service will either be set to
465   // another profile afterwards or it will not be visible and not monitored
466   // anymore.
467   void SetProfile(const ProfileRefPtr& p);
468 
469   // This is called from tests and shouldn't be called otherwise. Use SetProfile
470   // instead.
471   void set_profile(const ProfileRefPtr& p);
472 
473   // Notification that occurs when a service now has profile data saved
474   // on its behalf.  Some service types like WiFi can choose to register
475   // themselves at this point.
OnProfileConfigured()476   virtual void OnProfileConfigured() {}
477 
478   // Notification that occurs when a single property has been changed via
479   // the RPC adaptor.
480   virtual void OnPropertyChanged(const std::string& property);
481 
482   // Notification that occurs when an EAP credential property has been
483   // changed.  Some service subclasses can choose to respond to this
484   // event.
OnEapCredentialsChanged(UpdateCredentialsReason reason)485   virtual void OnEapCredentialsChanged(UpdateCredentialsReason reason) {}
486 
487   // Called by the manager once after a resume.
488   virtual void OnAfterResume();
489 
490   // Called by the manager once when entering dark resume.
491   virtual void OnDarkResume();
492 
493   // Called by the manager to clear remembered state of being explicitly
494   // disconnected.
495   virtual void ClearExplicitlyDisconnected();
496 
497 #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X)
mutable_eap()498   EapCredentials* mutable_eap() { return eap_.get(); }
499 #endif  // DISABLE_WIFI || DISABLE_WIRED_8021X
500 
dhcp_properties()501   const DhcpProperties& dhcp_properties() const {
502     return *dhcp_properties_;
503   }
504 
mutable_store()505   PropertyStore* mutable_store() { return &store_; }
store()506   const PropertyStore& store() const { return store_; }
mutable_static_ip_parameters()507   StaticIPParameters* mutable_static_ip_parameters() {
508     return &static_ip_parameters_;
509   }
static_ip_parameters()510   const StaticIPParameters& static_ip_parameters() const {
511     return static_ip_parameters_;
512   }
513 
514   // Retrieves |key| from |id| in |storage| to |value|.  If this key does
515   // not exist, assign |default_value| to |value|.
516   static void LoadString(StoreInterface* storage,
517                          const std::string& id,
518                          const std::string& key,
519                          const std::string& default_value,
520                          std::string* value);
521 
522   // Assigns |value| to |key| in |storage| if |value| is non-empty and |save| is
523   // true. Otherwise, removes |key| from |storage|. If |crypted| is true, the
524   // value is encrypted.
525   static void SaveString(StoreInterface* storage,
526                          const std::string& id,
527                          const std::string& key,
528                          const std::string& value,
529                          bool crypted,
530                          bool save);
531 
532   // Called via RPC to get a dict containing profile-to-entry_name mappings
533   // of all the profile entires which contain configuration applicable to
534   // this service.
535   std::map<std::string, std::string> GetLoadableProfileEntries();
536 
set_connection_id(int connection_id)537   void set_connection_id(int connection_id) { connection_id_ = connection_id; }
connection_id()538   int connection_id() const { return connection_id_; }
539 
set_unreliable(bool unreliable)540   void set_unreliable(bool unreliable) { unreliable_ = unreliable; }
unreliable()541   bool unreliable() const { return unreliable_; }
542 
543  protected:
544   friend class base::RefCounted<Service>;
545 
546   static const char kAutoConnBusy[];
547 
548   virtual ~Service();
549 
550   // Returns true if a character is allowed to be in a service storage id.
LegalChar(char a)551   static bool LegalChar(char a) { return isalnum(a) || a == '_'; }
552 
553   // Returns true if a character is disallowed to be in a service storage id.
IllegalChar(char a)554   static bool IllegalChar(char a) { return !LegalChar(a); }
555 
556   virtual std::string CalculateState(Error* error);
557   std::string CalculateTechnology(Error* error);
558 
559   bool GetVisibleProperty(Error* error);
560 
561   // Returns whether this service is in a state conducive to auto-connect.
562   // This should include any tests used for computing connectable(),
563   // as well as other critera such as whether the device associated with
564   // this service is busy with another connection.
565   //
566   // If the service is not auto-connectable, |*reason| will be set to
567   // point to C-string explaining why the service is not auto-connectable.
568   virtual bool IsAutoConnectable(const char** reason) const;
569 
570   // HelpRegisterDerived*: Expose a property over RPC, with the name |name|.
571   //
572   // Reads of the property will be handled by invoking |get|.
573   // Writes to the property will be handled by invoking |set|.
574   // Clearing the property will be handled by PropertyStore.
575   void HelpRegisterDerivedBool(
576       const std::string& name,
577       bool(Service::*get)(Error* error),
578       bool(Service::*set)(const bool& value, Error* error),
579       void(Service::*clear)(Error* error));
580   void HelpRegisterDerivedInt32(
581       const std::string& name,
582       int32_t(Service::*get)(Error* error),
583       bool(Service::*set)(const int32_t& value, Error* error));
584   void HelpRegisterDerivedString(
585       const std::string& name,
586       std::string(Service::*get)(Error* error),
587       bool(Service::*set)(const std::string& value, Error* error));
588   void HelpRegisterConstDerivedUint16(
589       const std::string& name,
590       uint16_t(Service::*get)(Error* error) const);
591   void HelpRegisterConstDerivedRpcIdentifier(
592       const std::string& name,
593       std::string(Service::*get)(Error*) const);
594   void HelpRegisterConstDerivedStrings(
595       const std::string& name, Strings(Service::*get)(Error* error) const);
596   void HelpRegisterConstDerivedString(
597       const std::string& name, std::string(Service::*get)(Error* error) const);
598 
599   // HelpRegisterObservedDerived*: Expose an property over RPC, with the
600   // name |name|, for which property changes are automatically generated.
601   //
602   void HelpRegisterObservedDerivedBool(
603       const std::string& name,
604       bool(Service::*get)(Error* error),
605       bool(Service::*set)(const bool& value, Error* error),
606       void(Service::*clear)(Error* error));
adaptor()607   ServiceAdaptorInterface* adaptor() const { return adaptor_.get(); }
608 
609 #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X)
610   void UnloadEapCredentials();
611 #endif  // DISABLE_WIFI || DISABLE_WIRED_8021X
612 
613   // Ignore |parameter| when performing a Configure() operation.
614   void IgnoreParameterForConfigure(const std::string& parameter);
615 
616   // Update the service's string-based "Error" RPC property based on the
617   // failure_ enum.
618   void UpdateErrorProperty();
619 
620   // RPC setter for the the "AutoConnect" property. Updates the |manager_|.
621   // (cf. SetAutoConnect, which does not update the manager.)
622   virtual bool SetAutoConnectFull(const bool& connect, Error* error);
623 
624   // RPC clear method for the "AutoConnect" property.  Sets the AutoConnect
625   // property back to its default value, and clears the retain_auto_connect_
626   // property to allow the AutoConnect property to be enabled automatically.
627   void ClearAutoConnect(Error* error);
628 
629   // Property accessors reserved for subclasses
dispatcher()630   EventDispatcher* dispatcher() const { return dispatcher_; }
control_interface()631   ControlInterface* control_interface() const { return control_interface_; }
632 #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X)
633   const std::string& GetEAPKeyManagement() const;
634   virtual void SetEAPKeyManagement(const std::string& key_management);
635 #endif  // DISABLE_WIFI || DISABLE_WIRED_8021X
636 
manager()637   Manager* manager() const { return manager_; }
metrics()638   Metrics* metrics() const { return metrics_; }
639 
640   // Save the serivce's auto_connect value, without affecting its auto_connect
641   // property itself. (cf. EnableAndRetainAutoConnect)
642   void RetainAutoConnect();
643 
644   // Inform base class of the security properties for the service.
645   //
646   // NB: When adding a call to this function from a subclass, please check
647   // that the semantics of SecurityLevel() are appropriate for the subclass.
648   void SetSecurity(CryptoAlgorithm crypt, bool rotation, bool endpoint_auth);
649 
650   // Return whether this service is suspected or confirmed to be
651   // provided by a mobile device, which is likely to be using a
652   // metered backhaul for internet connectivity.
653   virtual std::string GetTethering(Error* error) const;
654 
655   // Emit property change notifications for all observed properties.
656   void NotifyPropertyChanges();
657 
658  private:
659   friend class ActivePassiveOutOfCreditsDetectorTest;
660   friend class EthernetEapServiceTest;
661   friend class EthernetServiceTest;
662   friend class MetricsTest;
663   friend class ManagerTest;
664   friend class ServiceAdaptorInterface;
665   friend class ServiceTest;
666   friend class SubscriptionStateOutOfCreditsDetectorTest;
667   friend class VPNProviderTest;
668   friend class VPNServiceTest;
669   friend class WiFiServiceTest;
670   friend class WiMaxProviderTest;
671   friend class WiMaxServiceTest;
672   friend void TestCommonPropertyChanges(ServiceRefPtr, ServiceMockAdaptor*);
673   friend void TestCustomSetterNoopChange(ServiceRefPtr, MockManager*);
674   friend void TestNamePropertyChange(ServiceRefPtr, ServiceMockAdaptor*);
675   FRIEND_TEST(AllMockServiceTest, AutoConnectWithFailures);
676   FRIEND_TEST(CellularCapabilityGSMTest, SetStorageIdentifier);
677   FRIEND_TEST(CellularServiceTest, IsAutoConnectable);
678   FRIEND_TEST(DeviceTest, AcquireIPConfigWithoutSelectedService);
679   FRIEND_TEST(DeviceTest, AcquireIPConfigWithSelectedService);
680   FRIEND_TEST(DeviceTest, IPConfigUpdatedFailureWithStatic);
681   FRIEND_TEST(ManagerTest, ConnectToBestServices);
682   FRIEND_TEST(ServiceTest, AutoConnectLogging);
683   FRIEND_TEST(ServiceTest, CalculateState);
684   FRIEND_TEST(ServiceTest, CalculateTechnology);
685   FRIEND_TEST(ServiceTest, Certification);
686   FRIEND_TEST(ServiceTest, Compare);
687   FRIEND_TEST(ServiceTest, ConfigureEapStringProperty);
688   FRIEND_TEST(ServiceTest, ConfigureIgnoredProperty);
689   FRIEND_TEST(ServiceTest, Constructor);
690   FRIEND_TEST(ServiceTest, CustomSetterNoopChange);
691   FRIEND_TEST(ServiceTest, GetIPConfigRpcIdentifier);
692   FRIEND_TEST(ServiceTest, GetProperties);
693   FRIEND_TEST(ServiceTest, GetTethering);
694   FRIEND_TEST(ServiceTest, IsAutoConnectable);
695   FRIEND_TEST(ServiceTest, IsDependentOn);
696   FRIEND_TEST(ServiceTest, Load);
697   FRIEND_TEST(ServiceTest, LoadAutoConnect);
698   FRIEND_TEST(ServiceTest, PortalDetectionFailure);
699   FRIEND_TEST(ServiceTest, RecheckPortal);
700   FRIEND_TEST(ServiceTest, Save);
701   FRIEND_TEST(ServiceTest, SaveString);
702   FRIEND_TEST(ServiceTest, SaveStringCrypted);
703   FRIEND_TEST(ServiceTest, SaveStringDontSave);
704   FRIEND_TEST(ServiceTest, SaveStringEmpty);
705   FRIEND_TEST(ServiceTest, SecurityLevel);
706   FRIEND_TEST(ServiceTest, SetCheckPortal);
707   FRIEND_TEST(ServiceTest, SetConnectableFull);
708   FRIEND_TEST(ServiceTest, SetFriendlyName);
709   FRIEND_TEST(ServiceTest, SetProperty);
710   FRIEND_TEST(ServiceTest, State);
711   FRIEND_TEST(ServiceTest, StateResetAfterFailure);
712   FRIEND_TEST(ServiceTest, UniqueAttributes);
713   FRIEND_TEST(ServiceTest, Unload);
714   FRIEND_TEST(ServiceTest, UserInitiatedConnectionResult);
715   FRIEND_TEST(WiFiServiceTest, SetPassphraseResetHasEverConnected);
716   FRIEND_TEST(WiFiServiceTest, SuspectedCredentialFailure);
717   FRIEND_TEST(WiFiServiceTest, SetPassphraseRemovesCachedCredentials);
718   FRIEND_TEST(WiFiServiceTest, LoadPassphraseClearCredentials);
719   FRIEND_TEST(WiFiTimerTest, ReconnectTimer);
720   FRIEND_TEST(WiFiMainTest, EAPEvent);  // For eap_.
721   FRIEND_TEST(WiMaxServiceTest, ChangeCredResetHasEverConnected);
722   FRIEND_TEST(EthernetEapServiceTest, OnEapCredentialsChanged);
723 
724   static const char kAutoConnConnected[];
725   static const char kAutoConnConnecting[];
726   static const char kAutoConnExplicitDisconnect[];
727   static const char kAutoConnNotConnectable[];
728   static const char kAutoConnOffline[];
729   static const char kAutoConnTechnologyNotConnectable[];
730   static const char kAutoConnThrottled[];
731 
732 #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X)
733   static const size_t kEAPMaxCertificationElements;
734 #endif  // DISABLE_WIFI || DISABLE_WIRED_8021X
735 
736   static const char kServiceSortAutoConnect[];
737   static const char kServiceSortConnectable[];
738   static const char kServiceSortHasEverConnected[];
739   static const char kServiceSortIsConnected[];
740   static const char kServiceSortDependency[];
741   static const char kServiceSortIsConnecting[];
742   static const char kServiceSortIsFailed[];
743   static const char kServiceSortIsOnline[];
744   static const char kServiceSortIsPortalled[];
745   static const char kServiceSortPriority[];
746   static const char kServiceSortPriorityWithinTechnology[];
747   static const char kServiceSortSecurity[];
748   static const char kServiceSortProfileOrder[];
749   static const char kServiceSortEtc[];
750   static const char kServiceSortSerialNumber[];
751   static const char kServiceSortTechnology[];
752 
753   static const uint64_t kMaxAutoConnectCooldownTimeMilliseconds;
754   static const uint64_t kMinAutoConnectCooldownTimeMilliseconds;
755   static const uint64_t kAutoConnectCooldownBackoffFactor;
756 
757   static const int kDisconnectsMonitorSeconds;
758   static const int kMisconnectsMonitorSeconds;
759   static const int kReportDisconnectsThreshold;
760   static const int kReportMisconnectsThreshold;
761   static const int kMaxDisconnectEventHistory;
762   static const int kMaxMisconnectEventHistory;
763 
764   bool GetAutoConnect(Error* error);
765 
766   std::string GetCheckPortal(Error* error);
767   bool SetCheckPortal(const std::string& check_portal, Error* error);
768 
769   std::string GetGuid(Error* error);
770 
771   virtual std::string GetDeviceRpcId(Error* error) const = 0;
772 
773   std::string GetIPConfigRpcIdentifier(Error* error) const;
774 
775   std::string GetNameProperty(Error* error);
776   // The base implementation asserts that |name| matches the current Name
777   // property value.
778   virtual bool SetNameProperty(const std::string& name, Error* error);
779 
780   int32_t GetPriority(Error* error);
781   int32_t GetPriorityWithinTechnology(Error* error);
782 
783   std::string GetProfileRpcId(Error* error);
784   bool SetProfileRpcId(const std::string& profile, Error* error);
785 
786   // Returns TCP port of service's HTTP proxy in host order.
787   uint16_t GetHTTPProxyPort(Error* error) const;
788 
789   std::string GetProxyConfig(Error* error);
790   bool SetProxyConfig(const std::string& proxy_config, Error* error);
791 
792   Strings GetDisconnectsProperty(Error* error) const;
793   Strings GetMisconnectsProperty(Error* error) const;
794 
795   void ReEnableAutoConnectTask();
796   // Disables autoconnect and posts a task to re-enable it after a cooldown.
797   // Note that autoconnect could be disabled for other reasons as well.
798   void ThrottleFutureAutoConnects();
799 
800   // Saves settings to profile, if we have one. Unlike
801   // SaveServiceToProfile, SaveToProfile never assigns this service
802   // into a profile.
803   void SaveToProfile();
804 
805   // Qualify the conditions under which the most recent disconnect occurred.
806   // Make note ot the fact that there was a problem connecting / staying
807   // connected if the disconnection did not occur as a clear result of user
808   // action.
809   void NoteDisconnectEvent();
810 
811   // Utility function that returns true if a is different from b.  When they
812   // are, "decision" is populated with the boolean value of "a > b".
813   static bool DecideBetween(int a, int b, bool* decision);
814 
815   // Report the result of user-initiated connection attempt to UMA stats.
816   // Currently only report stats for wifi service.
817   void ReportUserInitiatedConnectionResult(ConnectState state);
818 
819   // Linearize security parameters (crypto algorithm, key rotation, endpoint
820   // authentication) for comparison.
821   uint16_t SecurityLevel();
822 
823   // WeakPtrFactory comes first, so that other fields can use it.
824   base::WeakPtrFactory<Service> weak_ptr_factory_;
825 
826   ConnectState state_;
827   ConnectState previous_state_;
828   ConnectFailure failure_;
829   bool auto_connect_;
830 
831   // Denotes whether the value of auto_connect_ property value should be
832   // retained, i.e. only be allowed to change via explicit property changes
833   // from the UI.
834   bool retain_auto_connect_;
835 
836   std::string check_portal_;
837   bool connectable_;
838   std::string error_;
839   std::string error_details_;
840   std::string previous_error_;
841   int32_t previous_error_serial_number_;
842   bool explicitly_disconnected_;
843   bool is_in_user_connect_;
844   int32_t priority_;
845   int32_t priority_within_technology_;
846   uint8_t crypto_algorithm_;
847   bool key_rotation_;
848   bool endpoint_auth_;
849   std::string portal_detection_failure_phase_;
850   std::string portal_detection_failure_status_;
851 
852   uint8_t strength_;
853   std::string proxy_config_;
854   std::string ui_data_;
855   std::string guid_;
856   bool save_credentials_;
857 #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X)
858   std::unique_ptr<EapCredentials> eap_;
859 #endif  // DISABLE_WIFI || DISABLE_WIRED_8021X
860   std::unique_ptr<DhcpProperties> dhcp_properties_;
861   Technology::Identifier technology_;
862   // The time of the most recent failure. Value is 0 if the service is
863   // not currently failed.
864   time_t failed_time_;
865   // Whether or not this service has ever reached kStateConnected.
866   bool has_ever_connected_;
867 
868   EventHistory disconnects_;  // Connection drops.
869   EventHistory misconnects_;  // Failures to connect.
870 
871   base::CancelableClosure reenable_auto_connect_task_;
872   uint64_t auto_connect_cooldown_milliseconds_;
873 
874   ProfileRefPtr profile_;
875   PropertyStore store_;
876   std::set<std::string> parameters_ignored_for_configure_;
877 
878   EventDispatcher* dispatcher_;
879   ControlInterface* control_interface_;
880   unsigned int serial_number_;
881   std::string unique_name_;  // MUST be unique amongst service instances
882 
883   // Service's friendly name is presented through the UI. By default it's the
884   // same as |unique_name_| but normally Service subclasses override
885   // it. WARNING: Don't log the friendly name at the default logging level due
886   // to PII concerns.
887   std::string friendly_name_;
888 
889   // List of subject names reported by remote entity during TLS setup.
890   std::vector<std::string> remote_certification_;
891 
892   std::unique_ptr<ServiceAdaptorInterface> adaptor_;
893   std::unique_ptr<ServicePropertyChangeNotifier> property_change_notifier_;
894   std::unique_ptr<HTTPProxy> http_proxy_;
895   ConnectionRefPtr connection_;
896   StaticIPParameters static_ip_parameters_;
897   Metrics* metrics_;
898   Manager* manager_;
899   std::unique_ptr<Sockets> sockets_;
900   Time* time_;
901   DiagnosticsReporter* diagnostics_reporter_;
902 
903   // The |serial_number_| for the next Service.
904   static unsigned int next_serial_number_;
905 
906   // Network identifier indicating the network (gateway) the service is
907   // connected to.
908   int connection_id_;
909   // When set to true, this service will automatically fallback to Google's DNS
910   // servers if the portal detection failed due to DNS failure and Google's DNS
911   // servers are working.
912   bool is_dns_auto_fallback_allowed_;
913   // When set to true, will not start link monitor when the connection to this
914   // service is established.
915   bool link_monitor_disabled_;
916   // When set to true, the credentials for this service will be considered
917   // valid, and will not require an initial connection to rank it highly for
918   // auto-connect.
919   bool managed_credentials_;
920   // Flag indicating if this service is unreliable (experiencing multiple
921   // link monitor failures in a short period of time).
922   bool unreliable_;
923 
924   DISALLOW_COPY_AND_ASSIGN(Service);
925 };
926 
927 }  // namespace shill
928 
929 #endif  // SHILL_SERVICE_H_
930