| // 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 <string> |
| |
| #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<base::Value> NetworkSpecificNetLogCallback( |
| NetworkChangeNotifier::NetworkHandle network, |
| NetLogCaptureMode capture_mode) { |
| std::unique_ptr<base::DictionaryValue> 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 |