diff --git a/pc/peerconnection.cc b/pc/peerconnection.cc index 0aa3739486..78a96053b8 100644 --- a/pc/peerconnection.cc +++ b/pc/peerconnection.cc @@ -2885,6 +2885,20 @@ bool PeerConnection::SetConfiguration(const RTCConfiguration& configuration, return SafeSetError(RTCErrorType::INVALID_MODIFICATION, error); } + if (local_description() && + configuration.use_media_transport != configuration_.use_media_transport) { + RTC_LOG(LS_ERROR) << "Can't change media_transport after calling " + "SetLocalDescription."; + return SafeSetError(RTCErrorType::INVALID_MODIFICATION, error); + } + + if (remote_description() && + configuration.use_media_transport != configuration_.use_media_transport) { + RTC_LOG(LS_ERROR) << "Can't change media_transport after calling " + "SetRemoteDescription."; + return SafeSetError(RTCErrorType::INVALID_MODIFICATION, error); + } + // The simplest (and most future-compatible) way to tell if the config was // modified in an invalid way is to copy each property we do support // modifying, then use operator==. There are far more properties we don't @@ -2909,6 +2923,7 @@ bool PeerConnection::SetConfiguration(const RTCConfiguration& configuration, modified_config.network_preference = configuration.network_preference; modified_config.active_reset_srtp_params = configuration.active_reset_srtp_params; + modified_config.use_media_transport = configuration.use_media_transport; if (configuration != modified_config) { RTC_LOG(LS_ERROR) << "Modifying the configuration in an unsupported way."; return SafeSetError(RTCErrorType::INVALID_MODIFICATION, error); diff --git a/pc/peerconnectioninterface_unittest.cc b/pc/peerconnectioninterface_unittest.cc index 719fdbdd7f..86a04bfb09 100644 --- a/pc/peerconnectioninterface_unittest.cc +++ b/pc/peerconnectioninterface_unittest.cc @@ -1428,11 +1428,13 @@ TEST_P(PeerConnectionInterfaceTest, GetConfigurationAfterSetConfiguration) { PeerConnectionInterface::RTCConfiguration config = pc_->GetConfiguration(); config.type = PeerConnectionInterface::kRelay; + config.use_media_transport = true; EXPECT_TRUE(pc_->SetConfiguration(config)); PeerConnectionInterface::RTCConfiguration returned_config = pc_->GetConfiguration(); EXPECT_EQ(PeerConnectionInterface::kRelay, returned_config.type); + EXPECT_TRUE(returned_config.use_media_transport); } TEST_P(PeerConnectionInterfaceTest, SetConfigurationFailsAfterClose) {