// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include #include "base/bind.h" #include "base/task/task_traits.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "net/base/network_change_notifier_posix.h" #include "net/dns/dns_config_service_posix.h" #include "net/dns/system_dns_config_change_notifier.h" #if BUILDFLAG(IS_ANDROID) #include "net/android/network_change_notifier_android.h" #endif namespace net { NetworkChangeNotifierPosix::NetworkChangeNotifierPosix( NetworkChangeNotifier::ConnectionType initial_connection_type, NetworkChangeNotifier::ConnectionSubtype initial_connection_subtype) : NetworkChangeNotifierPosix(initial_connection_type, initial_connection_subtype, /*system_dns_config_notifier=*/nullptr) {} NetworkChangeNotifierPosix::NetworkChangeNotifierPosix( NetworkChangeNotifier::ConnectionType initial_connection_type, NetworkChangeNotifier::ConnectionSubtype initial_connection_subtype, SystemDnsConfigChangeNotifier* system_dns_config_notifier) : NetworkChangeNotifier(NetworkChangeCalculatorParamsPosix(), system_dns_config_notifier), connection_type_(initial_connection_type), max_bandwidth_mbps_( NetworkChangeNotifier::GetMaxBandwidthMbpsForConnectionSubtype( initial_connection_subtype)) {} NetworkChangeNotifierPosix::~NetworkChangeNotifierPosix() { ClearGlobalPointer(); } void NetworkChangeNotifierPosix::OnDNSChanged() { GetCurrentSystemDnsConfigNotifier()->RefreshConfig(); } void NetworkChangeNotifierPosix::OnIPAddressChanged() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); NetworkChangeNotifier::NotifyObserversOfIPAddressChange(); } void NetworkChangeNotifierPosix::OnConnectionChanged( NetworkChangeNotifier::ConnectionType connection_type) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); { base::AutoLock scoped_lock(lock_); connection_type_ = connection_type; } NetworkChangeNotifier::NotifyObserversOfConnectionTypeChange(); } void NetworkChangeNotifierPosix::OnConnectionSubtypeChanged( NetworkChangeNotifier::ConnectionType connection_type, NetworkChangeNotifier::ConnectionSubtype connection_subtype) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); double max_bandwidth_mbps = GetMaxBandwidthMbpsForConnectionSubtype(connection_subtype); { base::AutoLock scoped_lock(lock_); max_bandwidth_mbps_ = max_bandwidth_mbps; } NetworkChangeNotifier::NotifyObserversOfMaxBandwidthChange(max_bandwidth_mbps, connection_type); } NetworkChangeNotifier::ConnectionType NetworkChangeNotifierPosix::GetCurrentConnectionType() const { base::AutoLock scoped_lock(lock_); return connection_type_; } void NetworkChangeNotifierPosix::GetCurrentMaxBandwidthAndConnectionType( double* max_bandwidth_mbps, ConnectionType* connection_type) const { base::AutoLock scoped_lock(lock_); *connection_type = connection_type_; *max_bandwidth_mbps = max_bandwidth_mbps_; } // static NetworkChangeNotifier::NetworkChangeCalculatorParams NetworkChangeNotifierPosix::NetworkChangeCalculatorParamsPosix() { NetworkChangeCalculatorParams params; #if BUILDFLAG(IS_CHROMEOS) // Delay values arrived at by simple experimentation and adjusted so as to // produce a single signal when switching between network connections. params.ip_address_offline_delay_ = base::Milliseconds(4000); params.ip_address_online_delay_ = base::Milliseconds(1000); params.connection_type_offline_delay_ = base::Milliseconds(500); params.connection_type_online_delay_ = base::Milliseconds(500); #elif BUILDFLAG(IS_ANDROID) params = net::NetworkChangeNotifierAndroid::NetworkChangeCalculatorParamsAndroid(); #else NOTIMPLEMENTED(); #endif return params; } } // namespace net