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

Side by Side 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: rename set_default_private_address to set_default_local_address Created 5 years, 1 month 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 // Any MAC based IPv6 should be avoided to prevent the MAC tracking. 144 // Any MAC based IPv6 should be avoided to prevent the MAC tracking.
145 if (IPIsMacBased(ip)) { 145 if (IPIsMacBased(ip)) {
146 return true; 146 return true;
147 } 147 }
148 148
149 return false; 149 return false;
150 } 150 }
151 151
152 } // namespace 152 } // namespace
153 153
154 // These addresses are used as the targets to find out the default local address
155 // on a multi-homed endpoint. They are actually DNS servers.
156 const char kPublicIPv4Host[] = "8.8.8.8";
157 const char kPublicIPv6Host[] = "2001:4860:4860::8888";
158 const int kPublicPort = 53; // DNS port.
159
154 std::string MakeNetworkKey(const std::string& name, const IPAddress& prefix, 160 std::string MakeNetworkKey(const std::string& name, const IPAddress& prefix,
155 int prefix_length) { 161 int prefix_length) {
156 std::ostringstream ost; 162 std::ostringstream ost;
157 ost << name << "%" << prefix.ToString() << "/" << prefix_length; 163 ost << name << "%" << prefix.ToString() << "/" << prefix_length;
158 return ost.str(); 164 return ost.str();
159 } 165 }
160 166
161 NetworkManager::NetworkManager() { 167 NetworkManager::NetworkManager() {
162 } 168 }
163 169
164 NetworkManager::~NetworkManager() { 170 NetworkManager::~NetworkManager() {
165 } 171 }
166 172
167 NetworkManager::EnumerationPermission NetworkManager::enumeration_permission() 173 NetworkManager::EnumerationPermission NetworkManager::enumeration_permission()
168 const { 174 const {
169 return ENUMERATION_ALLOWED; 175 return ENUMERATION_ALLOWED;
170 } 176 }
171 177
178 bool NetworkManager::GetDefaultLocalAddress(int family, IPAddress* addr) const {
179 return false;
180 }
181
172 NetworkManagerBase::NetworkManagerBase() 182 NetworkManagerBase::NetworkManagerBase()
173 : enumeration_permission_(NetworkManager::ENUMERATION_ALLOWED), 183 : enumeration_permission_(NetworkManager::ENUMERATION_ALLOWED),
174 max_ipv6_networks_(kMaxIPv6Networks), 184 max_ipv6_networks_(kMaxIPv6Networks),
175 ipv6_enabled_(true) { 185 ipv6_enabled_(true) {
176 } 186 }
177 187
178 NetworkManagerBase::~NetworkManagerBase() { 188 NetworkManagerBase::~NetworkManagerBase() {
179 for (const auto& kv : networks_map_) { 189 for (const auto& kv : networks_map_) {
180 delete kv.second; 190 delete kv.second;
181 } 191 }
182 } 192 }
183 193
184 NetworkManager::EnumerationPermission 194 NetworkManager::EnumerationPermission
185 NetworkManagerBase::enumeration_permission() const { 195 NetworkManagerBase::enumeration_permission() const {
186 return enumeration_permission_; 196 return enumeration_permission_;
187 } 197 }
188 198
189 void NetworkManagerBase::GetAnyAddressNetworks(NetworkList* networks) { 199 void NetworkManagerBase::GetAnyAddressNetworks(NetworkList* networks) {
190 if (!ipv4_any_address_network_) { 200 if (!ipv4_any_address_network_) {
191 const rtc::IPAddress ipv4_any_address(INADDR_ANY); 201 const rtc::IPAddress ipv4_any_address(INADDR_ANY);
192 ipv4_any_address_network_.reset( 202 ipv4_any_address_network_.reset(
193 new rtc::Network("any", "any", ipv4_any_address, 0)); 203 new rtc::Network("any", "any", ipv4_any_address, 0));
204 ipv4_any_address_network_->set_default_address_provider(this);
pthatcher1 2015/11/10 18:52:34 Why not just set the provider at the very beginnin
guoweis_webrtc 2015/11/10 20:37:29 Because chromium code calls the constructor as wel
194 ipv4_any_address_network_->AddIP(ipv4_any_address); 205 ipv4_any_address_network_->AddIP(ipv4_any_address);
195 } 206 }
196 networks->push_back(ipv4_any_address_network_.get()); 207 networks->push_back(ipv4_any_address_network_.get());
197 208
198 if (ipv6_enabled()) { 209 if (ipv6_enabled()) {
199 if (!ipv6_any_address_network_) { 210 if (!ipv6_any_address_network_) {
200 const rtc::IPAddress ipv6_any_address(in6addr_any); 211 const rtc::IPAddress ipv6_any_address(in6addr_any);
201 ipv6_any_address_network_.reset( 212 ipv6_any_address_network_.reset(
202 new rtc::Network("any", "any", ipv6_any_address, 0)); 213 new rtc::Network("any", "any", ipv6_any_address, 0));
214 ipv6_any_address_network_->set_default_address_provider(this);
203 ipv6_any_address_network_->AddIP(ipv6_any_address); 215 ipv6_any_address_network_->AddIP(ipv6_any_address);
204 } 216 }
205 networks->push_back(ipv6_any_address_network_.get()); 217 networks->push_back(ipv6_any_address_network_.get());
206 } 218 }
207 } 219 }
208 220
209 void NetworkManagerBase::GetNetworks(NetworkList* result) const { 221 void NetworkManagerBase::GetNetworks(NetworkList* result) const {
210 int ipv6_networks = 0; 222 int ipv6_networks = 0;
211 result->clear(); 223 result->clear();
212 for (Network* network : networks_) { 224 for (Network* network : networks_) {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 if (pref > 0) { 326 if (pref > 0) {
315 --pref; 327 --pref;
316 } else { 328 } else {
317 LOG(LS_ERROR) << "Too many network interfaces to handle!"; 329 LOG(LS_ERROR) << "Too many network interfaces to handle!";
318 break; 330 break;
319 } 331 }
320 } 332 }
321 } 333 }
322 } 334 }
323 335
336 void NetworkManagerBase::set_default_local_address(const IPAddress& ip) {
337 if (ip.family() == AF_INET) {
338 default_ipv4_address_ = ip;
339 } else if (ip.family() == AF_INET6) {
340 default_ipv6_address_ = ip;
341 }
342 }
343
344 bool NetworkManagerBase::GetDefaultLocalAddress(int family,
345 IPAddress* ipaddr) const {
346 if (family == AF_INET) {
347 *ipaddr = default_ipv4_address_;
348 return true;
349 } else if (family == AF_INET6) {
350 *ipaddr = default_ipv6_address_;
351 return true;
352 }
353 return false;
354 }
355
324 BasicNetworkManager::BasicNetworkManager() 356 BasicNetworkManager::BasicNetworkManager()
325 : thread_(NULL), sent_first_update_(false), start_count_(0), 357 : thread_(NULL), sent_first_update_(false), start_count_(0),
326 network_ignore_mask_(kDefaultNetworkIgnoreMask), 358 network_ignore_mask_(kDefaultNetworkIgnoreMask),
327 ignore_non_default_routes_(false) { 359 ignore_non_default_routes_(false) {
328 } 360 }
329 361
330 BasicNetworkManager::~BasicNetworkManager() { 362 BasicNetworkManager::~BasicNetworkManager() {
331 } 363 }
332 364
333 void BasicNetworkManager::OnNetworksChanged() { 365 void BasicNetworkManager::OnNetworksChanged() {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 adapter_type = ADAPTER_TYPE_LOOPBACK; 434 adapter_type = ADAPTER_TYPE_LOOPBACK;
403 } 435 }
404 #if defined(WEBRTC_IOS) 436 #if defined(WEBRTC_IOS)
405 // Cell networks are pdp_ipN on iOS. 437 // Cell networks are pdp_ipN on iOS.
406 if (strncmp(cursor->ifa_name, "pdp_ip", 6) == 0) { 438 if (strncmp(cursor->ifa_name, "pdp_ip", 6) == 0) {
407 adapter_type = ADAPTER_TYPE_CELLULAR; 439 adapter_type = ADAPTER_TYPE_CELLULAR;
408 } 440 }
409 #endif 441 #endif
410 // TODO(phoglund): Need to recognize other types as well. 442 // TODO(phoglund): Need to recognize other types as well.
411 scoped_ptr<Network> network(new Network(cursor->ifa_name, 443 scoped_ptr<Network> network(new Network(cursor->ifa_name,
412 cursor->ifa_name, 444 cursor->ifa_name, prefix,
413 prefix, 445 prefix_length, adapter_type));
414 prefix_length, 446 network->set_default_address_provider(this);
415 adapter_type));
416 network->set_scope_id(scope_id); 447 network->set_scope_id(scope_id);
417 network->AddIP(ip); 448 network->AddIP(ip);
418 network->set_ignored(IsIgnoredNetwork(*network)); 449 network->set_ignored(IsIgnoredNetwork(*network));
419 if (include_ignored || !network->ignored()) { 450 if (include_ignored || !network->ignored()) {
420 networks->push_back(network.release()); 451 networks->push_back(network.release());
421 } 452 }
422 } else { 453 } else {
423 (*existing_network).second->AddIP(ip); 454 (*existing_network).second->AddIP(ip);
424 } 455 }
425 } 456 }
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 IPAddress prefix; 587 IPAddress prefix;
557 int prefix_length = GetPrefix(prefixlist, ip, &prefix); 588 int prefix_length = GetPrefix(prefixlist, ip, &prefix);
558 std::string key = MakeNetworkKey(name, prefix, prefix_length); 589 std::string key = MakeNetworkKey(name, prefix, prefix_length);
559 auto existing_network = current_networks.find(key); 590 auto existing_network = current_networks.find(key);
560 if (existing_network == current_networks.end()) { 591 if (existing_network == current_networks.end()) {
561 AdapterType adapter_type = ADAPTER_TYPE_UNKNOWN; 592 AdapterType adapter_type = ADAPTER_TYPE_UNKNOWN;
562 if (adapter_addrs->IfType == IF_TYPE_SOFTWARE_LOOPBACK) { 593 if (adapter_addrs->IfType == IF_TYPE_SOFTWARE_LOOPBACK) {
563 // TODO(phoglund): Need to recognize other types as well. 594 // TODO(phoglund): Need to recognize other types as well.
564 adapter_type = ADAPTER_TYPE_LOOPBACK; 595 adapter_type = ADAPTER_TYPE_LOOPBACK;
565 } 596 }
566 scoped_ptr<Network> network(new Network(name, 597 scoped_ptr<Network> network(new Network(name, description, prefix,
567 description, 598 prefix_length, adapter_type));
568 prefix, 599 network->set_default_address_provider(this);
569 prefix_length,
570 adapter_type));
571 network->set_scope_id(scope_id); 600 network->set_scope_id(scope_id);
572 network->AddIP(ip); 601 network->AddIP(ip);
573 bool ignored = IsIgnoredNetwork(*network); 602 bool ignored = IsIgnoredNetwork(*network);
574 network->set_ignored(ignored); 603 network->set_ignored(ignored);
575 if (include_ignored || !network->ignored()) { 604 if (include_ignored || !network->ignored()) {
576 networks->push_back(network.release()); 605 networks->push_back(network.release());
577 } 606 }
578 } else { 607 } else {
579 (*existing_network).second->AddIP(ip); 608 (*existing_network).second->AddIP(ip);
580 } 609 }
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 } 746 }
718 case kSignalNetworksMessage: { 747 case kSignalNetworksMessage: {
719 SignalNetworksChanged(); 748 SignalNetworksChanged();
720 break; 749 break;
721 } 750 }
722 default: 751 default:
723 ASSERT(false); 752 ASSERT(false);
724 } 753 }
725 } 754 }
726 755
756 IPAddress BasicNetworkManager::QueryDefaultAddress(int family) const {
757 ASSERT(thread_ == Thread::Current());
758 ASSERT(thread_->socketserver() != nullptr);
759 ASSERT(family == AF_INET || family == AF_INET6);
760
761 scoped_ptr<AsyncSocket> socket(
762 thread_->socketserver()->CreateAsyncSocket(family, SOCK_DGRAM));
763 if (socket &&
764 socket->Connect(
765 SocketAddress(family == AF_INET ? kPublicIPv4Host : kPublicIPv6Host,
766 kPublicPort)) == 0) {
767 return socket->GetLocalAddress().ipaddr();
768 }
pthatcher1 2015/11/10 18:52:34 It might be more clear as: if (!socket) { retur
guoweis_webrtc 2015/11/10 20:37:29 Done.
769
770 return IPAddress();
771 }
772
727 void BasicNetworkManager::UpdateNetworksOnce() { 773 void BasicNetworkManager::UpdateNetworksOnce() {
728 if (!start_count_) 774 if (!start_count_)
729 return; 775 return;
730 776
731 ASSERT(Thread::Current() == thread_); 777 ASSERT(Thread::Current() == thread_);
732 778
733 NetworkList list; 779 NetworkList list;
734 if (!CreateNetworks(false, &list)) { 780 if (!CreateNetworks(false, &list)) {
735 SignalError(); 781 SignalError();
736 } else { 782 } else {
737 bool changed; 783 bool changed;
738 MergeNetworkList(list, &changed); 784 NetworkManager::Stats stats;
785 MergeNetworkList(list, &changed, &stats);
786 if (stats.ipv6_network_count) {
787 set_default_local_address(QueryDefaultAddress(AF_INET6));
pthatcher1 2015/11/10 18:52:34 Why bother checking the stats? Why not just query
guoweis_webrtc 2015/11/10 20:37:29 If there is no ipv6 address at all, there is no po
788 }
789 if (stats.ipv4_network_count) {
790 set_default_local_address(QueryDefaultAddress(AF_INET));
791 }
739 if (changed || !sent_first_update_) { 792 if (changed || !sent_first_update_) {
740 SignalNetworksChanged(); 793 SignalNetworksChanged();
741 sent_first_update_ = true; 794 sent_first_update_ = true;
742 } 795 }
743 } 796 }
744 } 797 }
745 798
746 void BasicNetworkManager::UpdateNetworksContinually() { 799 void BasicNetworkManager::UpdateNetworksContinually() {
747 UpdateNetworksOnce(); 800 UpdateNetworksOnce();
748 thread_->PostDelayed(kNetworksUpdateIntervalMs, this, kUpdateNetworksMessage); 801 thread_->PostDelayed(kNetworksUpdateIntervalMs, this, kUpdateNetworksMessage);
(...skipping 10 matching lines...) Expand all
759 << ((network->ignored()) ? ", Ignored" : ""); 812 << ((network->ignored()) ? ", Ignored" : "");
760 } 813 }
761 } 814 }
762 // Release the network list created previously. 815 // Release the network list created previously.
763 // Do this in a seperated for loop for better readability. 816 // Do this in a seperated for loop for better readability.
764 for (Network* network : list) { 817 for (Network* network : list) {
765 delete network; 818 delete network;
766 } 819 }
767 } 820 }
768 821
769 Network::Network(const std::string& name, const std::string& desc, 822 Network::Network(const std::string& name,
770 const IPAddress& prefix, int prefix_length) 823 const std::string& desc,
771 : name_(name), description_(desc), prefix_(prefix), 824 const IPAddress& prefix,
825 int prefix_length)
826 : name_(name),
827 description_(desc),
828 prefix_(prefix),
772 prefix_length_(prefix_length), 829 prefix_length_(prefix_length),
773 key_(MakeNetworkKey(name, prefix, prefix_length)), scope_id_(0), 830 key_(MakeNetworkKey(name, prefix, prefix_length)),
774 ignored_(false), type_(ADAPTER_TYPE_UNKNOWN), preference_(0) { 831 scope_id_(0),
775 } 832 ignored_(false),
833 type_(ADAPTER_TYPE_UNKNOWN),
834 preference_(0) {}
776 835
777 Network::Network(const std::string& name, const std::string& desc, 836 Network::Network(const std::string& name,
778 const IPAddress& prefix, int prefix_length, AdapterType type) 837 const std::string& desc,
779 : name_(name), description_(desc), prefix_(prefix), 838 const IPAddress& prefix,
839 int prefix_length,
840 AdapterType type)
841 : name_(name),
842 description_(desc),
843 prefix_(prefix),
780 prefix_length_(prefix_length), 844 prefix_length_(prefix_length),
781 key_(MakeNetworkKey(name, prefix, prefix_length)), scope_id_(0), 845 key_(MakeNetworkKey(name, prefix, prefix_length)),
782 ignored_(false), type_(type), preference_(0) { 846 scope_id_(0),
783 } 847 ignored_(false),
848 type_(type),
849 preference_(0) {}
784 850
785 Network::~Network() = default; 851 Network::~Network() = default;
786 852
787 // Sets the addresses of this network. Returns true if the address set changed. 853 // Sets the addresses of this network. Returns true if the address set changed.
788 // Change detection is short circuited if the changed argument is true. 854 // Change detection is short circuited if the changed argument is true.
789 bool Network::SetIPs(const std::vector<InterfaceAddress>& ips, bool changed) { 855 bool Network::SetIPs(const std::vector<InterfaceAddress>& ips, bool changed) {
790 // Detect changes with a nested loop; n-squared but we expect on the order 856 // Detect changes with a nested loop; n-squared but we expect on the order
791 // of 2-3 addresses per network. 857 // of 2-3 addresses per network.
792 changed = changed || ips.size() != ips_.size(); 858 changed = changed || ips.size() != ips_.size();
793 if (!changed) { 859 if (!changed) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 std::stringstream ss; 911 std::stringstream ss;
846 // Print out the first space-terminated token of the network desc, plus 912 // Print out the first space-terminated token of the network desc, plus
847 // the IP address. 913 // the IP address.
848 ss << "Net[" << description_.substr(0, description_.find(' ')) 914 ss << "Net[" << description_.substr(0, description_.find(' '))
849 << ":" << prefix_.ToSensitiveString() << "/" << prefix_length_ 915 << ":" << prefix_.ToSensitiveString() << "/" << prefix_length_
850 << ":" << AdapterTypeToString(type_) << "]"; 916 << ":" << AdapterTypeToString(type_) << "]";
851 return ss.str(); 917 return ss.str();
852 } 918 }
853 919
854 } // namespace rtc 920 } // namespace rtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698