• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_
6 #define CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_
7 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "base/gtest_prod_util.h"
13 #include "base/memory/scoped_vector.h"
14 #include "base/memory/singleton.h"
15 #include "base/observer_list.h"
16 #include "base/string16.h"
17 #include "base/timer.h"
18 #include "third_party/cros/chromeos_network.h"
19 
20 class DictionaryValue;
21 class Value;
22 
23 namespace chromeos {
24 
25 // Connection enums (see flimflam/include/service.h)
26 enum ConnectionType {
27   TYPE_UNKNOWN   = 0,
28   TYPE_ETHERNET  = 1,
29   TYPE_WIFI      = 2,
30   TYPE_WIMAX     = 3,
31   TYPE_BLUETOOTH = 4,
32   TYPE_CELLULAR  = 5,
33   TYPE_VPN       = 6,
34 };
35 
36 enum ConnectionMode {
37   MODE_UNKNOWN = 0,
38   MODE_MANAGED = 1,
39   MODE_ADHOC   = 2,
40 };
41 
42 enum ConnectionSecurity {
43   SECURITY_UNKNOWN = 0,
44   SECURITY_NONE    = 1,
45   SECURITY_WEP     = 2,
46   SECURITY_WPA     = 3,
47   SECURITY_RSN     = 4,
48   SECURITY_8021X   = 5,
49   SECURITY_PSK     = 6,
50 };
51 
52 enum ConnectionState {
53   STATE_UNKNOWN            = 0,
54   STATE_IDLE               = 1,
55   STATE_CARRIER            = 2,
56   STATE_ASSOCIATION        = 3,
57   STATE_CONFIGURATION      = 4,
58   STATE_READY              = 5,
59   STATE_DISCONNECT         = 6,
60   STATE_FAILURE            = 7,
61   STATE_ACTIVATION_FAILURE = 8
62 };
63 
64 enum ConnectivityState {
65   CONN_STATE_UNKNOWN      = 0,
66   CONN_STATE_UNRESTRICTED = 1,
67   CONN_STATE_RESTRICTED   = 2,
68   CONN_STATE_NONE         = 3
69 };
70 
71 // Network enums (see flimflam/include/network.h)
72 enum NetworkTechnology {
73   NETWORK_TECHNOLOGY_UNKNOWN      = 0,
74   NETWORK_TECHNOLOGY_1XRTT        = 1,
75   NETWORK_TECHNOLOGY_EVDO         = 2,
76   NETWORK_TECHNOLOGY_GPRS         = 3,
77   NETWORK_TECHNOLOGY_EDGE         = 4,
78   NETWORK_TECHNOLOGY_UMTS         = 5,
79   NETWORK_TECHNOLOGY_HSPA         = 6,
80   NETWORK_TECHNOLOGY_HSPA_PLUS    = 7,
81   NETWORK_TECHNOLOGY_LTE          = 8,
82   NETWORK_TECHNOLOGY_LTE_ADVANCED = 9,
83 };
84 
85 enum ActivationState {
86   ACTIVATION_STATE_UNKNOWN             = 0,
87   ACTIVATION_STATE_ACTIVATED           = 1,
88   ACTIVATION_STATE_ACTIVATING          = 2,
89   ACTIVATION_STATE_NOT_ACTIVATED       = 3,
90   ACTIVATION_STATE_PARTIALLY_ACTIVATED = 4,
91 };
92 
93 enum NetworkRoamingState {
94   ROAMING_STATE_UNKNOWN = 0,
95   ROAMING_STATE_HOME    = 1,
96   ROAMING_STATE_ROAMING = 2,
97 };
98 
99 // SIMLock states (see gobi-cromo-plugin/gobi_gsm_modem.cc)
100 enum SIMLockState {
101   SIM_UNKNOWN    = 0,
102   SIM_UNLOCKED   = 1,
103   SIM_LOCKED_PIN = 2,
104   SIM_LOCKED_PUK = 3,  // also when SIM is blocked, then retries = 0.
105 };
106 
107 // SIM PinRequire states. Since PinRequire current state is not exposed as a
108 // cellular property, we initialize it's value based on the SIMLockState
109 // initial value.
110 // SIM_PIN_REQUIRE_UNKNOWN - SIM card is absent or SIMLockState initial value
111 //                           hasn't been received yet.
112 // SIM_PIN_REQUIRED - SIM card is locked when booted/wake from sleep and
113 //                    requires user to enter PIN.
114 // SIM_PIN_NOT_REQUIRED - SIM card is unlocked all the time and requires PIN
115 // only on certain operations, such as ChangeRequirePin, ChangePin, EnterPin.
116 enum SIMPinRequire {
117   SIM_PIN_REQUIRE_UNKNOWN = 0,
118   SIM_PIN_NOT_REQUIRED    = 1,
119   SIM_PIN_REQUIRED        = 2,
120 };
121 
122 // Any PIN operation result (EnterPin, UnblockPin etc.).
123 enum PinOperationError {
124   PIN_ERROR_NONE           = 0,
125   PIN_ERROR_UNKNOWN        = 1,
126   PIN_ERROR_INCORRECT_CODE = 2,  // Either PIN/PUK specified is incorrect.
127   PIN_ERROR_BLOCKED        = 3,  // No more PIN retries left, SIM is blocked.
128 };
129 
130 // connection errors (see flimflam/include/service.h)
131 enum ConnectionError {
132   ERROR_NO_ERROR          = 0,
133   ERROR_OUT_OF_RANGE      = 1,
134   ERROR_PIN_MISSING       = 2,
135   ERROR_DHCP_FAILED       = 3,
136   ERROR_CONNECT_FAILED    = 4,
137   ERROR_BAD_PASSPHRASE    = 5,
138   ERROR_BAD_WEPKEY        = 6,
139   ERROR_ACTIVATION_FAILED = 7,
140   ERROR_NEED_EVDO         = 8,
141   ERROR_NEED_HOME_NETWORK = 9,
142   ERROR_OTASP_FAILED      = 10,
143   ERROR_AAA_FAILED        = 11,
144 };
145 
146 // We are currently only supporting setting a single EAP Method.
147 enum EAPMethod {
148   EAP_METHOD_UNKNOWN = 0,
149   EAP_METHOD_PEAP    = 1,
150   EAP_METHOD_TLS     = 2,
151   EAP_METHOD_TTLS    = 3,
152   EAP_METHOD_LEAP    = 4
153 };
154 
155 // We are currently only supporting setting a single EAP phase 2 authentication.
156 enum EAPPhase2Auth {
157   EAP_PHASE_2_AUTH_AUTO     = 0,
158   EAP_PHASE_2_AUTH_MD5      = 1,
159   EAP_PHASE_2_AUTH_MSCHAPV2 = 2,
160   EAP_PHASE_2_AUTH_MSCHAP   = 3,
161   EAP_PHASE_2_AUTH_PAP      = 4,
162   EAP_PHASE_2_AUTH_CHAP     = 5
163 };
164 
165 // Simple wrapper for property Cellular.FoundNetworks.
166 struct FoundCellularNetwork {
167   std::string status;
168   std::string network_id;
169   std::string short_name;
170   std::string long_name;
171   std::string technology;
172 };
173 
174 typedef std::vector<FoundCellularNetwork> CellularNetworkList;
175 
176 // Cellular network is considered low data when less than 60 minues.
177 static const int kCellularDataLowSecs = 60 * 60;
178 
179 // Cellular network is considered low data when less than 30 minues.
180 static const int kCellularDataVeryLowSecs = 30 * 60;
181 
182 // Cellular network is considered low data when less than 100MB.
183 static const int kCellularDataLowBytes = 100 * 1024 * 1024;
184 
185 // Cellular network is considered very low data when less than 50MB.
186 static const int kCellularDataVeryLowBytes = 50 * 1024 * 1024;
187 
188 // Contains data related to the flimflam.Device interface,
189 // e.g. ethernet, wifi, cellular.
190 // TODO(dpolukhin): refactor to make base class and device specific derivatives.
191 class NetworkDevice {
192  public:
193   explicit NetworkDevice(const std::string& device_path);
194 
195   // Device info.
device_path()196   const std::string& device_path() const { return device_path_; }
name()197   const std::string& name() const { return name_; }
type()198   ConnectionType type() const { return type_; }
scanning()199   bool scanning() const { return scanning_; }
meid()200   const std::string& meid() const { return MEID_; }
imei()201   const std::string& imei() const { return IMEI_; }
imsi()202   const std::string& imsi() const { return IMSI_; }
esn()203   const std::string& esn() const { return ESN_; }
mdn()204   const std::string& mdn() const { return MDN_; }
min()205   const std::string& min() const { return MIN_; }
model_id()206   const std::string& model_id() const { return model_id_; }
manufacturer()207   const std::string& manufacturer() const { return manufacturer_; }
sim_lock_state()208   SIMLockState sim_lock_state() const { return sim_lock_state_; }
is_sim_locked()209   bool is_sim_locked() const {
210     return sim_lock_state_ == SIM_LOCKED_PIN ||
211         sim_lock_state_ == SIM_LOCKED_PUK;
212   }
sim_retries_left()213   const int sim_retries_left() const { return sim_retries_left_; }
sim_pin_required()214   SIMPinRequire sim_pin_required() const { return sim_pin_required_; }
firmware_revision()215   const std::string& firmware_revision() const { return firmware_revision_; }
hardware_revision()216   const std::string& hardware_revision() const { return hardware_revision_; }
prl_version()217   const unsigned int prl_version() const { return PRL_version_; }
home_provider()218   const std::string& home_provider() const { return home_provider_; }
home_provider_code()219   const std::string& home_provider_code() const { return home_provider_code_; }
home_provider_country()220   const std::string& home_provider_country() const {
221     return home_provider_country_;
222   }
home_provider_id()223   const std::string& home_provider_id() const { return home_provider_id_; }
home_provider_name()224   const std::string& home_provider_name() const { return home_provider_name_; }
selected_cellular_network()225   const std::string& selected_cellular_network() const {
226     return selected_cellular_network_;
227   }
found_cellular_networks()228   const CellularNetworkList& found_cellular_networks() const {
229     return found_cellular_networks_;
230   }
data_roaming_allowed()231   bool data_roaming_allowed() const { return data_roaming_allowed_; }
support_network_scan()232   bool support_network_scan() const { return support_network_scan_; }
233 
234  private:
235   bool ParseValue(int index, const Value* value);
236   void ParseInfo(const DictionaryValue* info);
237 
238   // General device info.
239   std::string device_path_;
240   std::string name_;
241   ConnectionType type_;
242   bool scanning_;
243   // Cellular specific device info.
244   std::string carrier_;
245   std::string home_provider_;
246   std::string home_provider_code_;
247   std::string home_provider_country_;
248   std::string home_provider_id_;
249   std::string home_provider_name_;
250   std::string MEID_;
251   std::string IMEI_;
252   std::string IMSI_;
253   std::string ESN_;
254   std::string MDN_;
255   std::string MIN_;
256   std::string model_id_;
257   std::string manufacturer_;
258   SIMLockState sim_lock_state_;
259   int sim_retries_left_;
260   SIMPinRequire sim_pin_required_;
261   std::string firmware_revision_;
262   std::string hardware_revision_;
263   int PRL_version_;
264   std::string selected_cellular_network_;
265   CellularNetworkList found_cellular_networks_;
266   bool data_roaming_allowed_;
267   bool support_network_scan_;
268 
269   friend class NetworkLibraryImpl;
270   DISALLOW_COPY_AND_ASSIGN(NetworkDevice);
271 };
272 
273 // Contains data common to all network service types.
274 class Network {
275  public:
~Network()276   virtual ~Network() {}
277 
service_path()278   const std::string& service_path() const { return service_path_; }
name()279   const std::string& name() const { return name_; }
device_path()280   const std::string& device_path() const { return device_path_; }
ip_address()281   const std::string& ip_address() const { return ip_address_; }
type()282   ConnectionType type() const { return type_; }
mode()283   ConnectionMode mode() const { return mode_; }
connection_state()284   ConnectionState connection_state() const { return state_; }
connecting()285   bool connecting() const { return IsConnectingState(state_); }
configuring()286   bool configuring() const { return state_ == STATE_CONFIGURATION; }
connected()287   bool connected() const { return state_ == STATE_READY; }
connecting_or_connected()288   bool connecting_or_connected() const { return connecting() || connected(); }
failed()289   bool failed() const { return state_ == STATE_FAILURE; }
failed_or_disconnected()290   bool failed_or_disconnected() const {
291     return failed() || state_ == STATE_IDLE;
292   }
error()293   ConnectionError error() const { return error_; }
state()294   ConnectionState state() const { return state_; }
295   // Is this network connectable. Currently, this is mainly used by 802.1x
296   // networks to specify that the network is not configured yet.
connectable()297   bool connectable() const { return connectable_; }
298   // Is this the active network, i.e, the one through which
299   // network traffic is being routed? A network can be connected,
300   // but not be carrying traffic.
is_active()301   bool is_active() const { return is_active_; }
favorite()302   bool favorite() const { return favorite_; }
auto_connect()303   bool auto_connect() const { return auto_connect_; }
connectivity_state()304   ConnectivityState connectivity_state() const { return connectivity_state_; }
added()305   bool added() const { return added_; }
306 
unique_id()307   const std::string& unique_id() const { return unique_id_; }
308 
309   // We don't have a setter for |favorite_| because to unfavorite a network is
310   // equivalent to forget a network, so we call forget network on cros for
311   // that.  See ForgetWifiNetwork().
312   void SetAutoConnect(bool auto_connect);
313 
314   // Sets network name.
315   void SetName(const std::string& name);
316 
317   // Return a string representation of the state code.
318   std::string GetStateString() const;
319 
320   // Return a string representation of the error code.
321   std::string GetErrorString() const;
322 
IsConnectingState(ConnectionState state)323   static bool IsConnectingState(ConnectionState state) {
324     return (state == STATE_ASSOCIATION ||
325             state == STATE_CONFIGURATION ||
326             state == STATE_CARRIER);
327   }
328 
329  protected:
Network(const std::string & service_path,ConnectionType type)330   Network(const std::string& service_path, ConnectionType type)
331       : state_(STATE_UNKNOWN),
332         error_(ERROR_NO_ERROR),
333         connectable_(true),
334         is_active_(false),
335         favorite_(false),
336         auto_connect_(false),
337         connectivity_state_(CONN_STATE_UNKNOWN),
338         priority_order_(0),
339         added_(false),
340         service_path_(service_path),
341         type_(type) {}
342 
343   // Parse name/value pairs from libcros.
344   virtual bool ParseValue(int index, const Value* value);
345   virtual void ParseInfo(const DictionaryValue* info);
346 
347   // Methods to asynchronously set network service properties
348   virtual void SetStringProperty(const char* prop, const std::string& str,
349                                  std::string* dest);
350   virtual void SetBooleanProperty(const char* prop, bool b, bool* dest);
351   virtual void SetIntegerProperty(const char* prop, int i, int* dest);
352   virtual void SetValueProperty(const char* prop, Value* val);
353   virtual void ClearProperty(const char* prop);
354 
355   // This will clear the property if string is empty. Otherwise, it will set it.
356   virtual void SetOrClearStringProperty(const char* prop,
357                                         const std::string& str,
358                                         std::string* dest);
359 
360   std::string device_path_;
361   std::string name_;
362   std::string ip_address_;
363   ConnectionMode mode_;
364   ConnectionState state_;
365   ConnectionError error_;
366   bool connectable_;
367   bool is_active_;
368   bool favorite_;
369   bool auto_connect_;
370   ConnectivityState connectivity_state_;
371 
372   // Unique identifier, set the first time the network is parsed.
373   std::string unique_id_;
374 
375  private:
set_name(const std::string & name)376   void set_name(const std::string& name) { name_ = name; }
set_connecting(bool connecting)377   void set_connecting(bool connecting) {
378     state_ = (connecting ? STATE_ASSOCIATION : STATE_IDLE);
379   }
set_connected(bool connected)380   void set_connected(bool connected) {
381     state_ = (connected ? STATE_READY : STATE_IDLE);
382   }
set_state(ConnectionState state)383   void set_state(ConnectionState state) { state_ = state; }
set_connectable(bool connectable)384   void set_connectable(bool connectable) { connectable_ = connectable; }
set_active(bool is_active)385   void set_active(bool is_active) { is_active_ = is_active; }
set_error(ConnectionError error)386   void set_error(ConnectionError error) { error_ = error; }
set_connectivity_state(ConnectivityState connectivity_state)387   void set_connectivity_state(ConnectivityState connectivity_state) {
388     connectivity_state_ = connectivity_state;
389   }
set_added(bool added)390   void set_added(bool added) { added_ = added; }
391 
392   // Initialize the IP address field
393   void InitIPAddress();
394 
395   // Priority value, corresponds to index in list from flimflam (0 = first)
396   int priority_order_;
397 
398   // Set to true if the UI requested this as a new network.
399   bool added_;
400 
401   // These must not be modified after construction.
402   std::string service_path_;
403   ConnectionType type_;
404 
405   friend class NetworkLibraryImpl;
406   friend class NetworkLibraryStubImpl;
407   DISALLOW_COPY_AND_ASSIGN(Network);
408   // ChangeAutoConnectSaveTest accesses |favorite_|.
409   FRIEND_TEST_ALL_PREFIXES(WifiConfigViewTest, ChangeAutoConnectSaveTest);
410 };
411 
412 // Class for networks of TYPE_ETHERNET.
413 class EthernetNetwork : public Network {
414  public:
EthernetNetwork(const std::string & service_path)415   explicit EthernetNetwork(const std::string& service_path) :
416       Network(service_path, TYPE_ETHERNET) {
417   }
418  private:
419   friend class NetworkLibraryImpl;
420   DISALLOW_COPY_AND_ASSIGN(EthernetNetwork);
421 };
422 
423 // Class for networks of TYPE_VPN.
424 class VirtualNetwork : public Network {
425  public:
426   enum ProviderType {
427     PROVIDER_TYPE_L2TP_IPSEC_PSK,
428     PROVIDER_TYPE_L2TP_IPSEC_USER_CERT,
429     PROVIDER_TYPE_OPEN_VPN,
430     // Add new provider types before PROVIDER_TYPE_MAX.
431     PROVIDER_TYPE_MAX,
432   };
433 
VirtualNetwork(const std::string & service_path)434   explicit VirtualNetwork(const std::string& service_path) :
435       Network(service_path, TYPE_VPN),
436       provider_type_(PROVIDER_TYPE_L2TP_IPSEC_PSK) {
437   }
438 
server_hostname()439   const std::string& server_hostname() const { return server_hostname_; }
provider_type()440   ProviderType provider_type() const { return provider_type_; }
ca_cert()441   const std::string& ca_cert() const { return ca_cert_; }
psk_passphrase()442   const std::string& psk_passphrase() const { return psk_passphrase_; }
user_cert()443   const std::string& user_cert() const { return user_cert_; }
user_cert_key()444   const std::string& user_cert_key() const { return user_cert_key_; }
username()445   const std::string& username() const { return username_; }
user_passphrase()446   const std::string& user_passphrase() const { return user_passphrase_; }
447 
448   bool NeedMoreInfoToConnect() const;
449 
450   // Public setters.
451   void SetCACert(const std::string& ca_cert);
452   void SetPSKPassphrase(const std::string& psk_passphrase);
453   void SetUserCert(const std::string& user_cert);
454   void SetUserCertKey(const std::string& key);
455   void SetUsername(const std::string& username);
456   void SetUserPassphrase(const std::string& user_passphrase);
457 
458   std::string GetProviderTypeString() const;
459 
460  private:
461   // Network overrides.
462   virtual bool ParseValue(int index, const Value* value);
463   virtual void ParseInfo(const DictionaryValue* info);
464 
465   // VirtualNetwork private methods.
466   bool ParseProviderValue(int index, const Value* value);
467 
set_server_hostname(const std::string & server_hostname)468   void set_server_hostname(const std::string& server_hostname) {
469     server_hostname_ = server_hostname;
470   }
set_provider_type(ProviderType provider_type)471   void set_provider_type(ProviderType provider_type) {
472     provider_type_ = provider_type;
473   }
set_ca_cert(const std::string & ca_cert)474   void set_ca_cert(const std::string& ca_cert) {
475     ca_cert_ = ca_cert;
476   }
set_psk_passphrase(const std::string & psk_passphrase)477   void set_psk_passphrase(const std::string& psk_passphrase) {
478     psk_passphrase_ = psk_passphrase;
479   }
set_user_cert(const std::string & user_cert)480   void set_user_cert(const std::string& user_cert) {
481     user_cert_ = user_cert;
482   }
set_user_cert_key(const std::string & key)483   void set_user_cert_key(const std::string& key) {
484     user_cert_key_ = key;
485   }
set_username(const std::string & username)486   void set_username(const std::string& username) {
487     username_ = username;
488   }
set_user_passphrase(const std::string & user_passphrase)489   void set_user_passphrase(const std::string& user_passphrase) {
490     user_passphrase_ = user_passphrase;
491   }
492 
493   std::string server_hostname_;
494   ProviderType provider_type_;
495   std::string ca_cert_;
496   std::string psk_passphrase_;
497   std::string user_cert_;
498   std::string user_cert_key_;
499   std::string username_;
500   std::string user_passphrase_;
501 
502   friend class NetworkLibraryImpl;
503   DISALLOW_COPY_AND_ASSIGN(VirtualNetwork);
504 };
505 typedef std::vector<VirtualNetwork*> VirtualNetworkVector;
506 
507 // Base class for networks of TYPE_WIFI or TYPE_CELLULAR.
508 class WirelessNetwork : public Network {
509  public:
strength()510   int strength() const { return strength_; }
511 
512  protected:
WirelessNetwork(const std::string & service_path,ConnectionType type)513   WirelessNetwork(const std::string& service_path, ConnectionType type)
514       : Network(service_path, type),
515         strength_(0) {}
516   int strength_;
517 
518   // Network overrides.
519   virtual bool ParseValue(int index, const Value* value);
520 
521  private:
set_strength(int strength)522   void set_strength(int strength) { strength_ = strength; }
523 
524   friend class NetworkLibraryImpl;
525   friend class NetworkLibraryStubImpl;
526   DISALLOW_COPY_AND_ASSIGN(WirelessNetwork);
527 };
528 
529 // Class for networks of TYPE_CELLULAR.
530 class CellularDataPlan;
531 
532 class CellularNetwork : public WirelessNetwork {
533  public:
534   enum DataLeft {
535     DATA_UNKNOWN,
536     DATA_NORMAL,
537     DATA_LOW,
538     DATA_VERY_LOW,
539     DATA_NONE
540   };
541 
542   struct Apn {
543     std::string apn;
544     std::string network_id;
545     std::string username;
546     std::string password;
547 
ApnApn548     Apn() {}
ApnApn549     Apn(const std::string& apn, const std::string& network_id,
550         const std::string& username, const std::string& password)
551         : apn(apn), network_id(network_id),
552           username(username), password(password) {
553     }
554     void Set(const DictionaryValue& dict);
555   };
556 
557   virtual ~CellularNetwork();
558 
CellularNetwork(const std::string & service_path)559   explicit CellularNetwork(const std::string& service_path)
560       : WirelessNetwork(service_path, TYPE_CELLULAR),
561         activation_state_(ACTIVATION_STATE_UNKNOWN),
562         network_technology_(NETWORK_TECHNOLOGY_UNKNOWN),
563         roaming_state_(ROAMING_STATE_UNKNOWN),
564         data_left_(DATA_UNKNOWN) {
565   }
566   // Starts device activation process. Returns false if the device state does
567   // not permit activation.
568   bool StartActivation() const;
569   // Requests data plans if the network is conencted and activated.
570   // Plan data will be passed through Network::Observer::CellularDataPlanChanged
571   // callback.
572   void RefreshDataPlansIfNeeded() const;
573 
activation_state()574   const ActivationState activation_state() const { return activation_state_; }
activated()575   bool activated() const {
576     return activation_state() == ACTIVATION_STATE_ACTIVATED;
577   }
network_technology()578   const NetworkTechnology network_technology() const {
579     return network_technology_;
580   }
roaming_state()581   const NetworkRoamingState roaming_state() const { return roaming_state_; }
restricted_pool()582   bool restricted_pool() const {
583     return connectivity_state() == CONN_STATE_RESTRICTED;
584   }
needs_new_plan()585   bool needs_new_plan() const {
586     return restricted_pool() && connected() && activated();
587   }
operator_name()588   const std::string& operator_name() const { return operator_name_; }
operator_code()589   const std::string& operator_code() const { return operator_code_; }
operator_country()590   const std::string& operator_country() const { return operator_country_; }
payment_url()591   const std::string& payment_url() const { return payment_url_; }
usage_url()592   const std::string& usage_url() const { return usage_url_; }
data_left()593   DataLeft data_left() const { return data_left_; }
apn()594   const Apn& apn() const { return apn_; }
last_good_apn()595   const Apn& last_good_apn() const { return last_good_apn_; }
596   void SetApn(const Apn& apn);
597   bool SupportsDataPlan() const;
598 
599   // Misc.
is_gsm()600   bool is_gsm() const {
601     return network_technology_ != NETWORK_TECHNOLOGY_EVDO &&
602         network_technology_ != NETWORK_TECHNOLOGY_1XRTT &&
603         network_technology_ != NETWORK_TECHNOLOGY_UNKNOWN;
604   }
605 
606   // Return a string representation of network technology.
607   std::string GetNetworkTechnologyString() const;
608   // Return a string representation of connectivity state.
609   std::string GetConnectivityStateString() const;
610   // Return a string representation of activation state.
611   std::string GetActivationStateString() const;
612   // Return a string representation of roaming state.
613   std::string GetRoamingStateString() const;
614 
615   // Return a string representation of |activation_state|.
616   static std::string ActivationStateToString(ActivationState activation_state);
617 
618  protected:
619   // WirelessNetwork overrides.
620   virtual bool ParseValue(int index, const Value* value);
621 
622   ActivationState activation_state_;
623   NetworkTechnology network_technology_;
624   NetworkRoamingState roaming_state_;
625   // Carrier Info
626   std::string operator_name_;
627   std::string operator_code_;
628   std::string operator_country_;
629   std::string payment_url_;
630   std::string usage_url_;
631   // Cached values
632   DataLeft data_left_;  // Updated when data plans are updated.
633   Apn apn_;
634   Apn last_good_apn_;
635 
636  private:
set_activation_state(ActivationState state)637   void set_activation_state(ActivationState state) {
638     activation_state_ = state;
639   }
set_payment_url(const std::string & url)640   void set_payment_url(const std::string& url) { payment_url_ = url; }
set_usage_url(const std::string & url)641   void set_usage_url(const std::string& url) { usage_url_ = url; }
set_network_technology(NetworkTechnology technology)642   void set_network_technology(NetworkTechnology technology) {
643     network_technology_ = technology;
644   }
set_roaming_state(NetworkRoamingState state)645   void set_roaming_state(NetworkRoamingState state) { roaming_state_ = state; }
set_data_left(DataLeft data_left)646   void set_data_left(DataLeft data_left) { data_left_ = data_left; }
set_apn(const Apn & apn)647   void set_apn(const Apn& apn) { apn_ = apn; }
set_last_good_apn(const Apn & apn)648   void set_last_good_apn(const Apn& apn) { last_good_apn_ = apn; }
649 
650   friend class NetworkLibraryImpl;
651   friend class NetworkLibraryStubImpl;
652   DISALLOW_COPY_AND_ASSIGN(CellularNetwork);
653 };
654 typedef std::vector<CellularNetwork*> CellularNetworkVector;
655 
656 // Class for networks of TYPE_WIFI.
657 class WifiNetwork : public WirelessNetwork {
658  public:
WifiNetwork(const std::string & service_path)659   explicit WifiNetwork(const std::string& service_path)
660       : WirelessNetwork(service_path, TYPE_WIFI),
661         encryption_(SECURITY_NONE),
662         passphrase_required_(false),
663         eap_method_(EAP_METHOD_UNKNOWN),
664         eap_phase_2_auth_(EAP_PHASE_2_AUTH_AUTO),
665         eap_use_system_cas_(true),
666         save_credentials_(false) {
667   }
668 
encrypted()669   bool encrypted() const { return encryption_ != SECURITY_NONE; }
encryption()670   ConnectionSecurity encryption() const { return encryption_; }
passphrase()671   const std::string& passphrase() const { return passphrase_; }
identity()672   const std::string& identity() const { return identity_; }
cert_path()673   const std::string& cert_path() const { return cert_path_; }
passphrase_required()674   bool passphrase_required() const { return passphrase_required_; }
675 
eap_method()676   EAPMethod eap_method() const { return eap_method_; }
eap_phase_2_auth()677   EAPPhase2Auth eap_phase_2_auth() const { return eap_phase_2_auth_; }
eap_server_ca_cert_nss_nickname()678   const std::string& eap_server_ca_cert_nss_nickname() const {
679     return eap_server_ca_cert_nss_nickname_; }
eap_client_cert_pkcs11_id()680   const std::string& eap_client_cert_pkcs11_id() const {
681     return eap_client_cert_pkcs11_id_; }
eap_use_system_cas()682   const bool eap_use_system_cas() const { return eap_use_system_cas_; }
eap_identity()683   const std::string& eap_identity() const { return eap_identity_; }
eap_anonymous_identity()684   const std::string& eap_anonymous_identity() const {
685     return eap_anonymous_identity_; }
eap_passphrase()686   const std::string& eap_passphrase() const { return eap_passphrase_; }
save_credentials()687   bool save_credentials() const { return save_credentials_; }
688 
689   const std::string& GetPassphrase() const;
690 
691   bool SetSsid(const std::string& ssid);
692   bool SetHexSsid(const std::string& ssid_hex);
693   void SetPassphrase(const std::string& passphrase);
694   void SetIdentity(const std::string& identity);
695   void SetCertPath(const std::string& cert_path);
696 
697   // 802.1x properties
698   void SetEAPMethod(EAPMethod method);
699   void SetEAPPhase2Auth(EAPPhase2Auth auth);
700   void SetEAPServerCaCertNssNickname(const std::string& nss_nickname);
701   void SetEAPClientCertPkcs11Id(const std::string& pkcs11_id);
702   void SetEAPUseSystemCAs(bool use_system_cas);
703   void SetEAPIdentity(const std::string& identity);
704   void SetEAPAnonymousIdentity(const std::string& identity);
705   void SetEAPPassphrase(const std::string& passphrase);
706   void SetSaveCredentials(bool save_credentials);
707 
708   // Erase cached credentials, used when "Save password" is unchecked.
709   void EraseCredentials();
710 
711   // Return a string representation of the encryption code.
712   // This not translated and should be only used for debugging purposes.
713   std::string GetEncryptionString() const;
714 
715   // Return true if a passphrase or other input is required to connect.
716   bool IsPassphraseRequired() const;
717 
718   // Return true if cert_path_ indicates that we have loaded the certificate.
719   bool IsCertificateLoaded() const;
720 
721  private:
722   // WirelessNetwork overrides.
723   virtual bool ParseValue(int index, const Value* value);
724   virtual void ParseInfo(const DictionaryValue* info);
725 
726   void CalculateUniqueId();
727 
set_encryption(ConnectionSecurity encryption)728   void set_encryption(ConnectionSecurity encryption) {
729     encryption_ = encryption;
730   }
set_passphrase(const std::string & passphrase)731   void set_passphrase(const std::string& passphrase) {
732     passphrase_ = passphrase;
733   }
set_passphrase_required(bool passphrase_required)734   void set_passphrase_required(bool passphrase_required) {
735     passphrase_required_ = passphrase_required;
736   }
set_identity(const std::string & identity)737   void set_identity(const std::string& identity) {
738     identity_ = identity;
739   }
set_cert_path(const std::string & cert_path)740   void set_cert_path(const std::string& cert_path) {
741     cert_path_ = cert_path;
742   }
743 
744   ConnectionSecurity encryption_;
745   std::string passphrase_;
746   bool passphrase_required_;
747   std::string identity_;
748   std::string cert_path_;
749 
750   EAPMethod eap_method_;
751   EAPPhase2Auth eap_phase_2_auth_;
752   std::string eap_server_ca_cert_nss_nickname_;
753   std::string eap_client_cert_pkcs11_id_;
754   bool eap_use_system_cas_;
755   std::string eap_identity_;
756   std::string eap_anonymous_identity_;
757   std::string eap_passphrase_;
758   // Tells flimflam to save passphrase and EAP credentials to disk.
759   bool save_credentials_;
760 
761   // Internal state (not stored in flimflam).
762   // Passphrase set by user (stored for UI).
763   std::string user_passphrase_;
764 
765   friend class NetworkLibraryImpl;
766   DISALLOW_COPY_AND_ASSIGN(WifiNetwork);
767 };
768 typedef std::vector<WifiNetwork*> WifiNetworkVector;
769 
770 // Cellular Data Plan management.
771 class CellularDataPlan {
772  public:
CellularDataPlan()773   CellularDataPlan()
774       : plan_name("Unknown"),
775         plan_type(CELLULAR_DATA_PLAN_UNLIMITED),
776         plan_data_bytes(0),
777         data_bytes_used(0) { }
CellularDataPlan(const CellularDataPlanInfo & plan)778   explicit CellularDataPlan(const CellularDataPlanInfo &plan)
779       : plan_name(plan.plan_name ? plan.plan_name : ""),
780         plan_type(plan.plan_type),
781         update_time(base::Time::FromInternalValue(plan.update_time)),
782         plan_start_time(base::Time::FromInternalValue(plan.plan_start_time)),
783         plan_end_time(base::Time::FromInternalValue(plan.plan_end_time)),
784         plan_data_bytes(plan.plan_data_bytes),
785         data_bytes_used(plan.data_bytes_used) { }
786   // Formats cellular plan description.
787   string16 GetPlanDesciption() const;
788   // Evaluates cellular plans status and returns warning string if it is near
789   // expiration.
790   string16 GetRemainingWarning() const;
791   // Formats remaining plan data description.
792   string16 GetDataRemainingDesciption() const;
793   // Formats plan expiration description.
794   string16 GetPlanExpiration() const;
795   // Formats plan usage info.
796   string16 GetUsageInfo() const;
797   // Returns a unique string for this plan that can be used for comparisons.
798   std::string GetUniqueIdentifier() const;
799   base::TimeDelta remaining_time() const;
800   int64 remaining_minutes() const;
801   // Returns plan data remaining in bytes.
802   int64 remaining_data() const;
803   // TODO(stevenjb): Make these private with accessors and properly named.
804   std::string plan_name;
805   CellularDataPlanType plan_type;
806   base::Time update_time;
807   base::Time plan_start_time;
808   base::Time plan_end_time;
809   int64 plan_data_bytes;
810   int64 data_bytes_used;
811 };
812 typedef ScopedVector<CellularDataPlan> CellularDataPlanVector;
813 
814 // Geolocation data.
815 struct CellTower {
816   enum RadioType {
817     RADIOTYPE_GSM,
818     RADIOTYPE_CDMA,
819     RADIOTYPE_WCDMA,
820   } radio_type;                   // GSM/WCDMA     CDMA
821   int mobile_country_code;        //   MCC          MCC
822   int mobile_network_code;        //   MNC          SID
823   int location_area_code;         //   LAC          NID
824   int cell_id;                    //   CID          BID
825   base::Time timestamp;  // Timestamp when this cell was primary
826   int signal_strength;   // Radio signal strength measured in dBm.
827   int timing_advance;    // Represents the distance from the cell tower.
828                          // Each unit is roughly 550 meters.
829 };
830 
831 struct WifiAccessPoint {
832   std::string mac_address;  // The mac address of the WiFi node.
833   std::string name;         // The SSID of the WiFi node.
834   base::Time timestamp;     // Timestamp when this AP was detected.
835   int signal_strength;      // Radio signal strength measured in dBm.
836   int signal_to_noise;      // Current signal to noise ratio measured in dB.
837   int channel;              // Wifi channel number.
838 };
839 
840 typedef std::vector<CellTower> CellTowerVector;
841 typedef std::vector<WifiAccessPoint> WifiAccessPointVector;
842 
843 // IP Configuration.
844 struct NetworkIPConfig {
NetworkIPConfigNetworkIPConfig845   NetworkIPConfig(const std::string& device_path, IPConfigType type,
846                   const std::string& address, const std::string& netmask,
847                   const std::string& gateway, const std::string& name_servers)
848       : device_path(device_path),
849         type(type),
850         address(address),
851         netmask(netmask),
852         gateway(gateway),
853         name_servers(name_servers) {}
854 
855   // NetworkIPConfigs are sorted by tyoe.
856   bool operator< (const NetworkIPConfig& other) const {
857     return type < other.type;
858   }
859 
860   std::string device_path;
861   IPConfigType type;
862   std::string address;  // This looks like "/device/0011aa22bb33"
863   std::string netmask;
864   std::string gateway;
865   std::string name_servers;
866 };
867 typedef std::vector<NetworkIPConfig> NetworkIPConfigVector;
868 
869 // This class handles the interaction with the ChromeOS network library APIs.
870 // Classes can add themselves as observers. Users can get an instance of the
871 // library like this: chromeos::CrosLibrary::Get()->GetNetworkLibrary()
872 class NetworkLibrary {
873  public:
874   enum HardwareAddressFormat {
875     FORMAT_RAW_HEX,
876     FORMAT_COLON_SEPARATED_HEX
877   };
878 
879   class NetworkManagerObserver {
880    public:
881     // Called when the state of the network manager has changed,
882     // for example, networks have appeared or disappeared.
883     virtual void OnNetworkManagerChanged(NetworkLibrary* obj) = 0;
884   };
885 
886   class NetworkObserver {
887    public:
888     // Called when the state of a single network has changed,
889     // for example signal strength or connection state.
890     virtual void OnNetworkChanged(NetworkLibrary* cros,
891                                   const Network* network) = 0;
892   };
893 
894   class NetworkDeviceObserver {
895    public:
896     // Called when the state of a single device has changed,
897     // for example SIMLock state for cellular.
898     virtual void OnNetworkDeviceChanged(NetworkLibrary* cros,
899                                         const NetworkDevice* device) = 0;
900   };
901 
902   class CellularDataPlanObserver {
903    public:
904     // Called when the cellular data plan has changed.
905     virtual void OnCellularDataPlanChanged(NetworkLibrary* obj) = 0;
906   };
907 
908   class PinOperationObserver {
909    public:
910     // Called when pin async operation has completed.
911     // Network is NULL when we don't have an associated Network object.
912     virtual void OnPinOperationCompleted(NetworkLibrary* cros,
913                                          PinOperationError error) = 0;
914   };
915 
916   class UserActionObserver {
917    public:
918     // Called when user initiates a new connection.
919     // Network is NULL when we don't have an associated Network object.
920     virtual void OnConnectionInitiated(NetworkLibrary* cros,
921                                        const Network* network) = 0;
922   };
923 
~NetworkLibrary()924   virtual ~NetworkLibrary() {}
925 
926   virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) = 0;
927   virtual void RemoveNetworkManagerObserver(
928       NetworkManagerObserver* observer) = 0;
929 
930   // An attempt to add an observer that has already been added for a
931   // give service path will be ignored.
932   virtual void AddNetworkObserver(const std::string& service_path,
933                                   NetworkObserver* observer) = 0;
934   // Remove an observer of a single network
935   virtual void RemoveNetworkObserver(const std::string& service_path,
936                                      NetworkObserver* observer) = 0;
937   // Stop |observer| from observing any networks
938   virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) = 0;
939 
940   // Add an observer for a single network device.
941   virtual void AddNetworkDeviceObserver(const std::string& device_path,
942                                         NetworkDeviceObserver* observer) = 0;
943   // Remove an observer for a single network device.
944   virtual void RemoveNetworkDeviceObserver(const std::string& device_path,
945                                            NetworkDeviceObserver* observer) = 0;
946 
947   // Temporarily locks down certain functionality in network library to prevent
948   // unplanned side effects. During the lock down, Enable*Device() calls cannot
949   // be made.
950   virtual void Lock() = 0;
951   // Removes temporarily lock of network library.
952   virtual void Unlock() = 0;
953   // Checks if access to network library is locked.
954   virtual bool IsLocked() = 0;
955 
956   virtual void AddCellularDataPlanObserver(
957       CellularDataPlanObserver* observer) = 0;
958   virtual void RemoveCellularDataPlanObserver(
959       CellularDataPlanObserver* observer) = 0;
960 
961   virtual void AddPinOperationObserver(PinOperationObserver* observer) = 0;
962   virtual void RemovePinOperationObserver(PinOperationObserver* observer) = 0;
963 
964   virtual void AddUserActionObserver(UserActionObserver* observer) = 0;
965   virtual void RemoveUserActionObserver(UserActionObserver* observer) = 0;
966 
967   // Return the active or default Ethernet network (or NULL if none).
968   virtual const EthernetNetwork* ethernet_network() const = 0;
969   virtual bool ethernet_connecting() const = 0;
970   virtual bool ethernet_connected() const = 0;
971 
972   // Return the active Wifi network (or NULL if none active).
973   virtual const WifiNetwork* wifi_network() const = 0;
974   virtual bool wifi_connecting() const = 0;
975   virtual bool wifi_connected() const = 0;
976 
977   // Return the active Cellular network (or NULL if none active).
978   virtual const CellularNetwork* cellular_network() const = 0;
979   virtual bool cellular_connecting() const = 0;
980   virtual bool cellular_connected() const = 0;
981 
982   // Return the active virtual network (or NULL if none active).
983   virtual const VirtualNetwork* virtual_network() const = 0;
984   virtual bool virtual_network_connecting() const = 0;
985   virtual bool virtual_network_connected() const = 0;
986 
987   // Return true if any network is currently connected.
988   virtual bool Connected() const = 0;
989 
990   // Return true if any network is currently connecting.
991   virtual bool Connecting() const = 0;
992 
993   // Returns the current IP address if connected. If not, returns empty string.
994   virtual const std::string& IPAddress() const = 0;
995 
996   // Returns the current list of wifi networks.
997   virtual const WifiNetworkVector& wifi_networks() const = 0;
998 
999   // Returns the list of remembered wifi networks.
1000   virtual const WifiNetworkVector& remembered_wifi_networks() const = 0;
1001 
1002   // Returns the current list of cellular networks.
1003   virtual const CellularNetworkVector& cellular_networks() const = 0;
1004 
1005   // Returns the current list of virtual networks.
1006   virtual const VirtualNetworkVector& virtual_networks() const = 0;
1007 
1008   // Return a pointer to the device, if it exists, or NULL.
1009   virtual const NetworkDevice* FindNetworkDeviceByPath(
1010       const std::string& path) const = 0;
1011 
1012   // Returns device with TYPE_CELLULAR. Returns NULL if none exists.
1013   virtual const NetworkDevice* FindCellularDevice() const = 0;
1014 
1015   // Returns device with TYPE_ETHERNET. Returns NULL if none exists.
1016   virtual const NetworkDevice* FindEthernetDevice() const = 0;
1017 
1018   // Returns device with TYPE_WIFI. Returns NULL if none exists.
1019   virtual const NetworkDevice* FindWifiDevice() const = 0;
1020 
1021   // Return a pointer to the network, if it exists, or NULL.
1022   // NOTE: Never store these results, store service paths instead.
1023   // The pattern for doing an operation on a Network is:
1024   // Network* network = cros->FindNetworkByPath(service_path);
1025   // network->SetFoo();
1026   // network->Connect();
1027   // As long as this is done in sequence on the UI thread it will be safe;
1028   // the network list only gets updated on the UI thread.
1029   virtual Network* FindNetworkByPath(const std::string& path) const = 0;
1030   virtual WifiNetwork* FindWifiNetworkByPath(const std::string& path) const = 0;
1031   virtual CellularNetwork* FindCellularNetworkByPath(
1032       const std::string& path) const = 0;
1033   virtual VirtualNetwork* FindVirtualNetworkByPath(
1034       const std::string& path) const = 0;
1035 
1036   // Returns the visible wifi network corresponding to the remembered
1037   // wifi network, or NULL if the remembered network is not visible.
1038   virtual Network* FindNetworkFromRemembered(
1039       const Network* remembered) const = 0;
1040 
1041   // Retrieves the data plans associated with |path|, NULL if there are no
1042   // associated plans.
1043   virtual const CellularDataPlanVector* GetDataPlans(
1044       const std::string& path) const = 0;
1045 
1046   // This returns the significant data plan. If the user only has the
1047   // base data plan, then return that. If there is a base and a paid data plan,
1048   // then the significant one is the paid one. So return the paid plan.
1049   // If there are no data plans, then this method returns NULL.
1050   // This returns a pointer to a member of data_plans_, so if SetDataPlans()
1051   // gets called, the result becomes invalid.
1052   virtual const CellularDataPlan* GetSignificantDataPlan(
1053       const std::string& path) const = 0;
1054 
1055   // Passes |old_pin|, |new_pin| to change SIM card PIM.
1056   virtual void ChangePin(const std::string& old_pin,
1057                          const std::string& new_pin) = 0;
1058 
1059   // Passes |pin|, |require_pin| value to change SIM card RequirePin setting.
1060   virtual void ChangeRequirePin(bool require_pin,
1061                                 const std::string& pin) = 0;
1062 
1063   // Passes |pin| to unlock SIM card.
1064   virtual void EnterPin(const std::string& pin) = 0;
1065 
1066   // Passes |puk|, |new_pin| to unblock SIM card.
1067   virtual void UnblockPin(const std::string& puk,
1068                           const std::string& new_pin) = 0;
1069 
1070   // Request a scan for available cellular networks.
1071   virtual void RequestCellularScan() = 0;
1072 
1073   // Request a register in cellular network with |network_id|.
1074   virtual void RequestCellularRegister(const std::string& network_id) = 0;
1075 
1076   // Change data roaming restriction for current cellular device.
1077   virtual void SetCellularDataRoamingAllowed(bool new_value) = 0;
1078 
1079   // Request a scan for new wifi networks.
1080   virtual void RequestNetworkScan() = 0;
1081 
1082   // Reads out the results of the last wifi scan. These results are not
1083   // pre-cached in the library, so the call may block whilst the results are
1084   // read over IPC.
1085   // Returns false if an error occurred in reading the results. Note that
1086   // a true return code only indicates the result set was successfully read,
1087   // it does not imply a scan has successfully completed yet.
1088   virtual bool GetWifiAccessPoints(WifiAccessPointVector* result) = 0;
1089 
1090   // TODO(joth): Add GetCellTowers to retrieve a CellTowerVector.
1091 
1092   // Connect to the specified wireless network.
1093   virtual void ConnectToWifiNetwork(WifiNetwork* network) = 0;
1094 
1095   // Same as above but searches for an existing network by name.
1096   virtual void ConnectToWifiNetwork(const std::string& service_path) = 0;
1097 
1098   // Connect to the specified network with security, ssid, passphrase, identity,
1099   // and (optionally) certpath.
1100   virtual void ConnectToWifiNetwork(ConnectionSecurity security,
1101                                     const std::string& ssid,
1102                                     const std::string& passphrase,
1103                                     const std::string& identity,
1104                                     const std::string& certpath) = 0;
1105 
1106   // Connect to the specified cellular network.
1107   virtual void ConnectToCellularNetwork(CellularNetwork* network) = 0;
1108 
1109   // Records information that cellular play payment had happened.
1110   virtual void SignalCellularPlanPayment() = 0;
1111 
1112   // Returns true if cellular plan payment had been recorded recently.
1113   virtual bool HasRecentCellularPlanPayment() = 0;
1114 
1115   // Connect to the specified virtual network.
1116   virtual void ConnectToVirtualNetwork(VirtualNetwork* network) = 0;
1117 
1118   // Connect to the specified virtual network with service name,
1119   // server hostname, provider_type, PSK passphrase, username and passphrase.
1120   virtual void ConnectToVirtualNetworkPSK(
1121       const std::string& service_name,
1122       const std::string& server_hostname,
1123       const std::string& psk,
1124       const std::string& username,
1125       const std::string& user_passphrase) = 0;
1126 
1127   // Disconnect from the specified network.
1128   virtual void DisconnectFromNetwork(const Network* network) = 0;
1129 
1130   // Forget the wifi network corresponding to service_path.
1131   virtual void ForgetWifiNetwork(const std::string& service_path) = 0;
1132 
1133   // Returns home carrier ID if available, otherwise empty string is returned.
1134   // Carrier ID format: <carrier name> (country). Ex.: "Verizon (us)".
1135   virtual std::string GetCellularHomeCarrierId() const = 0;
1136 
1137   virtual bool ethernet_available() const = 0;
1138   virtual bool wifi_available() const = 0;
1139   virtual bool cellular_available() const = 0;
1140 
1141   virtual bool ethernet_enabled() const = 0;
1142   virtual bool wifi_enabled() const = 0;
1143   virtual bool cellular_enabled() const = 0;
1144 
1145   virtual bool wifi_scanning() const = 0;
1146 
1147   virtual const Network* active_network() const = 0;
1148   virtual const Network* connected_network() const = 0;
1149 
1150   virtual bool offline_mode() const = 0;
1151 
1152   // Enables/disables the ethernet network device.
1153   virtual void EnableEthernetNetworkDevice(bool enable) = 0;
1154 
1155   // Enables/disables the wifi network device.
1156   virtual void EnableWifiNetworkDevice(bool enable) = 0;
1157 
1158   // Enables/disables the cellular network device.
1159   virtual void EnableCellularNetworkDevice(bool enable) = 0;
1160 
1161   // Enables/disables offline mode.
1162   virtual void EnableOfflineMode(bool enable) = 0;
1163 
1164   // Fetches IP configs and hardware address for a given device_path.
1165   // The hardware address is usually a MAC address like "0011AA22BB33".
1166   // |hardware_address| will be an empty string, if no hardware address is
1167   // found.
1168   virtual NetworkIPConfigVector GetIPConfigs(
1169       const std::string& device_path,
1170       std::string* hardware_address,
1171       HardwareAddressFormat) = 0;
1172 
1173   // Factory function, creates a new instance and returns ownership.
1174   // For normal usage, access the singleton via CrosLibrary::Get().
1175   static NetworkLibrary* GetImpl(bool stub);
1176 };
1177 
1178 }  // namespace chromeos
1179 
1180 #endif  // CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_
1181