// 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 "net/base/network_change_notifier_passive.h" #include #include #include #include "base/functional/bind.h" #include "base/task/task_traits.h" #include "build/build_config.h" #include "build/chromeos_buildflags.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 #if BUILDFLAG(IS_LINUX) #include #include "net/base/network_change_notifier_linux.h" #endif namespace net { NetworkChangeNotifierPassive::NetworkChangeNotifierPassive( NetworkChangeNotifier::ConnectionType initial_connection_type, NetworkChangeNotifier::ConnectionSubtype initial_connection_subtype) : NetworkChangeNotifierPassive(initial_connection_type, initial_connection_subtype, /*system_dns_config_notifier=*/nullptr) {} NetworkChangeNotifierPassive::NetworkChangeNotifierPassive( NetworkChangeNotifier::ConnectionType initial_connection_type, NetworkChangeNotifier::ConnectionSubtype initial_connection_subtype, SystemDnsConfigChangeNotifier* system_dns_config_notifier) : NetworkChangeNotifier(NetworkChangeCalculatorParamsPassive(), system_dns_config_notifier), connection_type_(initial_connection_type), max_bandwidth_mbps_( NetworkChangeNotifier::GetMaxBandwidthMbpsForConnectionSubtype( initial_connection_subtype)) {} NetworkChangeNotifierPassive::~NetworkChangeNotifierPassive() { ClearGlobalPointer(); } void NetworkChangeNotifierPassive::OnDNSChanged() { GetCurrentSystemDnsConfigNotifier()->RefreshConfig(); } void NetworkChangeNotifierPassive::OnIPAddressChanged() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); NetworkChangeNotifier::NotifyObserversOfIPAddressChange(); } void NetworkChangeNotifierPassive::OnConnectionChanged( NetworkChangeNotifier::ConnectionType connection_type) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); { base::AutoLock scoped_lock(lock_); connection_type_ = connection_type; } NetworkChangeNotifier::NotifyObserversOfConnectionTypeChange(); } void NetworkChangeNotifierPassive::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 NetworkChangeNotifierPassive::GetCurrentConnectionType() const { base::AutoLock scoped_lock(lock_); return connection_type_; } void NetworkChangeNotifierPassive::GetCurrentMaxBandwidthAndConnectionType( double* max_bandwidth_mbps, ConnectionType* connection_type) const { base::AutoLock scoped_lock(lock_); *connection_type = connection_type_; *max_bandwidth_mbps = max_bandwidth_mbps_; } #if BUILDFLAG(IS_LINUX) AddressMapOwnerLinux* NetworkChangeNotifierPassive::GetAddressMapOwnerInternal() { return &address_map_cache_; } #endif // static NetworkChangeNotifier::NetworkChangeCalculatorParams NetworkChangeNotifierPassive::NetworkChangeCalculatorParamsPassive() { 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 = NetworkChangeNotifierAndroid::NetworkChangeCalculatorParamsAndroid(); #elif BUILDFLAG(IS_LINUX) params = NetworkChangeNotifierLinux::NetworkChangeCalculatorParamsLinux(); #else NOTIMPLEMENTED(); #endif return params; } } // namespace net