mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 22:30:40 +01:00
Add small cost to Vpn
This patch adds small cost to Vpn connections so that a "raw" connection identical to a vpn connection will be chosen first. The feature is gated by a field trial WebRTC-AddNetworkCostToVpn for safe roll out. Bug: webrtc:13097 Change-Id: I4ad40fa00780a6d7f89cacf6f85f3db4ecd0988c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/229585 Commit-Queue: Jonas Oreland <jonaso@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34822}
This commit is contained in:
parent
b0cb4d1b5d
commit
b477fc73cf
4 changed files with 71 additions and 17 deletions
|
@ -87,29 +87,36 @@ bool SortNetworks(const Network* a, const Network* b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t ComputeNetworkCostByType(int type,
|
uint16_t ComputeNetworkCostByType(int type,
|
||||||
bool use_differentiated_cellular_costs) {
|
bool is_vpn,
|
||||||
|
bool use_differentiated_cellular_costs,
|
||||||
|
bool add_network_cost_to_vpn) {
|
||||||
// TODO(jonaso) : Rollout support for cellular network cost using A/B
|
// TODO(jonaso) : Rollout support for cellular network cost using A/B
|
||||||
// experiment to make sure it does not introduce regressions.
|
// experiment to make sure it does not introduce regressions.
|
||||||
|
int vpnCost = (is_vpn && add_network_cost_to_vpn) ? kNetworkCostVpn : 0;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case rtc::ADAPTER_TYPE_ETHERNET:
|
case rtc::ADAPTER_TYPE_ETHERNET:
|
||||||
case rtc::ADAPTER_TYPE_LOOPBACK:
|
case rtc::ADAPTER_TYPE_LOOPBACK:
|
||||||
return kNetworkCostMin;
|
return kNetworkCostMin + vpnCost;
|
||||||
case rtc::ADAPTER_TYPE_WIFI:
|
case rtc::ADAPTER_TYPE_WIFI:
|
||||||
return kNetworkCostLow;
|
return kNetworkCostLow + vpnCost;
|
||||||
case rtc::ADAPTER_TYPE_CELLULAR:
|
case rtc::ADAPTER_TYPE_CELLULAR:
|
||||||
return kNetworkCostCellular;
|
return kNetworkCostCellular + vpnCost;
|
||||||
case rtc::ADAPTER_TYPE_CELLULAR_2G:
|
case rtc::ADAPTER_TYPE_CELLULAR_2G:
|
||||||
return use_differentiated_cellular_costs ? kNetworkCostCellular2G
|
return (use_differentiated_cellular_costs ? kNetworkCostCellular2G
|
||||||
: kNetworkCostCellular;
|
: kNetworkCostCellular) +
|
||||||
|
vpnCost;
|
||||||
case rtc::ADAPTER_TYPE_CELLULAR_3G:
|
case rtc::ADAPTER_TYPE_CELLULAR_3G:
|
||||||
return use_differentiated_cellular_costs ? kNetworkCostCellular3G
|
return (use_differentiated_cellular_costs ? kNetworkCostCellular3G
|
||||||
: kNetworkCostCellular;
|
: kNetworkCostCellular) +
|
||||||
|
vpnCost;
|
||||||
case rtc::ADAPTER_TYPE_CELLULAR_4G:
|
case rtc::ADAPTER_TYPE_CELLULAR_4G:
|
||||||
return use_differentiated_cellular_costs ? kNetworkCostCellular4G
|
return (use_differentiated_cellular_costs ? kNetworkCostCellular4G
|
||||||
: kNetworkCostCellular;
|
: kNetworkCostCellular) +
|
||||||
|
vpnCost;
|
||||||
case rtc::ADAPTER_TYPE_CELLULAR_5G:
|
case rtc::ADAPTER_TYPE_CELLULAR_5G:
|
||||||
return use_differentiated_cellular_costs ? kNetworkCostCellular5G
|
return (use_differentiated_cellular_costs ? kNetworkCostCellular5G
|
||||||
: kNetworkCostCellular;
|
: kNetworkCostCellular) +
|
||||||
|
vpnCost;
|
||||||
case rtc::ADAPTER_TYPE_ANY:
|
case rtc::ADAPTER_TYPE_ANY:
|
||||||
// Candidates gathered from the any-address/wildcard ports, as backups,
|
// Candidates gathered from the any-address/wildcard ports, as backups,
|
||||||
// are given the maximum cost so that if there are other candidates with
|
// are given the maximum cost so that if there are other candidates with
|
||||||
|
@ -120,13 +127,13 @@ uint16_t ComputeNetworkCostByType(int type,
|
||||||
// ADAPTER_TYPE_CELLULAR would then have a higher cost. See
|
// ADAPTER_TYPE_CELLULAR would then have a higher cost. See
|
||||||
// P2PTransportChannel::SortConnectionsAndUpdateState for how we rank and
|
// P2PTransportChannel::SortConnectionsAndUpdateState for how we rank and
|
||||||
// select candidate pairs, where the network cost is among the criteria.
|
// select candidate pairs, where the network cost is among the criteria.
|
||||||
return kNetworkCostMax;
|
return kNetworkCostMax + vpnCost;
|
||||||
case rtc::ADAPTER_TYPE_VPN:
|
case rtc::ADAPTER_TYPE_VPN:
|
||||||
// The cost of a VPN should be computed using its underlying network type.
|
// The cost of a VPN should be computed using its underlying network type.
|
||||||
RTC_NOTREACHED();
|
RTC_NOTREACHED();
|
||||||
return kNetworkCostUnknown;
|
return kNetworkCostUnknown;
|
||||||
default:
|
default:
|
||||||
return kNetworkCostUnknown;
|
return kNetworkCostUnknown + vpnCost;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -999,7 +1006,9 @@ Network::Network(const std::string& name,
|
||||||
type_(ADAPTER_TYPE_UNKNOWN),
|
type_(ADAPTER_TYPE_UNKNOWN),
|
||||||
preference_(0),
|
preference_(0),
|
||||||
use_differentiated_cellular_costs_(webrtc::field_trial::IsEnabled(
|
use_differentiated_cellular_costs_(webrtc::field_trial::IsEnabled(
|
||||||
"WebRTC-UseDifferentiatedCellularCosts")) {}
|
"WebRTC-UseDifferentiatedCellularCosts")),
|
||||||
|
add_network_cost_to_vpn_(
|
||||||
|
webrtc::field_trial::IsEnabled("WebRTC-AddNetworkCostToVpn")) {}
|
||||||
|
|
||||||
Network::Network(const std::string& name,
|
Network::Network(const std::string& name,
|
||||||
const std::string& desc,
|
const std::string& desc,
|
||||||
|
@ -1016,7 +1025,9 @@ Network::Network(const std::string& name,
|
||||||
type_(type),
|
type_(type),
|
||||||
preference_(0),
|
preference_(0),
|
||||||
use_differentiated_cellular_costs_(webrtc::field_trial::IsEnabled(
|
use_differentiated_cellular_costs_(webrtc::field_trial::IsEnabled(
|
||||||
"WebRTC-UseDifferentiatedCellularCosts")) {}
|
"WebRTC-UseDifferentiatedCellularCosts")),
|
||||||
|
add_network_cost_to_vpn_(
|
||||||
|
webrtc::field_trial::IsEnabled("WebRTC-AddNetworkCostToVpn")) {}
|
||||||
|
|
||||||
Network::Network(const Network&) = default;
|
Network::Network(const Network&) = default;
|
||||||
|
|
||||||
|
@ -1088,7 +1099,9 @@ webrtc::MdnsResponderInterface* Network::GetMdnsResponder() const {
|
||||||
|
|
||||||
uint16_t Network::GetCost() const {
|
uint16_t Network::GetCost() const {
|
||||||
AdapterType type = IsVpn() ? underlying_type_for_vpn_ : type_;
|
AdapterType type = IsVpn() ? underlying_type_for_vpn_ : type_;
|
||||||
return ComputeNetworkCostByType(type, use_differentiated_cellular_costs_);
|
return ComputeNetworkCostByType(type, IsVpn(),
|
||||||
|
use_differentiated_cellular_costs_,
|
||||||
|
add_network_cost_to_vpn_);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Network::ToString() const {
|
std::string Network::ToString() const {
|
||||||
|
|
|
@ -504,6 +504,7 @@ class RTC_EXPORT Network {
|
||||||
bool active_ = true;
|
bool active_ = true;
|
||||||
uint16_t id_ = 0;
|
uint16_t id_ = 0;
|
||||||
bool use_differentiated_cellular_costs_ = false;
|
bool use_differentiated_cellular_costs_ = false;
|
||||||
|
bool add_network_cost_to_vpn_ = false;
|
||||||
NetworkPreference network_preference_ = NetworkPreference::NEUTRAL;
|
NetworkPreference network_preference_ = NetworkPreference::NEUTRAL;
|
||||||
|
|
||||||
friend class NetworkManager;
|
friend class NetworkManager;
|
||||||
|
|
|
@ -27,6 +27,11 @@ constexpr uint16_t kNetworkCostUnknown = 50;
|
||||||
constexpr uint16_t kNetworkCostLow = 10;
|
constexpr uint16_t kNetworkCostLow = 10;
|
||||||
constexpr uint16_t kNetworkCostMin = 0;
|
constexpr uint16_t kNetworkCostMin = 0;
|
||||||
|
|
||||||
|
// Add 1 to network cost of underlying network type
|
||||||
|
// so that e.g a "plain" WIFI is prefered over a VPN over WIFI
|
||||||
|
// everything else being equal.
|
||||||
|
constexpr uint16_t kNetworkCostVpn = 1;
|
||||||
|
|
||||||
// alias
|
// alias
|
||||||
constexpr uint16_t kNetworkCostHigh = kNetworkCostCellular;
|
constexpr uint16_t kNetworkCostHigh = kNetworkCostCellular;
|
||||||
|
|
||||||
|
|
|
@ -1350,4 +1350,39 @@ TEST_F(NetworkTest, WebRTC_BindUsingInterfaceName) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
TEST_F(NetworkTest, NetworkCostVpn_Default) {
|
||||||
|
IPAddress ip1;
|
||||||
|
EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
|
||||||
|
|
||||||
|
Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
|
||||||
|
net1->set_type(ADAPTER_TYPE_VPN);
|
||||||
|
net1->set_underlying_type_for_vpn(ADAPTER_TYPE_ETHERNET);
|
||||||
|
|
||||||
|
Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
|
||||||
|
net2->set_type(ADAPTER_TYPE_ETHERNET);
|
||||||
|
|
||||||
|
EXPECT_EQ(net1->GetCost(), net2->GetCost());
|
||||||
|
delete net1;
|
||||||
|
delete net2;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(NetworkTest, NetworkCostVpn_VpnMoreExpensive) {
|
||||||
|
webrtc::test::ScopedFieldTrials field_trials(
|
||||||
|
"WebRTC-AddNetworkCostToVpn/Enabled/");
|
||||||
|
|
||||||
|
IPAddress ip1;
|
||||||
|
EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
|
||||||
|
|
||||||
|
Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
|
||||||
|
net1->set_type(ADAPTER_TYPE_VPN);
|
||||||
|
net1->set_underlying_type_for_vpn(ADAPTER_TYPE_ETHERNET);
|
||||||
|
|
||||||
|
Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
|
||||||
|
net2->set_type(ADAPTER_TYPE_ETHERNET);
|
||||||
|
|
||||||
|
EXPECT_GT(net1->GetCost(), net2->GetCost());
|
||||||
|
delete net1;
|
||||||
|
delete net2;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace rtc
|
} // namespace rtc
|
||||||
|
|
Loading…
Reference in a new issue