12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_change_notifier_chromeos.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chromeos/network/network_event_log.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state_handler.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/network_change_notifier.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/dns_config_service_posix.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DNS config services on Chrome OS are signalled by the network state handler
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// rather than relying on watching files in /etc.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkChangeNotifierChromeos::DnsConfigService
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public net::internal::DnsConfigServicePosix {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DnsConfigService();
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DnsConfigService();
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // net::internal::DnsConfigService() overrides.
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool StartWatching() OVERRIDE;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnNetworkChange();
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifierChromeos::DnsConfigService::DnsConfigService() {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifierChromeos::DnsConfigService::~DnsConfigService() {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkChangeNotifierChromeos::DnsConfigService::StartWatching() {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DNS config changes are handled and notified by the network state handlers.
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkChangeNotifierChromeos::DnsConfigService::OnNetworkChange() {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InvalidateConfig();
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InvalidateHosts();
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ReadNow();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifierChromeos::NetworkChangeNotifierChromeos()
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : NetworkChangeNotifier(NetworkChangeCalculatorParamsChromeos()),
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      connection_type_(CONNECTION_NONE) {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifierChromeos::~NetworkChangeNotifierChromeos() {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkChangeNotifierChromeos::Initialize() {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this);
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dns_config_service_.reset(new DnsConfigService());
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dns_config_service_->WatchConfig(
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(net::NetworkChangeNotifier::SetDnsConfig));
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update initial connection state.
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DefaultNetworkChanged(
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      NetworkHandler::Get()->network_state_handler()->DefaultNetwork());
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkChangeNotifierChromeos::Shutdown() {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dns_config_service_.reset();
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  NetworkHandler::Get()->network_state_handler()->RemoveObserver(
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      this, FROM_HERE);
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::NetworkChangeNotifier::ConnectionType
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifierChromeos::GetCurrentConnectionType() const {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return connection_type_;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid NetworkChangeNotifierChromeos::SuspendDone(
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::TimeDelta& sleep_duration) {
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Force invalidation of network resources on resume.
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NetworkChangeNotifier::NotifyObserversOfIPAddressChange();
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkChangeNotifierChromeos::DefaultNetworkChanged(
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const chromeos::NetworkState* default_network) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool connection_type_changed = false;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ip_address_changed = false;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool dns_changed = false;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateState(default_network, &connection_type_changed,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              &ip_address_changed, &dns_changed);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (connection_type_changed)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NetworkChangeNotifier::NotifyObserversOfConnectionTypeChange();
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ip_address_changed)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NetworkChangeNotifier::NotifyObserversOfIPAddressChange();
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dns_changed)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dns_config_service_->OnNetworkChange();
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkChangeNotifierChromeos::UpdateState(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const chromeos::NetworkState* default_network,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool* connection_type_changed,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool* ip_address_changed,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool* dns_changed) {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *connection_type_changed = false;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *ip_address_changed = false;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *dns_changed = false;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!default_network || !default_network->IsConnectedState()) {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If we lost a default network, we must update our state and notify
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // observers, otherwise we have nothing to do. (Under normal circumstances,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // we should never get duplicate no default network notifications).
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (connection_type_ != CONNECTION_NONE) {
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      NET_LOG_EVENT("NCNDefaultNetworkLost", service_path_);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *ip_address_changed = true;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *dns_changed = true;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *connection_type_changed = true;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      connection_type_ = CONNECTION_NONE;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service_path_.clear();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ip_address_.clear();
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dns_servers_.clear();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We do have a default network and it is connected.
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::NetworkChangeNotifier::ConnectionType new_connection_type =
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConnectionTypeFromShill(default_network->type(),
138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                              default_network->network_technology());
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (new_connection_type != connection_type_) {
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    NET_LOG_EVENT(
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        "NCNDefaultConnectionTypeChanged",
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::StringPrintf("%s -> %s",
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           ConnectionTypeToString(connection_type_),
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           ConnectionTypeToString(new_connection_type)));
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *connection_type_changed = true;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (default_network->path() != service_path_) {
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    NET_LOG_EVENT(
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        "NCNDefaultNetworkServicePathChanged",
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::StringPrintf("%s -> %s",
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           service_path_.c_str(),
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           default_network->path().c_str()));
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If we had a default network service change, network resources
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // must always be invalidated.
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *ip_address_changed = true;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *dns_changed = true;
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (default_network->ip_address() != ip_address_) {
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Is this a state update with an online->online transition?
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool stayed_online = (!*connection_type_changed &&
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          connection_type_ != CONNECTION_NONE);
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool is_suppressed = true;
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Suppress IP address change signalling on online->online transitions
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // when getting an IP address update for the first time.
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!(stayed_online && ip_address_.empty())) {
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      is_suppressed = false;
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      *ip_address_changed = true;
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    NET_LOG_EVENT(
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::StringPrintf("%s%s",
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           "NCNDefaultIPAddressChanged",
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           is_suppressed ? " (Suppressed)" : "" ),
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::StringPrintf("%s -> %s",
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           ip_address_.c_str(),
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           default_network->ip_address().c_str()));
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (default_network->dns_servers() != dns_servers_) {
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    NET_LOG_EVENT(
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        "NCNDefaultDNSServerChanged",
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::StringPrintf(
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            "%s -> %s",
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            JoinString(dns_servers_, ",").c_str(),
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            JoinString(default_network->dns_servers(), ",").c_str()));
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *dns_changed = true;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_type_ = new_connection_type;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service_path_ = default_network->path();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ip_address_ = default_network->ip_address();
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  dns_servers_ = default_network->dns_servers();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::NetworkChangeNotifier::ConnectionType
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifierChromeos::ConnectionTypeFromShill(
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& type, const std::string& technology) {
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (NetworkTypePattern::Ethernet().MatchesType(type))
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CONNECTION_ETHERNET;
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  else if (type == shill::kTypeWifi)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CONNECTION_WIFI;
20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  else if (type == shill::kTypeWimax)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CONNECTION_4G;
20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  else if (type == shill::kTypeBluetooth)
20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return CONNECTION_BLUETOOTH;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (type != shill::kTypeCellular)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CONNECTION_UNKNOWN;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For cellular types, mapping depends on the technology.
21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (technology == shill::kNetworkTechnologyEvdo ||
21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      technology == shill::kNetworkTechnologyGsm ||
21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      technology == shill::kNetworkTechnologyUmts ||
21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      technology == shill::kNetworkTechnologyHspa) {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CONNECTION_3G;
21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else if (technology == shill::kNetworkTechnologyHspaPlus ||
21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)             technology == shill::kNetworkTechnologyLte ||
21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)             technology == shill::kNetworkTechnologyLteAdvanced) {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CONNECTION_4G;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CONNECTION_2G;  // Default cellular type is 2G.
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::NetworkChangeNotifier::NetworkChangeCalculatorParams
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifierChromeos::NetworkChangeCalculatorParamsChromeos() {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkChangeCalculatorParams params;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Delay values arrived at by simple experimentation and adjusted so as to
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // produce a single signal when switching between network connections.
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.ip_address_offline_delay_ = base::TimeDelta::FromMilliseconds(4000);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.ip_address_online_delay_ = base::TimeDelta::FromMilliseconds(1000);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.connection_type_offline_delay_ =
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(500);
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.connection_type_online_delay_ = base::TimeDelta::FromMilliseconds(500);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return params;
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
241