Chromium Code Reviews| 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; |