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; |