Datagram Transport Integration
- Implement datagram transport adaptor, which wraps datagram transport in DtlsTransportInternal. Datagram adaptor owns both ICE and Datagram Transports.
- Implement setup of datagram transport based on RTCConfiguration flag use_datagram_transport. This is very similar to MediaTransport setup with the exception that we create DTLS datagram adaptor.
- Propagate maximum datagram size to video encoder via MediaTransportConfig.
TODO: Currently this CL can only be tested in downstream projects. Once we add fake datagram transport, we will be able to implement unit tests similar to loopback media transport.
Bug: webrtc:9719
Change-Id: I4fa4a5725598dfee5da4f0f374269a7e289d48ed
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/138100
Commit-Queue: Anton Sukhanov <sukhanov@webrtc.org>
Reviewed-by: Bjorn Mellem <mellem@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28047}
diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc
index ca66a09..14c8683 100644
--- a/pc/peer_connection.cc
+++ b/pc/peer_connection.cc
@@ -764,6 +764,7 @@
bool active_reset_srtp_params;
bool use_media_transport;
bool use_media_transport_for_data_channels;
+ bool use_datagram_transport;
absl::optional<CryptoOptions> crypto_options;
bool offer_extmap_allow_mixed;
};
@@ -822,6 +823,7 @@
use_media_transport == o.use_media_transport &&
use_media_transport_for_data_channels ==
o.use_media_transport_for_data_channels &&
+ use_datagram_transport == o.use_datagram_transport &&
crypto_options == o.crypto_options &&
offer_extmap_allow_mixed == o.offer_extmap_allow_mixed;
}
@@ -1021,7 +1023,8 @@
#endif
config.active_reset_srtp_params = configuration.active_reset_srtp_params;
- if (configuration.use_media_transport ||
+ if (configuration.use_datagram_transport ||
+ configuration.use_media_transport ||
configuration.use_media_transport_for_data_channels) {
if (!factory_->media_transport_factory()) {
RTC_DCHECK(false)
@@ -1051,6 +1054,7 @@
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.media_transport_factory = factory_->media_transport_factory();
}
@@ -3412,8 +3416,23 @@
return SafeSetError(RTCErrorType::INVALID_MODIFICATION, error);
}
+ if (local_description() && configuration.use_datagram_transport !=
+ configuration_.use_datagram_transport) {
+ RTC_LOG(LS_ERROR) << "Can't change use_datagram_transport "
+ "after calling SetLocalDescription.";
+ return SafeSetError(RTCErrorType::INVALID_MODIFICATION, error);
+ }
+
+ if (remote_description() && configuration.use_datagram_transport !=
+ configuration_.use_datagram_transport) {
+ RTC_LOG(LS_ERROR) << "Can't change use_datagram_transport "
+ "after calling SetRemoteDescription.";
+ return SafeSetError(RTCErrorType::INVALID_MODIFICATION, error);
+ }
+
if (configuration.use_media_transport_for_data_channels ||
- configuration.use_media_transport) {
+ configuration.use_media_transport ||
+ configuration.use_datagram_transport) {
RTC_CHECK(configuration.bundle_policy == kBundlePolicyMaxBundle)
<< "Media transport requires MaxBundle policy.";
}
@@ -3506,7 +3525,8 @@
transport_controller_->SetIceConfig(ParseIceConfig(modified_config));
transport_controller_->SetMediaTransportSettings(
modified_config.use_media_transport,
- modified_config.use_media_transport_for_data_channels);
+ modified_config.use_media_transport_for_data_channels,
+ modified_config.use_datagram_transport);
if (configuration_.active_reset_srtp_params !=
modified_config.active_reset_srtp_params) {
@@ -6317,15 +6337,13 @@
cricket::VoiceChannel* PeerConnection::CreateVoiceChannel(
const std::string& mid) {
RtpTransportInternal* rtp_transport = GetRtpTransport(mid);
- MediaTransportInterface* media_transport = nullptr;
- if (configuration_.use_media_transport) {
- media_transport = GetMediaTransport(mid);
- }
+ MediaTransportConfig media_transport_config =
+ transport_controller_->GetMediaTransportConfig(mid);
cricket::VoiceChannel* voice_channel = channel_manager()->CreateVoiceChannel(
call_ptr_, configuration_.media_config, rtp_transport,
- MediaTransportConfig(media_transport), signaling_thread(), mid,
- SrtpRequired(), GetCryptoOptions(), &ssrc_generator_, audio_options_);
+ media_transport_config, signaling_thread(), mid, SrtpRequired(),
+ GetCryptoOptions(), &ssrc_generator_, audio_options_);
if (!voice_channel) {
return nullptr;
}
@@ -6342,15 +6360,13 @@
cricket::VideoChannel* PeerConnection::CreateVideoChannel(
const std::string& mid) {
RtpTransportInternal* rtp_transport = GetRtpTransport(mid);
- MediaTransportInterface* media_transport = nullptr;
- if (configuration_.use_media_transport) {
- media_transport = GetMediaTransport(mid);
- }
+ MediaTransportConfig media_transport_config =
+ transport_controller_->GetMediaTransportConfig(mid);
cricket::VideoChannel* video_channel = channel_manager()->CreateVideoChannel(
call_ptr_, configuration_.media_config, rtp_transport,
- MediaTransportConfig(media_transport), signaling_thread(), mid,
- SrtpRequired(), GetCryptoOptions(), &ssrc_generator_, video_options_,
+ media_transport_config, signaling_thread(), mid, SrtpRequired(),
+ GetCryptoOptions(), &ssrc_generator_, video_options_,
video_bitrate_allocator_factory_.get());
if (!video_channel) {
return nullptr;
@@ -6529,7 +6545,8 @@
bool PeerConnection::SetupMediaTransportForDataChannels_n(
const std::string& mid) {
- media_transport_ = transport_controller_->GetMediaTransport(mid);
+ media_transport_ =
+ transport_controller_->GetMediaTransportForDataChannel(mid);
if (!media_transport_) {
RTC_LOG(LS_ERROR)
<< "Media transport is not available for data channels, mid=" << mid;
@@ -6886,8 +6903,9 @@
}
bool PeerConnection::SrtpRequired() const {
- return dtls_enabled_ ||
- webrtc_session_desc_factory_->SdesPolicy() == cricket::SEC_REQUIRED;
+ return !configuration_.use_datagram_transport &&
+ (dtls_enabled_ ||
+ webrtc_session_desc_factory_->SdesPolicy() == cricket::SEC_REQUIRED);
}
void PeerConnection::OnTransportControllerGatheringState(