From 9f1de690085d6dcaec3de180115d2ace08bb7f3f Mon Sep 17 00:00:00 2001 From: Qingsi Wang Date: Thu, 28 Jun 2018 15:38:09 -0700 Subject: [PATCH] Add ADAPTER_TYPE_ANY in AdapterType. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ADAPTER_TYPE_ANY can be used to set the network ignore mask if an application does not want candidates from the any address ports, the underlying network interface types of which are not determined in gathering. The ADAPTER_TYPE_ANY is also given the maximum network cost so that when there are candidates from explicit network interfaces, these candidates from the any address ports as backups, if they ever surface, are not preferred if the other candidates have at least the same network condition. Bug: webrtc:9468 Change-Id: I20c3a40e9a75b8fb34fad741ba5f835ecc3b0d92 Reviewed-on: https://webrtc-review.googlesource.com/85880 Reviewed-by: Sami Kalliomäki Reviewed-by: Tommi Commit-Queue: Qingsi Wang Cr-Commit-Position: refs/heads/master@{#23807} --- pc/rtcstatscollector.cc | 1 + pc/statscollector.cc | 1 + rtc_base/network.cc | 18 +++++++++++++++--- rtc_base/network_constants.h | 8 +++++++- .../api/org/webrtc/PeerConnectionFactory.java | 1 + 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/pc/rtcstatscollector.cc b/pc/rtcstatscollector.cc index d71b3f2fd3..35cae8cb8a 100644 --- a/pc/rtcstatscollector.cc +++ b/pc/rtcstatscollector.cc @@ -168,6 +168,7 @@ const char* NetworkAdapterTypeToStatsType(rtc::AdapterType type) { return RTCNetworkType::kVpn; case rtc::ADAPTER_TYPE_UNKNOWN: case rtc::ADAPTER_TYPE_LOOPBACK: + case rtc::ADAPTER_TYPE_ANY: return RTCNetworkType::kUnknown; } RTC_NOTREACHED(); diff --git a/pc/statscollector.cc b/pc/statscollector.cc index 6c5cdab014..0018b10c8b 100644 --- a/pc/statscollector.cc +++ b/pc/statscollector.cc @@ -414,6 +414,7 @@ const char* IceCandidateTypeToStatsType(const std::string& candidate_type) { const char* AdapterTypeToStatsType(rtc::AdapterType type) { switch (type) { + case rtc::ADAPTER_TYPE_ANY: case rtc::ADAPTER_TYPE_UNKNOWN: return "unknown"; case rtc::ADAPTER_TYPE_ETHERNET: diff --git a/rtc_base/network.cc b/rtc_base/network.cc index 4bfbd0d270..0f42d6fe30 100644 --- a/rtc_base/network.cc +++ b/rtc_base/network.cc @@ -94,6 +94,7 @@ bool SortNetworks(const Network* a, const Network* b) { std::string AdapterTypeToString(AdapterType type) { switch (type) { + case ADAPTER_TYPE_ANY: case ADAPTER_TYPE_UNKNOWN: return "Unknown"; case ADAPTER_TYPE_ETHERNET: @@ -121,6 +122,17 @@ uint16_t ComputeNetworkCostByType(int type) { return kNetworkCostLow; case rtc::ADAPTER_TYPE_CELLULAR: return kNetworkCostHigh; + case rtc::ADAPTER_TYPE_ANY: + // Candidates gathered from the any-address/wildcard ports, as backups, + // are given the maximum cost so that if there are other candidates with + // known interface types, we would not select candidate pairs using these + // backup candidates if other selection criteria with higher precedence + // (network conditions over the route) are the same. Note that setting the + // cost to kNetworkCostUnknown would be problematic since + // ADAPTER_TYPE_CELLULAR would then have a higher cost. See + // P2PTransportChannel::SortConnectionsAndUpdateState for how we rank and + // select candidate pairs, where the network cost is among the criteria. + return kNetworkCostMax; case rtc::ADAPTER_TYPE_VPN: // The cost of a VPN should be computed using its underlying network type. RTC_NOTREACHED(); @@ -265,7 +277,7 @@ void NetworkManagerBase::GetAnyAddressNetworks(NetworkList* networks) { if (!ipv4_any_address_network_) { const rtc::IPAddress ipv4_any_address(INADDR_ANY); ipv4_any_address_network_.reset( - new rtc::Network("any", "any", ipv4_any_address, 0)); + new rtc::Network("any", "any", ipv4_any_address, 0, ADAPTER_TYPE_ANY)); ipv4_any_address_network_->set_default_local_address_provider(this); ipv4_any_address_network_->AddIP(ipv4_any_address); } @@ -274,8 +286,8 @@ void NetworkManagerBase::GetAnyAddressNetworks(NetworkList* networks) { if (ipv6_enabled()) { if (!ipv6_any_address_network_) { 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_.reset(new rtc::Network( + "any", "any", ipv6_any_address, 0, ADAPTER_TYPE_ANY)); ipv6_any_address_network_->set_default_local_address_provider(this); ipv6_any_address_network_->AddIP(ipv6_any_address); } diff --git a/rtc_base/network_constants.h b/rtc_base/network_constants.h index b4c8beaf31..efb2c83455 100644 --- a/rtc_base/network_constants.h +++ b/rtc_base/network_constants.h @@ -28,7 +28,13 @@ enum AdapterType { ADAPTER_TYPE_WIFI = 1 << 1, ADAPTER_TYPE_CELLULAR = 1 << 2, ADAPTER_TYPE_VPN = 1 << 3, - ADAPTER_TYPE_LOOPBACK = 1 << 4 + ADAPTER_TYPE_LOOPBACK = 1 << 4, + // ADAPTER_TYPE_ANY is used for a network, which only contains a single "any + // address" IP address (INADDR_ANY for IPv4 or in6addr_any for IPv6), and can + // use any/all network interfaces. Whereas ADAPTER_TYPE_UNKNOWN is used + // when the network uses a specific interface/IP, but its interface type can + // not be determined or not fit in this enum. + ADAPTER_TYPE_ANY = 1 << 5, }; } // namespace rtc diff --git a/sdk/android/api/org/webrtc/PeerConnectionFactory.java b/sdk/android/api/org/webrtc/PeerConnectionFactory.java index aab621632d..789baf3cc9 100644 --- a/sdk/android/api/org/webrtc/PeerConnectionFactory.java +++ b/sdk/android/api/org/webrtc/PeerConnectionFactory.java @@ -127,6 +127,7 @@ public class PeerConnectionFactory { static final int ADAPTER_TYPE_CELLULAR = 1 << 2; static final int ADAPTER_TYPE_VPN = 1 << 3; static final int ADAPTER_TYPE_LOOPBACK = 1 << 4; + static final int ADAPTER_TYPE_ANY = 1 << 5; public int networkIgnoreMask; public boolean disableEncryption;