Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Unified Diff: webrtc/base/network.cc

Issue 1535943004: Multi-networking with Android L. Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/base/network.h ('k') | webrtc/base/networkmonitor.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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: {
« no previous file with comments | « webrtc/base/network.h ('k') | webrtc/base/networkmonitor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698