network_change_notifier_chromeos.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com// Copyright (c) 2012 The Chromium Authors. All rights reserved.
221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com// Use of this source code is governed by a BSD-style license that can be
321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com// found in the LICENSE file.
421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include <string>
621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include "base/basictypes.h"
821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include "base/bind.h"
921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include "base/strings/string_util.h"
1021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include "base/strings/stringprintf.h"
1121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include "chromeos/dbus/dbus_thread_manager.h"
128b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "chromeos/network/network_change_notifier_chromeos.h"
138b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "chromeos/network/network_event_log.h"
1421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include "chromeos/network/network_state.h"
1521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include "chromeos/network/network_state_handler.h"
1621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include "net/base/network_change_notifier.h"
1721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include "net/dns/dns_config_service_posix.h"
1821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include "third_party/cros_system_api/dbus/service_constants.h"
193e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
2021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comnamespace chromeos {
2121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
2221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com// DNS config services on Chrome OS are signalled by the network state handler
2321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com// rather than relying on watching files in /etc.
2421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass NetworkChangeNotifierChromeos::DnsConfigService
2521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    : public net::internal::DnsConfigServicePosix {
2621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com public:
2721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  DnsConfigService();
2821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual ~DnsConfigService();
2921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
3021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  // net::internal::DnsConfigService() overrides.
3121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual bool StartWatching() OVERRIDE;
3221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
3321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual void OnNetworkChange();
3421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com};
3521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
3621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comNetworkChangeNotifierChromeos::DnsConfigService::DnsConfigService() {
3721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com}
3821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
39672588b684d484dce6ae251e9e163e4a46924322reed@google.comNetworkChangeNotifierChromeos::DnsConfigService::~DnsConfigService() {
40672588b684d484dce6ae251e9e163e4a46924322reed@google.com}
41672588b684d484dce6ae251e9e163e4a46924322reed@google.com
42672588b684d484dce6ae251e9e163e4a46924322reed@google.combool NetworkChangeNotifierChromeos::DnsConfigService::StartWatching() {
43672588b684d484dce6ae251e9e163e4a46924322reed@google.com  // DNS config changes are handled and notified by the network state handlers.
44672588b684d484dce6ae251e9e163e4a46924322reed@google.com  return true;
45672588b684d484dce6ae251e9e163e4a46924322reed@google.com}
46672588b684d484dce6ae251e9e163e4a46924322reed@google.com
4720f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.comvoid NetworkChangeNotifierChromeos::DnsConfigService::OnNetworkChange() {
4820f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  InvalidateConfig();
4920f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  InvalidateHosts();
5020f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  ReadNow();
5120f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com}
5220f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com
53672588b684d484dce6ae251e9e163e4a46924322reed@google.comNetworkChangeNotifierChromeos::NetworkChangeNotifierChromeos()
5420f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com    : NetworkChangeNotifier(NetworkChangeCalculatorParamsChromeos()),
55672588b684d484dce6ae251e9e163e4a46924322reed@google.com      connection_type_(CONNECTION_NONE) {
5620f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com}
5720f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com
5820f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.comNetworkChangeNotifierChromeos::~NetworkChangeNotifierChromeos() {
5920f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com}
6020f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com
6120f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.comvoid NetworkChangeNotifierChromeos::Initialize() {
6220f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this);
633e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE);
6420f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com
653e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  dns_config_service_.reset(new DnsConfigService());
663e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  dns_config_service_->WatchConfig(
673e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com      base::Bind(net::NetworkChangeNotifier::SetDnsConfig));
683e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
6921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  // Update initial connection state.
7021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  DefaultNetworkChanged(
7121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com      NetworkHandler::Get()->network_state_handler()->DefaultNetwork());
7221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com}
7321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
7421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comvoid NetworkChangeNotifierChromeos::Shutdown() {
7521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  dns_config_service_.reset();
767ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com  NetworkHandler::Get()->network_state_handler()->RemoveObserver(
777ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com      this, FROM_HERE);
7821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this);
7921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com}
8021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
8121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comnet::NetworkChangeNotifier::ConnectionType
8221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comNetworkChangeNotifierChromeos::GetCurrentConnectionType() const {
8321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  return connection_type_;
8421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com}
8521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
8621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comvoid NetworkChangeNotifierChromeos::SuspendDone(
877ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com    const base::TimeDelta& sleep_duration) {
887ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com  // Force invalidation of network resources on resume.
8910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  NetworkChangeNotifier::NotifyObserversOfIPAddressChange();
9021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com}
9121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
9221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
9310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.comvoid NetworkChangeNotifierChromeos::DefaultNetworkChanged(
9410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    const chromeos::NetworkState* default_network) {
9510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  bool connection_type_changed = false;
9610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  bool ip_address_changed = false;
9710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  bool dns_changed = false;
9810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
9910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  UpdateState(default_network, &connection_type_changed,
10010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com              &ip_address_changed, &dns_changed);
10110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
10210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  if (connection_type_changed)
10310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    NetworkChangeNotifier::NotifyObserversOfConnectionTypeChange();
10410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  if (ip_address_changed)
10510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    NetworkChangeNotifier::NotifyObserversOfIPAddressChange();
10610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  if (dns_changed)
10710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    dns_config_service_->OnNetworkChange();
10810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com}
10921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
11021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comvoid NetworkChangeNotifierChromeos::UpdateState(
111c51db02181982fbcb8888e2a89132363a7d9371cscroggo    const chromeos::NetworkState* default_network,
11221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    bool* connection_type_changed,
11321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    bool* ip_address_changed,
11421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    bool* dns_changed) {
11521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  *connection_type_changed = false;
11621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  *ip_address_changed = false;
11721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  *dns_changed = false;
11821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  if (!default_network || !default_network->IsConnectedState()) {
11921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    // If we lost a default network, we must update our state and notify
12021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    // observers, otherwise we have nothing to do. (Under normal circumstances,
12121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    // we should never get duplicate no default network notifications).
12221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    if (connection_type_ != CONNECTION_NONE) {
12321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com      NET_LOG_EVENT("NCNDefaultNetworkLost", service_path_);
12421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com      *ip_address_changed = true;
12521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com      *dns_changed = true;
12621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com      *connection_type_changed = true;
1273e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com      connection_type_ = CONNECTION_NONE;
1283e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com      service_path_.clear();
1293e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com      ip_address_.clear();
1303e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com      dns_servers_.clear();
1313e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com    }
1323e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com    return;
1333e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  }
1343e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
1353e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  // We do have a default network and it is connected.
1363e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  net::NetworkChangeNotifier::ConnectionType new_connection_type =
1373e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com      ConnectionTypeFromShill(default_network->type(),
1383e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com                              default_network->network_technology());
1393e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  if (new_connection_type != connection_type_) {
1403e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com    NET_LOG_EVENT(
1413e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com        "NCNDefaultConnectionTypeChanged",
1423e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com        base::StringPrintf("%s -> %s",
1433e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com                           ConnectionTypeToString(connection_type_),
14421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com                           ConnectionTypeToString(new_connection_type)));
14521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    *connection_type_changed = true;
1463e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  }
1473e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  if (default_network->path() != service_path_) {
1483e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com    NET_LOG_EVENT(
1493e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com        "NCNDefaultNetworkServicePathChanged",
1503e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com        base::StringPrintf("%s -> %s",
15121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com                           service_path_.c_str(),
15221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com                           default_network->path().c_str()));
1533e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
1543e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com    // If we had a default network service change, network resources
1553e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com    // must always be invalidated.
15621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    *ip_address_changed = true;
15721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    *dns_changed = true;
15821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  }
15921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  if (default_network->ip_address() != ip_address_) {
16021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    // Is this a state update with an online->online transition?
16121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    bool stayed_online = (!*connection_type_changed &&
16221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com                          connection_type_ != CONNECTION_NONE);
16321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
16421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    bool is_suppressed = true;
16521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    // Suppress IP address change signalling on online->online transitions
16621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    // when getting an IP address update for the first time.
16721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    if (!(stayed_online && ip_address_.empty())) {
1683e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com      is_suppressed = false;
16921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com      *ip_address_changed = true;
17021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    }
17121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    NET_LOG_EVENT(
1723e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com        base::StringPrintf("%s%s",
17321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com                           "NCNDefaultIPAddressChanged",
1743e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com                           is_suppressed ? " (Suppressed)" : "" ),
1753e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com        base::StringPrintf("%s -> %s",
17621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com                           ip_address_.c_str(),
17721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com                           default_network->ip_address().c_str()));
1787ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com  }
17921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  if (default_network->dns_servers() != dns_servers_) {
18021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    NET_LOG_EVENT(
1813e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com        "NCNDefaultDNSServerChanged",
18221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com        base::StringPrintf(
18321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com            "%s -> %s",
18421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com            JoinString(dns_servers_, ",").c_str(),
18521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com            JoinString(default_network->dns_servers(), ",").c_str()));
18621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    *dns_changed = true;
18721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  }
18821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
18921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  connection_type_ = new_connection_type;
19021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  service_path_ = default_network->path();
19121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  ip_address_ = default_network->ip_address();
19221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  dns_servers_ = default_network->dns_servers();
19310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com}
19410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
19510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com// static
19610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.comnet::NetworkChangeNotifier::ConnectionType
1973e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comNetworkChangeNotifierChromeos::ConnectionTypeFromShill(
19810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    const std::string& type, const std::string& technology) {
19910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  if (NetworkTypePattern::Ethernet().MatchesType(type))
20010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    return CONNECTION_ETHERNET;
2013e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  else if (type == shill::kTypeWifi)
2023e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com    return CONNECTION_WIFI;
2033e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  else if (type == shill::kTypeWimax)
2043e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com    return CONNECTION_4G;
2053e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
2063e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  if (type != shill::kTypeCellular)
2073e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com    return CONNECTION_UNKNOWN;
20810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
20910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  // For cellular types, mapping depends on the technology.
2103e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  if (technology == shill::kNetworkTechnologyEvdo ||
21110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com      technology == shill::kNetworkTechnologyGsm ||
2123e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com      technology == shill::kNetworkTechnologyUmts ||
21310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com      technology == shill::kNetworkTechnologyHspa) {
21410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    return CONNECTION_3G;
21510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  } else if (technology == shill::kNetworkTechnologyHspaPlus ||
21610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com             technology == shill::kNetworkTechnologyLte ||
21710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com             technology == shill::kNetworkTechnologyLteAdvanced) {
21810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    return CONNECTION_4G;
21910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  } else {
22010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com    return CONNECTION_2G;  // Default cellular type is 2G.
22110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  }
22210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com}
22310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
22410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com// static
22510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.comnet::NetworkChangeNotifier::NetworkChangeCalculatorParams
22610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.comNetworkChangeNotifierChromeos::NetworkChangeCalculatorParamsChromeos() {
22710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  NetworkChangeCalculatorParams params;
22810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  // Delay values arrived at by simple experimentation and adjusted so as to
22910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  // produce a single signal when switching between network connections.
23010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  params.ip_address_offline_delay_ = base::TimeDelta::FromMilliseconds(4000);
23110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  params.ip_address_online_delay_ = base::TimeDelta::FromMilliseconds(1000);
23210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  params.connection_type_offline_delay_ =
233fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com      base::TimeDelta::FromMilliseconds(500);
23410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  params.connection_type_online_delay_ = base::TimeDelta::FromMilliseconds(500);
23510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  return params;
23610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com}
23710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
23820f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com}  // namespace chromeos
23920f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com