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