Add a field trial to control datagram transport use.

First, the existing configuration parameter (use_datagram_transport) is
now optional.

The new field trial has two flag values:
 1. Whether to enable the datagram transport (enabled)
 2. Whether to use the datagram transport by default (default_value)

The first is a kill-switch.  It disables the datagram transport, even
for applications which inject a datagram transport factory and specify
use_datagram_transport = true.  This allows applications which hard-code
a datagram transport to switch it off via field trials.

This flag defaults to true, to avoid breaking downstream projects which
already inject and configure a datagram transport.  It may be changed to
false after updating downstream to set this field trial flag to true
when required.

The second provides a default value to be used in case the
aforementioned use_datagram_transport parameter is unset.  Applications
which explicitly set use_datagram_transport will use that value.
Applications which do not explicitly specify whether or not to use the
datagram transport will use it (or not) according to the default_value
flag.

One goal of this flag is to simplify rollout in applications which
already set field trials based on configuration, but require code
changes for new RTCConfiguration parameters.  A second goal is to
provide platforms with a knob to control whether datagram transport is
"opt-in" or "opt-out".

This flag defaults to false, to prevent downstream projects from
unintentionally enabling the datagram tranpsort.

Bug: webrtc:9719
Change-Id: I521a5fa61c992e76e5081118678a1812a261d672
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/144184
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Commit-Queue: Bjorn Mellem <mellem@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28435}
This commit is contained in:
Bjorn A Mellem 2019-06-28 14:19:38 -07:00 committed by Commit Bot
parent 3e8ef940fe
commit 5985a0481e
3 changed files with 52 additions and 14 deletions

View File

@ -631,11 +631,7 @@ class RTC_EXPORT PeerConnectionInterface : public rtc::RefCountInterface {
// informs PeerConnection that it should use the DatagramTransportInterface
// for packets instead DTLS. It's invalid to set it to |true| if the
// MediaTransportFactory wasn't provided.
//
// TODO(sukhanov): Once we have a working mechanism for negotiating media
// transport through SDP, we replace media transport flags in
// RTCConfiguration with field trials.
bool use_datagram_transport = false;
absl::optional<bool> use_datagram_transport;
// Defines advanced optional cryptographic settings related to SRTP and
// frame encryption for native WebRTC. Setting this will overwrite any

View File

@ -107,6 +107,10 @@ const char kDtlsSrtpSetupFailureRtcp[] =
namespace {
// Field trials.
// Controls datagram transport support.
const char kDatagramTransportFieldTrial[] = "WebRTC-DatagramTransport";
// UMA metric names.
const char kSimulcastVersionApplyLocalDescription[] =
"WebRTC.PeerConnection.Simulcast.ApplyLocalDescription";
@ -764,7 +768,7 @@ bool PeerConnectionInterface::RTCConfiguration::operator==(
bool active_reset_srtp_params;
bool use_media_transport;
bool use_media_transport_for_data_channels;
bool use_datagram_transport;
absl::optional<bool> use_datagram_transport;
absl::optional<CryptoOptions> crypto_options;
bool offer_extmap_allow_mixed;
};
@ -868,6 +872,8 @@ PeerConnection::PeerConnection(PeerConnectionFactory* factory,
: factory_(factory),
event_log_(std::move(event_log)),
event_log_ptr_(event_log_.get()),
datagram_transport_config_(
field_trial::FindFullName(kDatagramTransportFieldTrial)),
rtcp_cname_(GenerateRtcpCname()),
local_streams_(StreamCollection::Create()),
remote_streams_(StreamCollection::Create()),
@ -1027,8 +1033,10 @@ bool PeerConnection::Initialize(
#endif
config.active_reset_srtp_params = configuration.active_reset_srtp_params;
if (configuration.use_datagram_transport ||
configuration.use_media_transport ||
use_datagram_transport_ = datagram_transport_config_.enabled &&
configuration_.use_datagram_transport.value_or(
datagram_transport_config_.default_value);
if (use_datagram_transport_ || configuration.use_media_transport ||
configuration.use_media_transport_for_data_channels) {
if (!factory_->media_transport_factory()) {
RTC_DCHECK(false)
@ -1058,7 +1066,7 @@ bool PeerConnection::Initialize(
config.use_media_transport_for_media = configuration.use_media_transport;
config.use_media_transport_for_data_channels =
configuration.use_media_transport_for_data_channels;
config.use_datagram_transport = configuration.use_datagram_transport;
config.use_datagram_transport = use_datagram_transport_;
config.media_transport_factory = factory_->media_transport_factory();
}
@ -3461,7 +3469,8 @@ bool PeerConnection::SetConfiguration(const RTCConfiguration& configuration,
if (configuration.use_media_transport_for_data_channels ||
configuration.use_media_transport ||
configuration.use_datagram_transport) {
(configuration.use_datagram_transport &&
*configuration.use_datagram_transport)) {
RTC_CHECK(configuration.bundle_policy == kBundlePolicyMaxBundle)
<< "Media transport requires MaxBundle policy.";
}
@ -3496,6 +3505,7 @@ bool PeerConnection::SetConfiguration(const RTCConfiguration& configuration,
modified_config.use_media_transport = configuration.use_media_transport;
modified_config.use_media_transport_for_data_channels =
configuration.use_media_transport_for_data_channels;
modified_config.use_datagram_transport = configuration.use_datagram_transport;
if (configuration != modified_config) {
RTC_LOG(LS_ERROR) << "Modifying the configuration in an unsupported way.";
return SafeSetError(RTCErrorType::INVALID_MODIFICATION, error);
@ -3554,10 +3564,14 @@ bool PeerConnection::SetConfiguration(const RTCConfiguration& configuration,
}
transport_controller_->SetIceConfig(ParseIceConfig(modified_config));
use_datagram_transport_ = datagram_transport_config_.enabled &&
modified_config.use_datagram_transport.value_or(
datagram_transport_config_.default_value);
transport_controller_->SetMediaTransportSettings(
modified_config.use_media_transport,
modified_config.use_media_transport_for_data_channels,
modified_config.use_datagram_transport);
use_datagram_transport_);
if (configuration_.active_reset_srtp_params !=
modified_config.active_reset_srtp_params) {
@ -4345,7 +4359,7 @@ void PeerConnection::GetOptionsForOffer(
}
// If datagram transport is in use, add opaque transport parameters.
if (configuration_.use_datagram_transport) {
if (use_datagram_transport_) {
for (auto& options : session_options->media_description_options) {
options.transport_options.opaque_parameters =
transport_controller_->GetTransportParameters(options.mid);
@ -4651,7 +4665,7 @@ void PeerConnection::GetOptionsForAnswer(
port_allocator_.get()));
// If datagram transport is in use, add opaque transport parameters.
if (configuration_.use_datagram_transport) {
if (use_datagram_transport_) {
for (auto& options : session_options->media_description_options) {
options.transport_options.opaque_parameters =
transport_controller_->GetTransportParameters(options.mid);
@ -6965,7 +6979,7 @@ bool PeerConnection::ReadyToUseRemoteCandidate(
}
bool PeerConnection::SrtpRequired() const {
return !configuration_.use_datagram_transport &&
return !use_datagram_transport_ &&
(dtls_enabled_ ||
webrtc_session_desc_factory_->SdesPolicy() == cricket::SEC_REQUIRED);
}

View File

@ -309,6 +309,28 @@ class PeerConnection : public PeerConnectionInternal,
uint32_t first_ssrc;
};
// Field-trial based configuration for datagram transport.
struct DatagramTransportConfig {
explicit DatagramTransportConfig(const std::string& field_trial)
: enabled("enabled", true), default_value("default_value", false) {
ParseFieldTrial({&enabled, &default_value}, field_trial);
}
// Whether datagram transport support is enabled at all. Defaults to true,
// allowing datagram transport to be used if (a) the application provides a
// factory for it and (b) the configuration specifies its use. This flag
// provides a kill-switch to force-disable datagram transport across all
// applications, without code changes.
FieldTrialFlag enabled;
// Whether the datagram transport is enabled or disabled by default.
// Defaults to false, meaning that applications must configure use of
// datagram transport through RTCConfiguration. If set to true,
// applications will use the datagram transport by default (but may still
// explicitly configure themselves not to use it through RTCConfiguration).
FieldTrialFlag default_value;
};
// Implements MessageHandler.
void OnMessage(rtc::Message* msg) override;
@ -1122,6 +1144,12 @@ class PeerConnection : public PeerConnectionInternal,
PeerConnectionInterface::RTCConfiguration configuration_
RTC_GUARDED_BY(signaling_thread());
// Field-trial based configuration for datagram transport.
const DatagramTransportConfig datagram_transport_config_;
// Final, resolved value for whether datagram transport is in use.
bool use_datagram_transport_ RTC_GUARDED_BY(signaling_thread()) = false;
// Cache configuration_.use_media_transport so that we can access it from
// other threads.
// TODO(bugs.webrtc.org/9987): Caching just this bool and allowing the data