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