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

Unified Diff: webrtc/base/network.cc

Issue 1411253008: WebRTC should generate default private address even when adapter enumeration is disabled. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: change the signature of GetDefaultPrivateAddress Created 5 years, 2 months 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
Index: webrtc/base/network.cc
diff --git a/webrtc/base/network.cc b/webrtc/base/network.cc
index 879c1e4529d9f560e0b550795dc7f4826a5ae9d1..effc3afc5513f1ea3540f09f86b9e6cf1b27095b 100644
--- a/webrtc/base/network.cc
+++ b/webrtc/base/network.cc
@@ -151,6 +151,9 @@ bool IsIgnoredIPv6(const IPAddress& ip) {
} // namespace
+char kPublicIPv4Host[] = "8.8.8.8";
juberti 2015/10/28 23:57:40 const char. This also needs explanatory comments.
guoweis_webrtc 2015/10/29 03:41:00 Done.
+char kPublicIPv6Host[] = "2001:4860:4860::8888";
+
std::string MakeNetworkKey(const std::string& name, const IPAddress& prefix,
int prefix_length) {
std::ostringstream ost;
@@ -169,6 +172,11 @@ NetworkManager::EnumerationPermission NetworkManager::enumeration_permission()
return ENUMERATION_ALLOWED;
}
+bool NetworkManager::GetDefaultPrivateAddress(int family,
+ IPAddress* addr) const {
+ return false;
+}
+
NetworkManagerBase::NetworkManagerBase()
: enumeration_permission_(NetworkManager::ENUMERATION_ALLOWED),
max_ipv6_networks_(kMaxIPv6Networks),
@@ -191,6 +199,7 @@ void NetworkManagerBase::GetAnyAddressNetworks(NetworkList* networks) {
const rtc::IPAddress ipv4_any_address(INADDR_ANY);
ipv4_any_address_network_.reset(
new rtc::Network("any", "any", ipv4_any_address, 0));
+ ipv4_any_address_network_->set_default_address_provider(this);
ipv4_any_address_network_->AddIP(ipv4_any_address);
}
networks->push_back(ipv4_any_address_network_.get());
@@ -200,6 +209,7 @@ void NetworkManagerBase::GetAnyAddressNetworks(NetworkList* networks) {
const rtc::IPAddress ipv6_any_address(in6addr_any);
ipv6_any_address_network_.reset(
new rtc::Network("any", "any", ipv6_any_address, 0));
+ ipv6_any_address_network_->set_default_address_provider(this);
ipv6_any_address_network_->AddIP(ipv6_any_address);
}
networks->push_back(ipv6_any_address_network_.get());
@@ -321,6 +331,26 @@ void NetworkManagerBase::MergeNetworkList(const NetworkList& new_networks,
}
}
+void NetworkManagerBase::set_default_private_address(const IPAddress& ip) {
+ if (ip.family() == AF_INET) {
+ default_ipv4_address_ = ip;
+ } else if (ip.family() == AF_INET6) {
+ default_ipv6_address_ = ip;
+ }
+}
+
+bool NetworkManagerBase::GetDefaultPrivateAddress(int family,
+ IPAddress* ipaddr) const {
+ if (family == AF_INET) {
+ *ipaddr = default_ipv4_address_;
+ return true;
+ } else if (family == AF_INET6) {
+ *ipaddr = default_ipv6_address_;
+ return true;
+ }
+ return false;
+}
+
BasicNetworkManager::BasicNetworkManager()
: thread_(NULL), sent_first_update_(false), start_count_(0),
network_ignore_mask_(kDefaultNetworkIgnoreMask),
@@ -409,10 +439,9 @@ void BasicNetworkManager::ConvertIfAddrs(struct ifaddrs* interfaces,
#endif
// TODO(phoglund): Need to recognize other types as well.
scoped_ptr<Network> network(new Network(cursor->ifa_name,
- cursor->ifa_name,
- prefix,
- prefix_length,
- adapter_type));
+ cursor->ifa_name, prefix,
+ prefix_length, adapter_type));
+ network->set_default_address_provider(this);
network->set_scope_id(scope_id);
network->AddIP(ip);
network->set_ignored(IsIgnoredNetwork(*network));
@@ -563,11 +592,9 @@ bool BasicNetworkManager::CreateNetworks(bool include_ignored,
// TODO(phoglund): Need to recognize other types as well.
adapter_type = ADAPTER_TYPE_LOOPBACK;
}
- scoped_ptr<Network> network(new Network(name,
- description,
- prefix,
- prefix_length,
- adapter_type));
+ scoped_ptr<Network> network(new Network(name, description, prefix,
+ prefix_length, adapter_type));
+ network->set_default_address_provider(this);
network->set_scope_id(scope_id);
network->AddIP(ip);
bool ignored = IsIgnoredNetwork(*network);
@@ -724,6 +751,22 @@ void BasicNetworkManager::OnMessage(Message* msg) {
}
}
+IPAddress BasicNetworkManager::UpdateDefaultPrivateAddress(int family) {
juberti 2015/10/28 23:57:40 This isn't really an Update, since it doesn't chan
guoweis_webrtc 2015/10/29 03:41:00 renamed as QueryDefaultAddress
+ ASSERT(thread_ == Thread::Current());
+ ASSERT(thread_->socketserver() != nullptr);
+ ASSERT(family == AF_INET || family == AF_INET6);
+
+ scoped_ptr<AsyncSocket> socket(
+ thread_->socketserver()->CreateAsyncSocket(family, SOCK_DGRAM));
+ if (socket && socket->Bind(SocketAddress(GetWildcardIP(family), 0)) == 0 &&
+ socket->Connect(SocketAddress(
+ family == AF_INET ? kPublicIPv4Host : kPublicIPv6Host, 3478)) == 0) {
juberti 2015/10/28 23:57:40 3478 should be a constant as well. I would pick th
guoweis_webrtc 2015/10/29 03:41:00 Done.
+ return socket->GetLocalAddress().ipaddr();
juberti 2015/10/28 23:57:40 Not sure this will work in Chromium, where GetLoca
guoweis_webrtc 2015/10/29 03:41:00 Not an issue since IpcNetworkManager will be used
+ }
+
+ return IPAddress();
+}
+
void BasicNetworkManager::UpdateNetworksOnce() {
if (!start_count_)
return;
@@ -735,7 +778,14 @@ void BasicNetworkManager::UpdateNetworksOnce() {
SignalError();
} else {
bool changed;
- MergeNetworkList(list, &changed);
+ NetworkManager::Stats stats;
+ MergeNetworkList(list, &changed, &stats);
+ if (stats.ipv6_network_count) {
+ set_default_private_address(UpdateDefaultPrivateAddress(AF_INET6));
+ }
+ if (stats.ipv4_network_count) {
+ set_default_private_address(UpdateDefaultPrivateAddress(AF_INET));
+ }
if (changed || !sent_first_update_) {
SignalNetworksChanged();
sent_first_update_ = true;
@@ -766,21 +816,34 @@ void BasicNetworkManager::DumpNetworks(bool include_ignored) {
}
}
-Network::Network(const std::string& name, const std::string& desc,
- const IPAddress& prefix, int prefix_length)
- : name_(name), description_(desc), prefix_(prefix),
+Network::Network(const std::string& name,
+ const std::string& desc,
+ const IPAddress& prefix,
+ int prefix_length)
+ : name_(name),
+ description_(desc),
+ prefix_(prefix),
prefix_length_(prefix_length),
- key_(MakeNetworkKey(name, prefix, prefix_length)), scope_id_(0),
- ignored_(false), type_(ADAPTER_TYPE_UNKNOWN), preference_(0) {
-}
-
-Network::Network(const std::string& name, const std::string& desc,
- const IPAddress& prefix, int prefix_length, AdapterType type)
- : name_(name), description_(desc), prefix_(prefix),
+ key_(MakeNetworkKey(name, prefix, prefix_length)),
+ scope_id_(0),
+ ignored_(false),
+ type_(ADAPTER_TYPE_UNKNOWN),
+ preference_(0) {}
+
+Network::Network(const std::string& name,
+ const std::string& desc,
+ const IPAddress& prefix,
+ int prefix_length,
+ AdapterType type)
+ : name_(name),
+ description_(desc),
+ prefix_(prefix),
prefix_length_(prefix_length),
- key_(MakeNetworkKey(name, prefix, prefix_length)), scope_id_(0),
- ignored_(false), type_(type), preference_(0) {
-}
+ key_(MakeNetworkKey(name, prefix, prefix_length)),
+ scope_id_(0),
+ ignored_(false),
+ type_(type),
+ preference_(0) {}
Network::~Network() = default;

Powered by Google App Engine
This is Rietveld 408576698