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;