Index: webrtc/base/network.cc |
diff --git a/webrtc/base/network.cc b/webrtc/base/network.cc |
index 678541d0b11025b0d8e17023828cc479c000026b..9e4be58fcbf0d4c6170a57e54c5872020b071884 100644 |
--- a/webrtc/base/network.cc |
+++ b/webrtc/base/network.cc |
@@ -129,6 +129,27 @@ std::string AdapterTypeToString(AdapterType type) { |
} |
} |
+AdapterType FromNetworkType(NetworkType network_type) { |
+ switch (network_type) { |
+ case NETWORK_UNKNOWN: |
+ return ADAPTER_TYPE_UNKNOWN; |
+ case NETWORK_ETHERNET: |
+ return ADAPTER_TYPE_ETHERNET; |
+ case NETWORK_WIFI: |
+ return ADAPTER_TYPE_WIFI; |
+ case NETWORK_4G: |
+ case NETWORK_3G: |
+ case NETWORK_2G: |
+ return ADAPTER_TYPE_CELLULAR; |
+ case NETWORK_BLUETOOTH: |
+ case NETWORK_NONE: |
+ return ADAPTER_TYPE_LOOPBACK; |
+ default: |
+ RTC_DCHECK(false) << "Invalid network type " << network_type; |
+ return ADAPTER_TYPE_UNKNOWN; |
+ } |
+} |
+ |
bool IsIgnoredIPv6(const IPAddress& ip) { |
if (ip.family() != AF_INET6) { |
return false; |
@@ -355,6 +376,35 @@ bool NetworkManagerBase::GetDefaultLocalAddress(int family, |
return false; |
} |
+void BasicNetworkManager::GetAndUpdateNetworkInfos() { |
+ std::vector<NetworkInformation> network_infos; |
+ LOG(LS_INFO) << "start to get network info"; |
+ if (network_monitor_->GetAllNetworkInfos(&network_infos)) { |
+ LOG(LS_INFO) << "done to get network info"; |
+ network_infos_.clear(); |
+ for (NetworkInformation& network_info : network_infos) { |
+ network_infos_[network_info.interface_name] = network_info; |
+ } |
+ for (auto kv : networks_map()) { |
+ UpdateNetworkInfo(kv.second); |
+ } |
+ LOG(LS_INFO) << "done to update network info"; |
+ } |
+} |
+ |
+void BasicNetworkManager::UpdateNetworkInfo(Network* network) const { |
+ auto it = network_infos_.find(network->name()); |
+ if (it != network_infos_.end()) { |
+ const NetworkInformation& network_info = it->second; |
+ network->set_handle(network_info.handle); |
+ network->set_type(FromNetworkType(network_info.type)); |
+ LOG(LS_INFO) << "Set network " << network->ToString() |
+ << " handle " << network->handle() |
+ << " type " << network->type(); |
+ } |
+} |
+ |
+ |
BasicNetworkManager::BasicNetworkManager() |
: thread_(NULL), sent_first_update_(false), start_count_(0), |
network_ignore_mask_(kDefaultNetworkIgnoreMask), |
@@ -366,9 +416,21 @@ BasicNetworkManager::~BasicNetworkManager() { |
void BasicNetworkManager::OnNetworksChanged() { |
LOG(LS_VERBOSE) << "Network change was observed at the network manager"; |
+ std::vector<NetworkInformation> network_infos; |
+ |
UpdateNetworksOnce(); |
} |
+void BasicNetworkManager::OnNetworkAvailable(const NetworkInformation& network_info) { |
+ LOG(LS_VERBOSE) << "Network available at network manager: " << network_info.interface_name; |
+ ASSERT(Thread::Current() == thread_); |
+ network_infos_[network_info.interface_name] = network_info; |
+ // Only need to update one. |
+ for (auto kv : networks_map()) { |
+ UpdateNetworkInfo(kv.second); |
+ } |
+} |
+ |
#if defined(__native_client__) |
bool BasicNetworkManager::CreateNetworks(bool include_ignored, |
@@ -449,6 +511,7 @@ void BasicNetworkManager::ConvertIfAddrs(struct ifaddrs* interfaces, |
network->set_scope_id(scope_id); |
network->AddIP(ip); |
network->set_ignored(IsIgnoredNetwork(*network)); |
+ UpdateNetworkInfo(network.get()); |
if (include_ignored || !network->ignored()) { |
networks->push_back(network.release()); |
} |
@@ -727,9 +790,14 @@ void BasicNetworkManager::StartNetworkMonitor() { |
if (!network_monitor_) { |
return; |
} |
+ |
network_monitor_->SignalNetworksChanged.connect( |
this, &BasicNetworkManager::OnNetworksChanged); |
+ network_monitor_->SignalNetworkAvailable.connect( |
+ this, &BasicNetworkManager::OnNetworkAvailable); |
network_monitor_->Start(); |
+ |
+ GetAndUpdateNetworkInfos(); |
} |
void BasicNetworkManager::StopNetworkMonitor() { |
@@ -740,6 +808,7 @@ void BasicNetworkManager::StopNetworkMonitor() { |
network_monitor_.reset(); |
} |
+ |
void BasicNetworkManager::OnMessage(Message* msg) { |
switch (msg->message_id) { |
case kUpdateNetworksMessage: { |