OLD | NEW |
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 14 matching lines...) Expand all Loading... |
25 #if defined(WEBRTC_WIN) | 25 #if defined(WEBRTC_WIN) |
26 #include "webrtc/base/win32.h" | 26 #include "webrtc/base/win32.h" |
27 #include <Iphlpapi.h> | 27 #include <Iphlpapi.h> |
28 #elif !defined(__native_client__) | 28 #elif !defined(__native_client__) |
29 #include "webrtc/base/ifaddrs_converter.h" | 29 #include "webrtc/base/ifaddrs_converter.h" |
30 #endif | 30 #endif |
31 | 31 |
32 #include <stdio.h> | 32 #include <stdio.h> |
33 | 33 |
34 #include <algorithm> | 34 #include <algorithm> |
| 35 #include <memory> |
35 | 36 |
36 #include "webrtc/base/logging.h" | 37 #include "webrtc/base/logging.h" |
37 #include "webrtc/base/networkmonitor.h" | 38 #include "webrtc/base/networkmonitor.h" |
38 #include "webrtc/base/scoped_ptr.h" | |
39 #include "webrtc/base/socket.h" // includes something that makes windows happy | 39 #include "webrtc/base/socket.h" // includes something that makes windows happy |
40 #include "webrtc/base/stream.h" | 40 #include "webrtc/base/stream.h" |
41 #include "webrtc/base/stringencode.h" | 41 #include "webrtc/base/stringencode.h" |
42 #include "webrtc/base/thread.h" | 42 #include "webrtc/base/thread.h" |
43 | 43 |
44 namespace rtc { | 44 namespace rtc { |
45 namespace { | 45 namespace { |
46 | 46 |
47 // Turning on IPv6 could make many IPv6 interfaces available for connectivity | 47 // Turning on IPv6 could make many IPv6 interfaces available for connectivity |
48 // check and delay the call setup time. kMaxIPv6Networks is the default upper | 48 // check and delay the call setup time. kMaxIPv6Networks is the default upper |
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 } else if (network_monitor_) { | 464 } else if (network_monitor_) { |
465 adapter_type = network_monitor_->GetAdapterType(cursor->ifa_name); | 465 adapter_type = network_monitor_->GetAdapterType(cursor->ifa_name); |
466 } | 466 } |
467 #if defined(WEBRTC_IOS) | 467 #if defined(WEBRTC_IOS) |
468 // Cell networks are pdp_ipN on iOS. | 468 // Cell networks are pdp_ipN on iOS. |
469 if (strncmp(cursor->ifa_name, "pdp_ip", 6) == 0) { | 469 if (strncmp(cursor->ifa_name, "pdp_ip", 6) == 0) { |
470 adapter_type = ADAPTER_TYPE_CELLULAR; | 470 adapter_type = ADAPTER_TYPE_CELLULAR; |
471 } | 471 } |
472 #endif | 472 #endif |
473 // TODO(phoglund): Need to recognize other types as well. | 473 // TODO(phoglund): Need to recognize other types as well. |
474 scoped_ptr<Network> network(new Network(cursor->ifa_name, | 474 std::unique_ptr<Network> network(new Network(cursor->ifa_name, |
475 cursor->ifa_name, prefix, | 475 cursor->ifa_name, |
476 prefix_length, adapter_type)); | 476 prefix, |
| 477 prefix_length, |
| 478 adapter_type)); |
477 network->set_default_local_address_provider(this); | 479 network->set_default_local_address_provider(this); |
478 network->set_scope_id(scope_id); | 480 network->set_scope_id(scope_id); |
479 network->AddIP(ip); | 481 network->AddIP(ip); |
480 network->set_ignored(IsIgnoredNetwork(*network)); | 482 network->set_ignored(IsIgnoredNetwork(*network)); |
481 if (include_ignored || !network->ignored()) { | 483 if (include_ignored || !network->ignored()) { |
482 current_networks[key] = network.get(); | 484 current_networks[key] = network.get(); |
483 networks->push_back(network.release()); | 485 networks->push_back(network.release()); |
484 } | 486 } |
485 } else { | 487 } else { |
486 (*existing_network).second->AddIP(ip); | 488 (*existing_network).second->AddIP(ip); |
487 } | 489 } |
488 } | 490 } |
489 } | 491 } |
490 | 492 |
491 bool BasicNetworkManager::CreateNetworks(bool include_ignored, | 493 bool BasicNetworkManager::CreateNetworks(bool include_ignored, |
492 NetworkList* networks) const { | 494 NetworkList* networks) const { |
493 struct ifaddrs* interfaces; | 495 struct ifaddrs* interfaces; |
494 int error = getifaddrs(&interfaces); | 496 int error = getifaddrs(&interfaces); |
495 if (error != 0) { | 497 if (error != 0) { |
496 LOG_ERR(LERROR) << "getifaddrs failed to gather interface data: " << error; | 498 LOG_ERR(LERROR) << "getifaddrs failed to gather interface data: " << error; |
497 return false; | 499 return false; |
498 } | 500 } |
499 | 501 |
500 rtc::scoped_ptr<IfAddrsConverter> ifaddrs_converter(CreateIfAddrsConverter()); | 502 std::unique_ptr<IfAddrsConverter> ifaddrs_converter(CreateIfAddrsConverter()); |
501 ConvertIfAddrs(interfaces, ifaddrs_converter.get(), include_ignored, | 503 ConvertIfAddrs(interfaces, ifaddrs_converter.get(), include_ignored, |
502 networks); | 504 networks); |
503 | 505 |
504 freeifaddrs(interfaces); | 506 freeifaddrs(interfaces); |
505 return true; | 507 return true; |
506 } | 508 } |
507 | 509 |
508 #elif defined(WEBRTC_WIN) | 510 #elif defined(WEBRTC_WIN) |
509 | 511 |
510 unsigned int GetPrefix(PIP_ADAPTER_PREFIX prefixlist, | 512 unsigned int GetPrefix(PIP_ADAPTER_PREFIX prefixlist, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 } | 548 } |
547 *prefix = best_prefix; | 549 *prefix = best_prefix; |
548 return best_length; | 550 return best_length; |
549 } | 551 } |
550 | 552 |
551 bool BasicNetworkManager::CreateNetworks(bool include_ignored, | 553 bool BasicNetworkManager::CreateNetworks(bool include_ignored, |
552 NetworkList* networks) const { | 554 NetworkList* networks) const { |
553 NetworkMap current_networks; | 555 NetworkMap current_networks; |
554 // MSDN recommends a 15KB buffer for the first try at GetAdaptersAddresses. | 556 // MSDN recommends a 15KB buffer for the first try at GetAdaptersAddresses. |
555 size_t buffer_size = 16384; | 557 size_t buffer_size = 16384; |
556 scoped_ptr<char[]> adapter_info(new char[buffer_size]); | 558 std::unique_ptr<char[]> adapter_info(new char[buffer_size]); |
557 PIP_ADAPTER_ADDRESSES adapter_addrs = | 559 PIP_ADAPTER_ADDRESSES adapter_addrs = |
558 reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info.get()); | 560 reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info.get()); |
559 int adapter_flags = (GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_ANYCAST | | 561 int adapter_flags = (GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_ANYCAST | |
560 GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_INCLUDE_PREFIX); | 562 GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_INCLUDE_PREFIX); |
561 int ret = 0; | 563 int ret = 0; |
562 do { | 564 do { |
563 adapter_info.reset(new char[buffer_size]); | 565 adapter_info.reset(new char[buffer_size]); |
564 adapter_addrs = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info.get()); | 566 adapter_addrs = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info.get()); |
565 ret = GetAdaptersAddresses(AF_UNSPEC, adapter_flags, | 567 ret = GetAdaptersAddresses(AF_UNSPEC, adapter_flags, |
566 0, adapter_addrs, | 568 0, adapter_addrs, |
(...skipping 15 matching lines...) Expand all Loading... |
582 #endif | 584 #endif |
583 description = ToUtf8(adapter_addrs->Description, | 585 description = ToUtf8(adapter_addrs->Description, |
584 wcslen(adapter_addrs->Description)); | 586 wcslen(adapter_addrs->Description)); |
585 for (; address; address = address->Next) { | 587 for (; address; address = address->Next) { |
586 #if defined(NDEBUG) | 588 #if defined(NDEBUG) |
587 name = rtc::ToString(count); | 589 name = rtc::ToString(count); |
588 #endif | 590 #endif |
589 | 591 |
590 IPAddress ip; | 592 IPAddress ip; |
591 int scope_id = 0; | 593 int scope_id = 0; |
592 scoped_ptr<Network> network; | 594 std::unique_ptr<Network> network; |
593 switch (address->Address.lpSockaddr->sa_family) { | 595 switch (address->Address.lpSockaddr->sa_family) { |
594 case AF_INET: { | 596 case AF_INET: { |
595 sockaddr_in* v4_addr = | 597 sockaddr_in* v4_addr = |
596 reinterpret_cast<sockaddr_in*>(address->Address.lpSockaddr); | 598 reinterpret_cast<sockaddr_in*>(address->Address.lpSockaddr); |
597 ip = IPAddress(v4_addr->sin_addr); | 599 ip = IPAddress(v4_addr->sin_addr); |
598 break; | 600 break; |
599 } | 601 } |
600 case AF_INET6: { | 602 case AF_INET6: { |
601 if (ipv6_enabled()) { | 603 if (ipv6_enabled()) { |
602 sockaddr_in6* v6_addr = | 604 sockaddr_in6* v6_addr = |
(...skipping 18 matching lines...) Expand all Loading... |
621 IPAddress prefix; | 623 IPAddress prefix; |
622 int prefix_length = GetPrefix(prefixlist, ip, &prefix); | 624 int prefix_length = GetPrefix(prefixlist, ip, &prefix); |
623 std::string key = MakeNetworkKey(name, prefix, prefix_length); | 625 std::string key = MakeNetworkKey(name, prefix, prefix_length); |
624 auto existing_network = current_networks.find(key); | 626 auto existing_network = current_networks.find(key); |
625 if (existing_network == current_networks.end()) { | 627 if (existing_network == current_networks.end()) { |
626 AdapterType adapter_type = ADAPTER_TYPE_UNKNOWN; | 628 AdapterType adapter_type = ADAPTER_TYPE_UNKNOWN; |
627 if (adapter_addrs->IfType == IF_TYPE_SOFTWARE_LOOPBACK) { | 629 if (adapter_addrs->IfType == IF_TYPE_SOFTWARE_LOOPBACK) { |
628 // TODO(phoglund): Need to recognize other types as well. | 630 // TODO(phoglund): Need to recognize other types as well. |
629 adapter_type = ADAPTER_TYPE_LOOPBACK; | 631 adapter_type = ADAPTER_TYPE_LOOPBACK; |
630 } | 632 } |
631 scoped_ptr<Network> network(new Network(name, description, prefix, | 633 std::unique_ptr<Network> network(new Network(name, description, |
632 prefix_length, adapter_type)); | 634 prefix, prefix_length, |
| 635 adapter_type)); |
633 network->set_default_local_address_provider(this); | 636 network->set_default_local_address_provider(this); |
634 network->set_scope_id(scope_id); | 637 network->set_scope_id(scope_id); |
635 network->AddIP(ip); | 638 network->AddIP(ip); |
636 bool ignored = IsIgnoredNetwork(*network); | 639 bool ignored = IsIgnoredNetwork(*network); |
637 network->set_ignored(ignored); | 640 network->set_ignored(ignored); |
638 if (include_ignored || !network->ignored()) { | 641 if (include_ignored || !network->ignored()) { |
639 current_networks[key] = network.get(); | 642 current_networks[key] = network.get(); |
640 networks->push_back(network.release()); | 643 networks->push_back(network.release()); |
641 } | 644 } |
642 } else { | 645 } else { |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
785 default: | 788 default: |
786 ASSERT(false); | 789 ASSERT(false); |
787 } | 790 } |
788 } | 791 } |
789 | 792 |
790 IPAddress BasicNetworkManager::QueryDefaultLocalAddress(int family) const { | 793 IPAddress BasicNetworkManager::QueryDefaultLocalAddress(int family) const { |
791 ASSERT(thread_ == Thread::Current()); | 794 ASSERT(thread_ == Thread::Current()); |
792 ASSERT(thread_->socketserver() != nullptr); | 795 ASSERT(thread_->socketserver() != nullptr); |
793 ASSERT(family == AF_INET || family == AF_INET6); | 796 ASSERT(family == AF_INET || family == AF_INET6); |
794 | 797 |
795 scoped_ptr<AsyncSocket> socket( | 798 std::unique_ptr<AsyncSocket> socket( |
796 thread_->socketserver()->CreateAsyncSocket(family, SOCK_DGRAM)); | 799 thread_->socketserver()->CreateAsyncSocket(family, SOCK_DGRAM)); |
797 if (!socket) { | 800 if (!socket) { |
798 LOG_ERR(LERROR) << "Socket creation failed"; | 801 LOG_ERR(LERROR) << "Socket creation failed"; |
799 return IPAddress(); | 802 return IPAddress(); |
800 } | 803 } |
801 | 804 |
802 if (socket->Connect(SocketAddress( | 805 if (socket->Connect(SocketAddress( |
803 family == AF_INET ? kPublicIPv4Host : kPublicIPv6Host, kPublicPort)) < | 806 family == AF_INET ? kPublicIPv4Host : kPublicIPv6Host, kPublicPort)) < |
804 0) { | 807 0) { |
805 LOG(LS_INFO) << "Connect failed with " << socket->GetError(); | 808 LOG(LS_INFO) << "Connect failed with " << socket->GetError(); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
938 std::stringstream ss; | 941 std::stringstream ss; |
939 // Print out the first space-terminated token of the network desc, plus | 942 // Print out the first space-terminated token of the network desc, plus |
940 // the IP address. | 943 // the IP address. |
941 ss << "Net[" << description_.substr(0, description_.find(' ')) | 944 ss << "Net[" << description_.substr(0, description_.find(' ')) |
942 << ":" << prefix_.ToSensitiveString() << "/" << prefix_length_ | 945 << ":" << prefix_.ToSensitiveString() << "/" << prefix_length_ |
943 << ":" << AdapterTypeToString(type_) << "]"; | 946 << ":" << AdapterTypeToString(type_) << "]"; |
944 return ss.str(); | 947 return ss.str(); |
945 } | 948 } |
946 | 949 |
947 } // namespace rtc | 950 } // namespace rtc |
OLD | NEW |