Index: webrtc/base/network.cc |
diff --git a/webrtc/base/network.cc b/webrtc/base/network.cc |
index b6caaa8bbf0fed426269db828dfddca8ecea2a99..5031e967a5b4c0fc7b128369732968ea5c2bae0d 100644 |
--- a/webrtc/base/network.cc |
+++ b/webrtc/base/network.cc |
@@ -292,6 +292,11 @@ void NetworkManagerBase::MergeNetworkList(const NetworkList& new_networks, |
Network* existing_net = existing->second; |
*changed = existing_net->SetIPs(kv.second.ips, *changed); |
merged_list.push_back(existing_net); |
+ if (net->type() != ADAPTER_TYPE_UNKNOWN && |
+ net->type() != existing_net->type()) { |
+ existing_net->set_type(net->type()); |
+ *changed = true; |
+ } |
// If the existing network was not active, networks have changed. |
if (!existing_net->active()) { |
*changed = true; |
@@ -394,7 +399,7 @@ BasicNetworkManager::~BasicNetworkManager() { |
} |
void BasicNetworkManager::OnNetworksChanged() { |
- LOG(LS_VERBOSE) << "Network change was observed at the network manager"; |
+ LOG(LS_INFO) << "Network change was observed"; |
UpdateNetworksOnce(); |
} |
@@ -452,24 +457,18 @@ void BasicNetworkManager::ConvertIfAddrs(struct ifaddrs* interfaces, |
reinterpret_cast<sockaddr_in6*>(cursor->ifa_addr)->sin6_scope_id; |
} |
+ AdapterType adapter_type = ADAPTER_TYPE_UNKNOWN; |
+ if (cursor->ifa_flags & IFF_LOOPBACK) { |
+ adapter_type = ADAPTER_TYPE_LOOPBACK; |
+ } else { |
+ adapter_type = GetAdapterTypeFromName(cursor->ifa_name); |
+ } |
int prefix_length = CountIPMaskBits(mask); |
prefix = TruncateIP(ip, prefix_length); |
std::string key = MakeNetworkKey(std::string(cursor->ifa_name), |
prefix, prefix_length); |
- auto existing_network = current_networks.find(key); |
- if (existing_network == current_networks.end()) { |
- AdapterType adapter_type = ADAPTER_TYPE_UNKNOWN; |
- if (cursor->ifa_flags & IFF_LOOPBACK) { |
- adapter_type = ADAPTER_TYPE_LOOPBACK; |
- } else if (network_monitor_) { |
- adapter_type = network_monitor_->GetAdapterType(cursor->ifa_name); |
- } |
-#if defined(WEBRTC_IOS) |
- // Cell networks are pdp_ipN on iOS. |
- if (strncmp(cursor->ifa_name, "pdp_ip", 6) == 0) { |
- adapter_type = ADAPTER_TYPE_CELLULAR; |
- } |
-#endif |
+ auto iter = current_networks.find(key); |
+ if (iter == current_networks.end()) { |
// TODO(phoglund): Need to recognize other types as well. |
std::unique_ptr<Network> network( |
new Network(cursor->ifa_name, cursor->ifa_name, prefix, prefix_length, |
@@ -483,7 +482,11 @@ void BasicNetworkManager::ConvertIfAddrs(struct ifaddrs* interfaces, |
networks->push_back(network.release()); |
} |
} else { |
- (*existing_network).second->AddIP(ip); |
+ Network* existing_network = iter->second; |
+ existing_network->AddIP(ip); |
+ if (adapter_type != ADAPTER_TYPE_UNKNOWN) { |
+ existing_network->set_type(adapter_type); |
+ } |
} |
} |
} |
@@ -787,6 +790,34 @@ void BasicNetworkManager::OnMessage(Message* msg) { |
} |
} |
+AdapterType BasicNetworkManager::GetAdapterTypeFromName( |
+ const char* network_name) const { |
+ // If there is a network_monitor, use it to get the adapter type. |
+ // Otherwise, get the adapter type based on a few name matching rules. |
+ if (network_monitor_) { |
+ AdapterType type = network_monitor_->GetAdapterType(network_name); |
+ if (type != ADAPTER_TYPE_UNKNOWN) { |
+ return type; |
+ } |
+ } |
+#if defined(WEBRTC_IOS) |
+ // Cell networks are pdp_ipN on iOS. |
+ if (strncmp(network_name, "pdp_ip", 6) == 0) { |
+ return ADAPTER_TYPE_CELLULAR; |
+ } |
+#elif defined(WEBRTC_ANDROID) |
+ if (strncmp(network_name, "rmnet", 5) == 0 || |
+ strncmp(network_name, "v4-rmnet", 8) == 0) { |
+ return ADAPTER_TYPE_CELLULAR; |
+ } |
+ if (strncmp(network_name, "wlan", 4) == 0) { |
+ return ADAPTER_TYPE_WIFI; |
+ } |
+#endif |
+ |
+ return ADAPTER_TYPE_UNKNOWN; |
+} |
+ |
IPAddress BasicNetworkManager::QueryDefaultLocalAddress(int family) const { |
ASSERT(thread_ == Thread::Current()); |
ASSERT(thread_->socketserver() != nullptr); |