Index: webrtc/pc/channelmanager.cc |
diff --git a/webrtc/pc/channelmanager.cc b/webrtc/pc/channelmanager.cc |
index c2ce1cc604e941360b8e56962e95ce809f429f18..06475e9eaa26f13ec0883a1c8e8654675cbf8e9e 100644 |
--- a/webrtc/pc/channelmanager.cc |
+++ b/webrtc/pc/channelmanager.cc |
@@ -64,6 +64,7 @@ void ChannelManager::Construct(MediaEngineInterface* me, |
network_thread_ = network_thread; |
capturing_ = false; |
enable_rtx_ = false; |
+ crypto_options_ = rtc::CryptoOptions::NoGcm(); |
} |
ChannelManager::~ChannelManager() { |
@@ -97,6 +98,30 @@ bool ChannelManager::SetVideoRtxEnabled(bool enable) { |
} |
} |
+bool ChannelManager::SetCryptoOptions( |
+ const rtc::CryptoOptions& crypto_options) { |
+ return worker_thread_->Invoke<bool>(RTC_FROM_HERE, Bind( |
+ &ChannelManager::SetCryptoOptions_w, this, crypto_options)); |
+} |
+ |
+bool ChannelManager::SetCryptoOptions_w( |
+ const rtc::CryptoOptions& crypto_options) { |
+ if (!video_channels_.empty() || !voice_channels_.empty() || |
+ !data_channels_.empty()) { |
+ LOG(LS_WARNING) << "Not changing crypto options in existing channels."; |
+ } |
+ crypto_options_ = crypto_options; |
+#if defined(ENABLE_EXTERNAL_AUTH) |
+ if (crypto_options_.enable_gcm_crypto_suites) { |
+ // TODO(jbauch): Re-enable once https://crbug.com/628400 is resolved. |
+ crypto_options_.enable_gcm_crypto_suites = false; |
+ LOG(LS_WARNING) << "GCM ciphers are not supported with " << |
+ "ENABLE_EXTERNAL_AUTH and will be disabled."; |
+ } |
+#endif |
+ return true; |
+} |
+ |
void ChannelManager::GetSupportedAudioSendCodecs( |
std::vector<AudioCodec>* codecs) const { |
*codecs = media_engine_->audio_send_codecs(); |
@@ -218,6 +243,7 @@ VoiceChannel* ChannelManager::CreateVoiceChannel_w( |
VoiceChannel* voice_channel = |
new VoiceChannel(worker_thread_, network_thread_, media_engine_.get(), |
media_channel, transport_controller, content_name, rtcp); |
+ voice_channel->SetCryptoOptions(crypto_options_); |
if (!voice_channel->Init_w(bundle_transport_name)) { |
delete voice_channel; |
return nullptr; |
@@ -281,6 +307,7 @@ VideoChannel* ChannelManager::CreateVideoChannel_w( |
VideoChannel* video_channel = |
new VideoChannel(worker_thread_, network_thread_, media_channel, |
transport_controller, content_name, rtcp); |
+ video_channel->SetCryptoOptions(crypto_options_); |
if (!video_channel->Init_w(bundle_transport_name)) { |
delete video_channel; |
return NULL; |
@@ -344,6 +371,7 @@ DataChannel* ChannelManager::CreateDataChannel_w( |
DataChannel* data_channel = |
new DataChannel(worker_thread_, network_thread_, media_channel, |
transport_controller, content_name, rtcp); |
+ data_channel->SetCryptoOptions(crypto_options_); |
if (!data_channel->Init_w(bundle_transport_name)) { |
LOG(LS_WARNING) << "Failed to init data channel."; |
delete data_channel; |