Add support to not use turn server as stun server.

If a stun server is already there, the benefit of adding turn servers as stun servers is small,
and it may create unnecessary stun candidates.

Bug: webrtc:11059
Change-Id: Ia37b43b787180af4d91c1c07c866ccbf1db80262
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/158680
Reviewed-by: Qingsi Wang <qingsi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29644}
This commit is contained in:
Honghai Zhang 2019-10-29 12:45:34 -07:00
parent 74f96eccd6
commit 6981fb5fbd
3 changed files with 47 additions and 3 deletions

View File

@ -28,6 +28,7 @@
#include "rtc_base/checks.h"
#include "rtc_base/helpers.h"
#include "rtc_base/logging.h"
#include "system_wrappers/include/field_trial.h"
#include "system_wrappers/include/metrics.h"
using rtc::CreateRandomId;
@ -1699,6 +1700,9 @@ PortConfiguration::PortConfiguration(const ServerAddresses& stun_servers,
: stun_servers(stun_servers), username(username), password(password) {
if (!stun_servers.empty())
stun_address = *(stun_servers.begin());
// Note that this won't change once the config is initialized.
use_turn_server_as_stun_server_disabled =
webrtc::field_trial::IsDisabled("WebRTC-UseTurnServerAsStunServer");
}
PortConfiguration::~PortConfiguration() = default;
@ -1708,7 +1712,14 @@ ServerAddresses PortConfiguration::StunServers() {
stun_servers.find(stun_address) == stun_servers.end()) {
stun_servers.insert(stun_address);
}
// Every UDP TURN server should also be used as a STUN server.
if (!stun_servers.empty() && use_turn_server_as_stun_server_disabled) {
return stun_servers;
}
// Every UDP TURN server should also be used as a STUN server if
// use_turn_server_as_stun_server is not disabled or the stun servers are
// empty.
ServerAddresses turn_servers = GetRelayServerAddresses(RELAY_TURN, PROTO_UDP);
for (const rtc::SocketAddress& turn_server : turn_servers) {
if (stun_servers.find(turn_server) == stun_servers.end()) {

View File

@ -290,6 +290,7 @@ struct RTC_EXPORT PortConfiguration : public rtc::MessageData {
ServerAddresses stun_servers;
std::string username;
std::string password;
bool use_turn_server_as_stun_server_disabled = false;
typedef std::vector<RelayServerConfig> RelayList;
RelayList relays;

View File

@ -43,6 +43,7 @@
#include "rtc_base/thread.h"
#include "rtc_base/virtual_socket_server.h"
#include "system_wrappers/include/metrics.h"
#include "test/field_trial.h"
#include "test/gmock.h"
#include "test/gtest.h"
@ -215,8 +216,8 @@ class BasicPortAllocatorTestBase : public ::testing::Test,
AddTurnServers(udp_turn, tcp_turn);
}
void AddTurnServers(const rtc::SocketAddress& udp_turn,
const rtc::SocketAddress& tcp_turn) {
RelayServerConfig CreateTurnServers(const rtc::SocketAddress& udp_turn,
const rtc::SocketAddress& tcp_turn) {
RelayServerConfig turn_server(RELAY_TURN);
RelayCredentials credentials(kTurnUsername, kTurnPassword);
turn_server.credentials = credentials;
@ -227,6 +228,12 @@ class BasicPortAllocatorTestBase : public ::testing::Test,
if (!tcp_turn.IsNil()) {
turn_server.ports.push_back(ProtocolAddress(tcp_turn, PROTO_TCP));
}
return turn_server;
}
void AddTurnServers(const rtc::SocketAddress& udp_turn,
const rtc::SocketAddress& tcp_turn) {
RelayServerConfig turn_server = CreateTurnServers(udp_turn, tcp_turn);
allocator_->AddTurnServer(turn_server);
}
@ -2428,4 +2435,29 @@ TEST_F(BasicPortAllocatorTest, HostCandidateAddressIsReplacedByHostname) {
EXPECT_EQ(2, num_relay_candidates);
}
TEST_F(BasicPortAllocatorTest, TestUseTurnServerAsStunSever) {
ServerAddresses stun_servers;
stun_servers.insert(kStunAddr);
PortConfiguration port_config(stun_servers, "", "");
RelayServerConfig turn_servers =
CreateTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
port_config.AddRelay(turn_servers);
EXPECT_EQ(2U, port_config.StunServers().size());
}
TEST_F(BasicPortAllocatorTest, TestDoNotUseTurnServerAsStunSever) {
webrtc::test::ScopedFieldTrials field_trials(
"WebRTC-UseTurnServerAsStunServer/Disabled/");
ServerAddresses stun_servers;
stun_servers.insert(kStunAddr);
PortConfiguration port_config(stun_servers, "" /* user_name */,
"" /* password */);
RelayServerConfig turn_servers =
CreateTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
port_config.AddRelay(turn_servers);
EXPECT_EQ(1U, port_config.StunServers().size());
}
} // namespace cricket