// Copyright (c) 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/base/logging_network_change_observer.h" #include #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "base/values.h" #include "net/log/net_log.h" #include "net/log/net_log_event_type.h" #if defined(OS_ANDROID) #include "base/android/build_info.h" #endif namespace net { namespace { // Returns a human readable integer from a NetworkHandle. int HumanReadableNetworkHandle(NetworkChangeNotifier::NetworkHandle network) { #if defined(OS_ANDROID) // On Marshmallow, demunge the NetID to undo munging done in java // Network.getNetworkHandle() by shifting away 0xfacade from // http://androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/android/net/Network.java#385 if (base::android::BuildInfo::GetInstance()->sdk_int() >= base::android::SDK_VERSION_MARSHMALLOW) { return network >> 32; } #endif return network; } // Return a dictionary of values that provide information about a // network-specific change. This also includes relevant current state // like the default network, and the types of active networks. std::unique_ptr NetworkSpecificNetLogCallback( NetworkChangeNotifier::NetworkHandle network, NetLogCaptureMode capture_mode) { std::unique_ptr dict(new base::DictionaryValue()); dict->SetInteger("changed_network_handle", HumanReadableNetworkHandle(network)); dict->SetString( "changed_network_type", NetworkChangeNotifier::ConnectionTypeToString( NetworkChangeNotifier::GetNetworkConnectionType(network))); dict->SetInteger( "default_active_network_handle", HumanReadableNetworkHandle(NetworkChangeNotifier::GetDefaultNetwork())); NetworkChangeNotifier::NetworkList networks; NetworkChangeNotifier::GetConnectedNetworks(&networks); for (NetworkChangeNotifier::NetworkHandle active_network : networks) { dict->SetString( "current_active_networks." + base::IntToString(HumanReadableNetworkHandle(active_network)), NetworkChangeNotifier::ConnectionTypeToString( NetworkChangeNotifier::GetNetworkConnectionType(active_network))); } return std::move(dict); } } // namespace LoggingNetworkChangeObserver::LoggingNetworkChangeObserver(NetLog* net_log) : net_log_(net_log) { NetworkChangeNotifier::AddIPAddressObserver(this); NetworkChangeNotifier::AddConnectionTypeObserver(this); NetworkChangeNotifier::AddNetworkChangeObserver(this); if (NetworkChangeNotifier::AreNetworkHandlesSupported()) NetworkChangeNotifier::AddNetworkObserver(this); } LoggingNetworkChangeObserver::~LoggingNetworkChangeObserver() { NetworkChangeNotifier::RemoveIPAddressObserver(this); NetworkChangeNotifier::RemoveConnectionTypeObserver(this); NetworkChangeNotifier::RemoveNetworkChangeObserver(this); if (NetworkChangeNotifier::AreNetworkHandlesSupported()) NetworkChangeNotifier::RemoveNetworkObserver(this); } void LoggingNetworkChangeObserver::OnIPAddressChanged() { VLOG(1) << "Observed a change to the network IP addresses"; net_log_->AddGlobalEntry(NetLogEventType::NETWORK_IP_ADDRESSES_CHANGED); } void LoggingNetworkChangeObserver::OnConnectionTypeChanged( NetworkChangeNotifier::ConnectionType type) { std::string type_as_string = NetworkChangeNotifier::ConnectionTypeToString(type); VLOG(1) << "Observed a change to network connectivity state " << type_as_string; net_log_->AddGlobalEntry( NetLogEventType::NETWORK_CONNECTIVITY_CHANGED, NetLog::StringCallback("new_connection_type", &type_as_string)); } void LoggingNetworkChangeObserver::OnNetworkChanged( NetworkChangeNotifier::ConnectionType type) { std::string type_as_string = NetworkChangeNotifier::ConnectionTypeToString(type); VLOG(1) << "Observed a network change to state " << type_as_string; net_log_->AddGlobalEntry( NetLogEventType::NETWORK_CHANGED, NetLog::StringCallback("new_connection_type", &type_as_string)); } void LoggingNetworkChangeObserver::OnNetworkConnected( NetworkChangeNotifier::NetworkHandle network) { VLOG(1) << "Observed network " << network << " connect"; net_log_->AddGlobalEntry(NetLogEventType::SPECIFIC_NETWORK_CONNECTED, base::Bind(&NetworkSpecificNetLogCallback, network)); } void LoggingNetworkChangeObserver::OnNetworkDisconnected( NetworkChangeNotifier::NetworkHandle network) { VLOG(1) << "Observed network " << network << " disconnect"; net_log_->AddGlobalEntry(NetLogEventType::SPECIFIC_NETWORK_DISCONNECTED, base::Bind(&NetworkSpecificNetLogCallback, network)); } void LoggingNetworkChangeObserver::OnNetworkSoonToDisconnect( NetworkChangeNotifier::NetworkHandle network) { VLOG(1) << "Observed network " << network << " soon to disconnect"; net_log_->AddGlobalEntry(NetLogEventType::SPECIFIC_NETWORK_SOON_TO_DISCONNECT, base::Bind(&NetworkSpecificNetLogCallback, network)); } void LoggingNetworkChangeObserver::OnNetworkMadeDefault( NetworkChangeNotifier::NetworkHandle network) { VLOG(1) << "Observed network " << network << " made the default network"; net_log_->AddGlobalEntry(NetLogEventType::SPECIFIC_NETWORK_MADE_DEFAULT, base::Bind(&NetworkSpecificNetLogCallback, network)); } } // namespace net