Revert^2 "[M120] JsepTransportController: Remove raw pointers to description objects"

This reverts commit bf2e30678e0e5b21f2a2d49180a13225fdcfaa1a.

Reason for revert: Time to reland the fix for M120 now.

Original change's description:
> Revert "[M120] JsepTransportController: Remove raw pointers to description objects"
>
> This reverts commit e79a99060f70a356b131d9f2f7497914984944d1.
>
> Reason for revert: Merged too early. Will re-land for the next spin.
>
> Original change's description:
> > [M120] JsepTransportController: Remove raw pointers to description objects
> >
> > Remove member variables that point to objects owned externally (in practice by SdpOfferAnswerHandler). The objects also live on the
> > signaling thread whereas JsepTransportController performs
> > operations on the network thread. Removing the raw pointers avoids
> > the risk of referencing the description objects after they've been
> > deleted or if the state is inconsistent across threads.
> >
> > (cherry picked from commit c56052001d)
> >
> > Bug: webrtc:1515832
> > No-Try: true
> > Change-Id: I852b2a3993964be817f93c46b5bc4b03121cde86
> > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/334061
> > Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
> > Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> > Cr-Original-Commit-Position: refs/heads/main@{#41505}
> > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/335180
> > Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
> > Cr-Commit-Position: refs/branch-heads/6099@{#2}
> > Cr-Branched-From: 507f1cc3270d0577f79882acbd78e63e66008f3d-refs/heads/main@{#41042}
>
> Change-Id: Id4bd21fbc8b7306de1aba0854815ada5c9333468
> No-Try: true
> Bug: chromium:1515832
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/335620
> Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com>
> Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
> Cr-Commit-Position: refs/branch-heads/6099@{#3}
> Cr-Branched-From: 507f1cc3270d0577f79882acbd78e63e66008f3d-refs/heads/main@{#41042}

No-Try: true
Bug: chromium:1515832
Change-Id: I13a24182908d7a616234d9c701bf7000a162df8e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/336282
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/branch-heads/6099@{#4}
Cr-Branched-From: 507f1cc3270d0577f79882acbd78e63e66008f3d-refs/heads/main@{#41042}
This commit is contained in:
Tomas Gunnarsson 2024-01-26 12:01:53 +00:00 committed by Jim Gustafson
parent 422ca5dc5b
commit de3552fe48
5 changed files with 472 additions and 327 deletions

View file

@ -76,14 +76,18 @@ JsepTransportController::~JsepTransportController() {
RTCError JsepTransportController::SetLocalDescription(
SdpType type,
const cricket::SessionDescription* description) {
const cricket::SessionDescription* local_desc,
const cricket::SessionDescription* remote_desc) {
RTC_DCHECK(local_desc);
TRACE_EVENT0("webrtc", "JsepTransportController::SetLocalDescription");
if (!network_thread_->IsCurrent()) {
return network_thread_->BlockingCall(
[=] { return SetLocalDescription(type, description); });
[=] { return SetLocalDescription(type, local_desc, remote_desc); });
}
RTC_DCHECK_RUN_ON(network_thread_);
if (!initial_offerer_.has_value()) {
initial_offerer_.emplace(type == SdpType::kOffer);
if (*initial_offerer_) {
@ -92,20 +96,22 @@ RTCError JsepTransportController::SetLocalDescription(
SetIceRole_n(cricket::ICEROLE_CONTROLLED);
}
}
return ApplyDescription_n(/*local=*/true, type, description);
return ApplyDescription_n(/*local=*/true, type, local_desc, remote_desc);
}
RTCError JsepTransportController::SetRemoteDescription(
SdpType type,
const cricket::SessionDescription* description) {
const cricket::SessionDescription* local_desc,
const cricket::SessionDescription* remote_desc) {
RTC_DCHECK(remote_desc);
TRACE_EVENT0("webrtc", "JsepTransportController::SetRemoteDescription");
if (!network_thread_->IsCurrent()) {
return network_thread_->BlockingCall(
[=] { return SetRemoteDescription(type, description); });
[=] { return SetRemoteDescription(type, local_desc, remote_desc); });
}
RTC_DCHECK_RUN_ON(network_thread_);
return ApplyDescription_n(/*local=*/false, type, description);
return ApplyDescription_n(/*local=*/false, type, local_desc, remote_desc);
}
RtpTransportInternal* JsepTransportController::GetRtpTransport(
@ -587,18 +593,20 @@ JsepTransportController::GetActiveDtlsTransports() {
RTCError JsepTransportController::ApplyDescription_n(
bool local,
SdpType type,
const cricket::SessionDescription* description) {
const cricket::SessionDescription* local_desc,
const cricket::SessionDescription* remote_desc) {
TRACE_EVENT0("webrtc", "JsepTransportController::ApplyDescription_n");
// Stash away the description object that we'll be applying (since this
// function is used for both local and remote).
const cricket::SessionDescription* description =
local ? local_desc : remote_desc;
RTC_DCHECK(description);
if (local) {
local_desc_ = description;
} else {
remote_desc_ = description;
}
RTCError error;
error = ValidateAndMaybeUpdateBundleGroups(local, type, description);
error =
ValidateAndMaybeUpdateBundleGroups(local, type, local_desc, remote_desc);
if (!error.ok()) {
return error;
}
@ -710,7 +718,11 @@ RTCError JsepTransportController::ApplyDescription_n(
RTCError JsepTransportController::ValidateAndMaybeUpdateBundleGroups(
bool local,
SdpType type,
const cricket::SessionDescription* description) {
const cricket::SessionDescription* local_desc,
const cricket::SessionDescription* remote_desc) {
const cricket::SessionDescription* description =
local ? local_desc : remote_desc;
RTC_DCHECK(description);
std::vector<const cricket::ContentGroup*> new_bundle_groups =
@ -776,9 +788,10 @@ RTCError JsepTransportController::ValidateAndMaybeUpdateBundleGroups(
}
}
} else if (type == SdpType::kAnswer) {
if ((local && remote_desc) || (!local && local_desc)) {
std::vector<const cricket::ContentGroup*> offered_bundle_groups =
local ? remote_desc_->GetGroupsByName(cricket::GROUP_TYPE_BUNDLE)
: local_desc_->GetGroupsByName(cricket::GROUP_TYPE_BUNDLE);
local ? remote_desc->GetGroupsByName(cricket::GROUP_TYPE_BUNDLE)
: local_desc->GetGroupsByName(cricket::GROUP_TYPE_BUNDLE);
std::map<std::string, const cricket::ContentGroup*>
offered_bundle_groups_by_mid;
@ -798,8 +811,8 @@ RTCError JsepTransportController::ValidateAndMaybeUpdateBundleGroups(
continue;
}
// The group in the answer (new_bundle_group) must have a corresponding
// group in the offer (original_group), because the answer groups may only
// be subsets of the offer groups.
// group in the offer (original_group), because the answer groups may
// only be subsets of the offer groups.
auto it = offered_bundle_groups_by_mid.find(
*new_bundle_group->FirstContentName());
if (it == offered_bundle_groups_by_mid.end()) {
@ -847,6 +860,7 @@ RTCError JsepTransportController::ValidateAndMaybeUpdateBundleGroups(
}
}
}
}
if (config_.bundle_policy ==
PeerConnectionInterface::kBundlePolicyMaxBundle &&

View file

@ -161,11 +161,24 @@ class JsepTransportController : public sigslot::has_slots<> {
// level, creating/destroying transport objects as needed and updating their
// properties. This includes RTP, DTLS, and ICE (but not SCTP). At least not
// yet? May make sense to in the future.
//
// `local_desc` must always be valid. If a remote description has previously
// been set via a call to `SetRemoteDescription()` then `remote_desc` should
// point to that description object in order to keep the current local and
// remote session descriptions in sync.
RTCError SetLocalDescription(SdpType type,
const cricket::SessionDescription* description);
const cricket::SessionDescription* local_desc,
const cricket::SessionDescription* remote_desc);
// Call to apply a remote description (See `SetLocalDescription()` for local).
//
// `remote_desc` must always be valid. If a local description has previously
// been set via a call to `SetLocalDescription()` then `local_desc` should
// point to that description object in order to keep the current local and
// remote session descriptions in sync.
RTCError SetRemoteDescription(SdpType type,
const cricket::SessionDescription* description);
const cricket::SessionDescription* local_desc,
const cricket::SessionDescription* remote_desc);
// Get transports to be used for the provided `mid`. If bundling is enabled,
// calling GetRtpTransport for multiple MIDs may yield the same object.
@ -346,14 +359,23 @@ class JsepTransportController : public sigslot::has_slots<> {
CallbackList<const cricket::CandidatePairChangeEvent&>
signal_ice_candidate_pair_changed_ RTC_GUARDED_BY(network_thread_);
// Called from SetLocalDescription and SetRemoteDescription.
// When `local` is true, local_desc must be valid. Similarly when
// `local` is false, remote_desc must be valid. The description counterpart
// to the one that's being applied, may be nullptr but when it's supplied
// the counterpart description's content groups will be kept up to date for
// `type == SdpType::kAnswer`.
RTCError ApplyDescription_n(bool local,
SdpType type,
const cricket::SessionDescription* description)
const cricket::SessionDescription* local_desc,
const cricket::SessionDescription* remote_desc)
RTC_RUN_ON(network_thread_);
RTCError ValidateAndMaybeUpdateBundleGroups(
bool local,
SdpType type,
const cricket::SessionDescription* description);
const cricket::SessionDescription* local_desc,
const cricket::SessionDescription* remote_desc)
RTC_RUN_ON(network_thread_);
RTCError ValidateContent(const cricket::ContentInfo& content_info);
void HandleRejectedContent(const cricket::ContentInfo& content_info)
@ -502,8 +524,6 @@ class JsepTransportController : public sigslot::has_slots<> {
const Config config_;
bool active_reset_srtp_params_ RTC_GUARDED_BY(network_thread_);
const cricket::SessionDescription* local_desc_ = nullptr;
const cricket::SessionDescription* remote_desc_ = nullptr;
absl::optional<bool> initial_offerer_;
cricket::IceConfig ice_config_;

View file

@ -265,8 +265,9 @@ class JsepTransportControllerTest : public JsepTransportController::Observer,
}
auto description = CreateSessionDescriptionWithBundleGroup();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
transport_controller_->MaybeStartGathering();
@ -385,8 +386,9 @@ class JsepTransportControllerTest : public JsepTransportController::Observer,
TEST_F(JsepTransportControllerTest, GetRtpTransport) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithoutBundle();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
auto audio_rtp_transport = transport_controller_->GetRtpTransport(kAudioMid1);
auto video_rtp_transport = transport_controller_->GetRtpTransport(kVideoMid1);
@ -402,8 +404,9 @@ TEST_F(JsepTransportControllerTest, GetDtlsTransport) {
config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
CreateJsepTransportController(std::move(config));
auto description = CreateSessionDescriptionWithoutBundle();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
EXPECT_NE(nullptr, transport_controller_->GetDtlsTransport(kAudioMid1));
EXPECT_NE(nullptr, transport_controller_->GetRtcpDtlsTransport(kAudioMid1));
@ -437,8 +440,9 @@ TEST_F(JsepTransportControllerTest, GetDtlsTransportWithRtcpMux) {
config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyRequire;
CreateJsepTransportController(std::move(config));
auto description = CreateSessionDescriptionWithoutBundle();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
EXPECT_NE(nullptr, transport_controller_->GetDtlsTransport(kAudioMid1));
EXPECT_EQ(nullptr, transport_controller_->GetRtcpDtlsTransport(kAudioMid1));
@ -449,8 +453,9 @@ TEST_F(JsepTransportControllerTest, GetDtlsTransportWithRtcpMux) {
TEST_F(JsepTransportControllerTest, SetIceConfig) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithoutBundle();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
transport_controller_->SetIceConfig(
@ -467,8 +472,9 @@ TEST_F(JsepTransportControllerTest, SetIceConfig) {
cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_ACTPASS,
nullptr);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
fake_audio_dtls = static_cast<FakeDtlsTransport*>(
transport_controller_->GetDtlsTransport(kAudioMid2));
@ -482,11 +488,14 @@ TEST_F(JsepTransportControllerTest, SetIceConfig) {
TEST_F(JsepTransportControllerTest, NeedIceRestart) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithoutBundle();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
// TODO(tommi): Note that _now_ we set `remote`. (was not set before).
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, description.get())
->SetRemoteDescription(SdpType::kAnswer, description.get(),
description.get())
.ok());
// Initially NeedsIceRestart should return false.
@ -505,7 +514,8 @@ TEST_F(JsepTransportControllerTest, NeedIceRestart) {
audio_transport_info->description.ice_ufrag = kIceUfrag2;
audio_transport_info->description.ice_pwd = kIcePwd2;
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
->SetLocalDescription(SdpType::kOffer, description.get(),
description.get())
.ok());
// Because the ICE is only restarted for audio, NeedsIceRestart is expected to
// return false for audio and true for video.
@ -516,8 +526,9 @@ TEST_F(JsepTransportControllerTest, NeedIceRestart) {
TEST_F(JsepTransportControllerTest, MaybeStartGathering) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithBundleGroup();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
// After setting the local description, we should be able to start gathering
// candidates.
@ -529,10 +540,10 @@ TEST_F(JsepTransportControllerTest, MaybeStartGathering) {
TEST_F(JsepTransportControllerTest, AddRemoveRemoteCandidates) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithoutBundle();
transport_controller_->SetLocalDescription(SdpType::kOffer,
description.get());
transport_controller_->SetRemoteDescription(SdpType::kAnswer,
description.get());
transport_controller_->SetLocalDescription(SdpType::kOffer, description.get(),
nullptr);
transport_controller_->SetRemoteDescription(
SdpType::kAnswer, description.get(), description.get());
auto fake_audio_dtls = static_cast<FakeDtlsTransport*>(
transport_controller_->GetDtlsTransport(kAudioMid1));
ASSERT_NE(nullptr, fake_audio_dtls);
@ -565,8 +576,9 @@ TEST_F(JsepTransportControllerTest, SetAndGetLocalCertificate) {
// Apply the local certificate.
EXPECT_TRUE(transport_controller_->SetLocalCertificate(certificate1));
// Apply the local description.
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
returned_certificate = transport_controller_->GetLocalCertificate(kAudioMid1);
EXPECT_TRUE(returned_certificate);
@ -586,8 +598,9 @@ TEST_F(JsepTransportControllerTest, SetAndGetLocalCertificate) {
TEST_F(JsepTransportControllerTest, GetRemoteSSLCertChain) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithBundleGroup();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
rtc::FakeSSLCertificate fake_certificate("fake_data");
@ -622,8 +635,9 @@ TEST_F(JsepTransportControllerTest, GetDtlsRole) {
cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_PASSIVE,
answer_certificate);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, offer_desc.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, offer_desc.get(), nullptr)
.ok());
absl::optional<rtc::SSLRole> role =
@ -631,7 +645,8 @@ TEST_F(JsepTransportControllerTest, GetDtlsRole) {
// The DTLS role is not decided yet.
EXPECT_FALSE(role);
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, answer_desc.get())
->SetRemoteDescription(SdpType::kAnswer, offer_desc.get(),
answer_desc.get())
.ok());
role = transport_controller_->GetDtlsRole(kAudioMid1);
@ -642,8 +657,9 @@ TEST_F(JsepTransportControllerTest, GetDtlsRole) {
TEST_F(JsepTransportControllerTest, GetStats) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithBundleGroup();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
cricket::TransportStats stats;
@ -657,8 +673,9 @@ TEST_F(JsepTransportControllerTest, GetStats) {
TEST_F(JsepTransportControllerTest, SignalConnectionStateFailed) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithoutBundle();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
auto fake_ice = static_cast<cricket::FakeIceTransport*>(
@ -681,8 +698,9 @@ TEST_F(JsepTransportControllerTest,
SignalConnectionStateConnectedNoMediaTransport) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithoutBundle();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
auto fake_audio_dtls = static_cast<FakeDtlsTransport*>(
@ -729,8 +747,9 @@ TEST_F(JsepTransportControllerTest,
TEST_F(JsepTransportControllerTest, SignalConnectionStateComplete) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithoutBundle();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
auto fake_audio_dtls = static_cast<FakeDtlsTransport*>(
@ -788,8 +807,9 @@ TEST_F(JsepTransportControllerTest, SignalConnectionStateComplete) {
TEST_F(JsepTransportControllerTest, SignalIceGatheringStateGathering) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithoutBundle();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
auto fake_audio_dtls = static_cast<FakeDtlsTransport*>(
@ -803,8 +823,9 @@ TEST_F(JsepTransportControllerTest, SignalIceGatheringStateGathering) {
TEST_F(JsepTransportControllerTest, SignalIceGatheringStateComplete) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithoutBundle();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
auto fake_audio_dtls = static_cast<FakeDtlsTransport*>(
@ -838,8 +859,9 @@ TEST_F(JsepTransportControllerTest,
SignalingWhenLastIncompleteTransportDestroyed) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithBundleGroup();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
auto fake_audio_dtls = static_cast<FakeDtlsTransport*>(
@ -861,7 +883,8 @@ TEST_F(JsepTransportControllerTest,
// Set the remote description and enable the bundle.
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, description.get())
->SetRemoteDescription(SdpType::kAnswer, description.get(),
description.get())
.ok());
// The BUNDLE should be enabled, the incomplete video transport should be
// deleted and the states should be updated.
@ -887,11 +910,13 @@ TEST_F(JsepTransportControllerTest,
AddAudioSection(description.get(), kAudioMid1, kIceUfrag1, kIcePwd1,
cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_ACTPASS,
nullptr);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, description.get())
->SetRemoteDescription(SdpType::kAnswer, description.get(),
description.get())
.ok());
// Trigger and verify initial non-new states.
@ -914,7 +939,8 @@ TEST_F(JsepTransportControllerTest,
// to "new".
description->contents()[0].rejected = true;
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kOffer, description.get())
->SetRemoteDescription(SdpType::kOffer, description.get(),
description.get())
.ok());
EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionNew,
ice_connection_state_, kTimeout);
@ -941,8 +967,9 @@ TEST_F(JsepTransportControllerTest,
TEST_F(JsepTransportControllerTest, SignalCandidatesGathered) {
CreateJsepTransportController(JsepTransportController::Config());
auto description = CreateSessionDescriptionWithBundleGroup();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, description.get(), nullptr)
.ok());
transport_controller_->MaybeStartGathering();
@ -998,11 +1025,13 @@ TEST_F(JsepTransportControllerTest, IceRoleNotRedetermined) {
cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_PASSIVE,
nullptr);
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kOffer, remote_offer.get())
EXPECT_TRUE(
transport_controller_
->SetRemoteDescription(SdpType::kOffer, nullptr, remote_offer.get())
.ok());
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kAnswer, local_answer.get())
->SetLocalDescription(SdpType::kAnswer, local_answer.get(),
remote_offer.get())
.ok());
auto fake_dtls = static_cast<FakeDtlsTransport*>(
@ -1015,9 +1044,10 @@ TEST_F(JsepTransportControllerTest, IceRoleNotRedetermined) {
AddAudioSection(restart_local_offer.get(), kAudioMid1, kIceUfrag3, kIcePwd3,
cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_ACTPASS,
nullptr);
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, restart_local_offer.get())
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer,
restart_local_offer.get(),
remote_offer.get())
.ok());
EXPECT_EQ(cricket::ICEROLE_CONTROLLED,
fake_dtls->fake_ice_transport()->GetIceRole());
@ -1030,8 +1060,9 @@ TEST_F(JsepTransportControllerTest, SetIceRoleWhenIceLiteInRemoteAnswer) {
AddAudioSection(local_offer.get(), kAudioMid1, kIceUfrag1, kIcePwd1,
cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_ACTPASS,
nullptr);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
auto fake_dtls = static_cast<FakeDtlsTransport*>(
transport_controller_->GetDtlsTransport(kAudioMid1));
@ -1045,7 +1076,8 @@ TEST_F(JsepTransportControllerTest, SetIceRoleWhenIceLiteInRemoteAnswer) {
cricket::ICEMODE_LITE, cricket::CONNECTIONROLE_PASSIVE,
nullptr);
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
EXPECT_EQ(cricket::ICEROLE_CONTROLLING,
fake_dtls->fake_ice_transport()->GetIceRole());
@ -1069,11 +1101,13 @@ TEST_F(JsepTransportControllerTest,
nullptr);
// Initial Offer/Answer exchange. If the remote offerer is ICE-Lite, then the
// local side is the controlling.
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kOffer, remote_offer.get())
EXPECT_TRUE(
transport_controller_
->SetRemoteDescription(SdpType::kOffer, nullptr, remote_offer.get())
.ok());
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kAnswer, local_answer.get())
->SetLocalDescription(SdpType::kAnswer, local_answer.get(),
remote_offer.get())
.ok());
auto fake_dtls = static_cast<FakeDtlsTransport*>(
transport_controller_->GetDtlsTransport(kAudioMid1));
@ -1085,15 +1119,17 @@ TEST_F(JsepTransportControllerTest,
AddAudioSection(remote_offer2.get(), kAudioMid1, kIceUfrag2, kIcePwd2,
cricket::ICEMODE_LITE, cricket::CONNECTIONROLE_ACTPASS,
nullptr);
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kOffer, local_answer.get(),
remote_offer2.get())
.ok());
auto local_answer2 = std::make_unique<cricket::SessionDescription>();
AddAudioSection(local_answer2.get(), kAudioMid1, kIceUfrag2, kIcePwd2,
cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_PASSIVE,
nullptr);
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kOffer, remote_offer2.get())
.ok());
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kAnswer, local_answer2.get())
->SetLocalDescription(SdpType::kAnswer, local_answer2.get(),
remote_offer2.get())
.ok());
fake_dtls = static_cast<FakeDtlsTransport*>(
transport_controller_->GetDtlsTransport(kAudioMid1));
@ -1145,11 +1181,13 @@ TEST_F(JsepTransportControllerTest, MultipleMediaSectionsOfSameTypeWithBundle) {
local_offer->AddGroup(bundle_group);
remote_answer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Verify that all the sections are bundled on kAudio1.
auto transport1 = transport_controller_->GetRtpTransport(kAudioMid1);
@ -1224,11 +1262,13 @@ TEST_F(JsepTransportControllerTest, MultipleBundleGroups) {
remote_answer->AddGroup(bundle_group1);
remote_answer->AddGroup(bundle_group2);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Verify that (kMid1Audio,kMid2Video) and (kMid3Audio,kMid4Video) form two
@ -1307,11 +1347,13 @@ TEST_F(JsepTransportControllerTest,
// endpoint that does not have support for multiple BUNDLE groups.
remote_answer->AddGroup(bundle_group1);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Verify that (kMid1Audio,kMid2Video) form a bundle group, but that
@ -1382,12 +1424,14 @@ TEST_F(JsepTransportControllerTest, MultipleBundleGroupsIllegallyChangeGroup) {
remote_answer->AddGroup(answer_bundle_group2);
// Accept offer.
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
// Reject answer!
EXPECT_FALSE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
}
@ -1445,12 +1489,14 @@ TEST_F(JsepTransportControllerTest, MultipleBundleGroupsInvalidSubsets) {
remote_answer->AddGroup(answer_bundle_group2);
// Accept offer.
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
// Reject answer!
EXPECT_FALSE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
}
@ -1483,11 +1529,12 @@ TEST_F(JsepTransportControllerTest, MultipleBundleGroupsInvalidOverlap) {
offer->AddGroup(offer_bundle_group2);
// Reject offer, both if set as local or remote.
EXPECT_FALSE(
transport_controller_->SetLocalDescription(SdpType::kOffer, offer.get())
EXPECT_FALSE(transport_controller_
->SetLocalDescription(SdpType::kOffer, offer.get(), nullptr)
.ok());
EXPECT_FALSE(
transport_controller_->SetRemoteDescription(SdpType::kOffer, offer.get())
transport_controller_
->SetRemoteDescription(SdpType::kOffer, offer.get(), offer.get())
.ok());
}
@ -1563,11 +1610,13 @@ TEST_F(JsepTransportControllerTest, MultipleBundleGroupsUnbundleFirstMid) {
remote_answer->AddGroup(answer_bundle_group1);
remote_answer->AddGroup(answer_bundle_group2);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
auto mid1_transport = transport_controller_->GetRtpTransport(kMid1Audio);
@ -1659,8 +1708,9 @@ TEST_F(JsepTransportControllerTest, MultipleBundleGroupsChangeFirstMid) {
remote_answer->AddGroup(answer_bundle_group1);
remote_answer->AddGroup(answer_bundle_group2);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
// The fact that we accept this answer is actually a bug. If we accept the
@ -1669,7 +1719,8 @@ TEST_F(JsepTransportControllerTest, MultipleBundleGroupsChangeFirstMid) {
// TODO(https://crbug.com/webrtc/12699): When this issue is fixed, change this
// to EXPECT_FALSE and remove the below expectations about transports.
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
auto mid1_transport = transport_controller_->GetRtpTransport(kMid1Audio);
auto mid2_transport = transport_controller_->GetRtpTransport(kMid2Audio);
@ -1734,11 +1785,13 @@ TEST_F(JsepTransportControllerTest,
remote_answer->AddGroup(bundle_group1);
remote_answer->AddGroup(bundle_group2);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Add kMid3Audio and kMid6Video to the respective audio/video bundle groups.
@ -1769,7 +1822,8 @@ TEST_F(JsepTransportControllerTest,
subsequent_offer->AddGroup(bundle_group1);
subsequent_offer->AddGroup(bundle_group2);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, subsequent_offer.get())
->SetLocalDescription(SdpType::kOffer, subsequent_offer.get(),
remote_answer.get())
.ok());
auto mid1_transport = transport_controller_->GetRtpTransport(kMid1Audio);
auto mid2_transport = transport_controller_->GetRtpTransport(kMid2Audio);
@ -1832,11 +1886,13 @@ TEST_F(JsepTransportControllerTest,
remote_answer->AddGroup(bundle_group1);
remote_answer->AddGroup(bundle_group2);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Switch to grouping (kMid1Audio,kMid2Audio,kMid3Video,kMid4Video).
@ -1861,9 +1917,10 @@ TEST_F(JsepTransportControllerTest,
cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_ACTPASS,
nullptr);
subsequent_offer->AddGroup(new_bundle_group);
EXPECT_FALSE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, subsequent_offer.get())
EXPECT_FALSE(transport_controller_
->SetLocalDescription(SdpType::kOffer,
subsequent_offer.get(),
remote_answer.get())
.ok());
}
@ -1912,11 +1969,13 @@ TEST_F(JsepTransportControllerTest,
nullptr);
remote_answer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Switch to grouping (kMid1Audio,kMid2Audio) and (kMid3Video,kMid4Video).
@ -1943,9 +2002,10 @@ TEST_F(JsepTransportControllerTest,
nullptr);
subsequent_offer->AddGroup(new_bundle_group1);
subsequent_offer->AddGroup(new_bundle_group2);
EXPECT_FALSE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, subsequent_offer.get())
EXPECT_FALSE(transport_controller_
->SetLocalDescription(SdpType::kOffer,
subsequent_offer.get(),
remote_answer.get())
.ok());
}
@ -1997,11 +2057,13 @@ TEST_F(JsepTransportControllerTest,
remote_answer->AddGroup(bundle_group1);
remote_answer->AddGroup(bundle_group2);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Switch to grouping (kMid1Audio,kMid3Video) and (kMid2Audio,kMid3Video).
@ -2028,9 +2090,10 @@ TEST_F(JsepTransportControllerTest,
nullptr);
subsequent_offer->AddGroup(new_bundle_group1);
subsequent_offer->AddGroup(new_bundle_group2);
EXPECT_FALSE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, subsequent_offer.get())
EXPECT_FALSE(transport_controller_
->SetLocalDescription(SdpType::kOffer,
subsequent_offer.get(),
remote_answer.get())
.ok());
}
@ -2065,11 +2128,13 @@ TEST_F(JsepTransportControllerTest, BundleSubsetOfMediaSections) {
local_offer->AddGroup(bundle_group);
remote_answer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Verifiy that only `kAudio1` and `kVideo1` are bundled.
@ -2106,11 +2171,13 @@ TEST_F(JsepTransportControllerTest, BundleOnDataSectionInSubsequentOffer) {
local_offer->AddGroup(bundle_group);
remote_answer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
auto data_transport = transport_controller_->GetRtpTransport(kDataMid1);
@ -2132,15 +2199,17 @@ TEST_F(JsepTransportControllerTest, BundleOnDataSectionInSubsequentOffer) {
bundle_group.AddContentName(kAudioMid1);
bundle_group.AddContentName(kVideoMid1);
local_offer->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE);
remote_answer->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE);
local_offer->AddGroup(bundle_group);
remote_answer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
->SetLocalDescription(SdpType::kOffer, local_offer.get(),
remote_answer.get())
.ok());
remote_answer->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE);
remote_answer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
auto audio_transport = transport_controller_->GetRtpTransport(kAudioMid1);
@ -2186,11 +2255,13 @@ TEST_F(JsepTransportControllerTest, VideoDataRejectedInAnswer) {
local_offer->AddGroup(bundle_group);
remote_answer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Verify the RtpTransport/DtlsTransport is destroyed correctly.
@ -2233,11 +2304,13 @@ TEST_F(JsepTransportControllerTest, ChangeBundledMidNotSupported) {
local_offer->AddGroup(bundle_group);
remote_answer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
EXPECT_EQ(transport_controller_->GetRtpTransport(kAudioMid1),
transport_controller_->GetRtpTransport(kVideoMid1));
@ -2245,15 +2318,17 @@ TEST_F(JsepTransportControllerTest, ChangeBundledMidNotSupported) {
// Reorder the bundle group.
EXPECT_TRUE(bundle_group.RemoveContentName(kAudioMid1));
bundle_group.AddContentName(kAudioMid1);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(),
remote_answer.get())
.ok());
// The answerer uses the new bundle group and now the bundle mid is changed to
// `kVideo1`.
remote_answer->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE);
remote_answer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
.ok());
EXPECT_FALSE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
}
// Test that rejecting only the first m= section of a BUNDLE group is treated as
@ -2294,18 +2369,21 @@ TEST_F(JsepTransportControllerTest, RejectFirstContentInBundleGroup) {
local_offer->AddGroup(bundle_group);
remote_answer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_FALSE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Reject all the contents.
remote_answer->contents()[1].rejected = true;
remote_answer->contents()[2].rejected = true;
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
EXPECT_EQ(nullptr, transport_controller_->GetRtpTransport(kAudioMid1));
EXPECT_EQ(nullptr, transport_controller_->GetRtpTransport(kVideoMid1));
@ -2325,8 +2403,9 @@ TEST_F(JsepTransportControllerTest, ApplyNonRtcpMuxOfferWhenMuxingRequired) {
local_offer->contents()[0].media_description()->set_rtcp_mux(false);
// Applying a non-RTCP-mux offer is expected to fail.
EXPECT_FALSE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_FALSE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
}
@ -2340,8 +2419,9 @@ TEST_F(JsepTransportControllerTest, ApplyNonRtcpMuxAnswerWhenMuxingRequired) {
AddAudioSection(local_offer.get(), kAudioMid1, kIceUfrag1, kIcePwd1,
cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_ACTPASS,
nullptr);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
auto remote_answer = std::make_unique<cricket::SessionDescription>();
@ -2351,7 +2431,8 @@ TEST_F(JsepTransportControllerTest, ApplyNonRtcpMuxAnswerWhenMuxingRequired) {
// Applying a non-RTCP-mux answer is expected to fail.
remote_answer->contents()[0].media_description()->set_rtcp_mux(false);
EXPECT_FALSE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
}
@ -2371,11 +2452,13 @@ TEST_F(JsepTransportControllerTest,
answer_bundle_group.AddContentName(kAudioMid1);
answer_bundle_group.AddContentName(kVideoMid1);
remote_answer->AddGroup(answer_bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_FALSE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
}
@ -2392,11 +2475,13 @@ TEST_F(JsepTransportControllerTest, RejectBundleGroupWithNonExistingMid) {
local_offer->AddGroup(invalid_bundle_group);
remote_answer->AddGroup(invalid_bundle_group);
EXPECT_FALSE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_FALSE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_FALSE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
}
@ -2407,16 +2492,19 @@ TEST_F(JsepTransportControllerTest, RemoveContentFromBundleGroup) {
auto local_offer = CreateSessionDescriptionWithBundleGroup();
auto remote_answer = CreateSessionDescriptionWithBundleGroup();
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Do an re-offer/answer.
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
->SetLocalDescription(SdpType::kOffer, local_offer.get(),
remote_answer.get())
.ok());
auto new_answer = CreateSessionDescriptionWithoutBundle();
cricket::ContentGroup new_bundle_group(cricket::GROUP_TYPE_BUNDLE);
@ -2427,7 +2515,8 @@ TEST_F(JsepTransportControllerTest, RemoveContentFromBundleGroup) {
// Applying invalid answer is expected to fail.
EXPECT_FALSE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, new_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
new_answer.get())
.ok());
// Rejected the video content.
@ -2435,7 +2524,8 @@ TEST_F(JsepTransportControllerTest, RemoveContentFromBundleGroup) {
ASSERT_TRUE(video_content);
video_content->rejected = true;
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, new_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
new_answer.get())
.ok());
}
@ -2453,14 +2543,16 @@ TEST_F(JsepTransportControllerTest, ChangeTaggedMediaSectionMaxBundle) {
cricket::ContentGroup bundle_group(cricket::GROUP_TYPE_BUNDLE);
bundle_group.AddContentName(kAudioMid1);
local_offer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
std::unique_ptr<cricket::SessionDescription> remote_answer(
local_offer->Clone());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
std::unique_ptr<cricket::SessionDescription> local_reoffer(
@ -2475,13 +2567,14 @@ TEST_F(JsepTransportControllerTest, ChangeTaggedMediaSectionMaxBundle) {
local_reoffer->AddGroup(new_bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_reoffer.get())
->SetLocalDescription(SdpType::kOffer, local_reoffer.get(),
remote_answer.get())
.ok());
std::unique_ptr<cricket::SessionDescription> remote_reanswer(
local_reoffer->Clone());
EXPECT_TRUE(
transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_reanswer.get())
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, local_reoffer.get(),
remote_reanswer.get())
.ok());
}
@ -2496,11 +2589,13 @@ TEST_F(JsepTransportControllerTest, RollbackRestoresRejectedTransport) {
nullptr);
std::unique_ptr<cricket::SessionDescription> remote_answer(
local_offer->Clone());
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
auto mid1_transport = transport_controller_->GetRtpTransport(kMid1Audio);
@ -2514,7 +2609,8 @@ TEST_F(JsepTransportControllerTest, RollbackRestoresRejectedTransport) {
local_reoffer->contents()[0].rejected = true;
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_reoffer.get())
->SetLocalDescription(SdpType::kOffer, local_reoffer.get(),
remote_answer.get())
.ok());
auto old_mid1_transport = mid1_transport;
mid1_transport = transport_controller_->GetRtpTransport(kMid1Audio);
@ -2556,11 +2652,13 @@ TEST_F(JsepTransportControllerTest, RollbackRestoresPreviousTransportMapping) {
std::unique_ptr<cricket::SessionDescription> remote_answer(
local_offer->Clone());
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
auto mid1_transport = transport_controller_->GetRtpTransport(kMid1Audio);
@ -2585,7 +2683,8 @@ TEST_F(JsepTransportControllerTest, RollbackRestoresPreviousTransportMapping) {
local_reoffer->AddGroup(bundle_group);
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_reoffer.get())
->SetLocalDescription(SdpType::kOffer, local_reoffer.get(),
remote_answer.get())
.ok());
// Store the old transport pointer and verify that the offer actually changed
@ -2633,11 +2732,13 @@ TEST_F(JsepTransportControllerTest, RollbackAndAddToDifferentBundleGroup) {
std::unique_ptr<cricket::SessionDescription> remote_answer(
local_offer->Clone());
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get())
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, local_offer.get(), nullptr)
.ok());
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kAnswer, remote_answer.get())
->SetRemoteDescription(SdpType::kAnswer, local_offer.get(),
remote_answer.get())
.ok());
// Apply an offer that adds kMid3Audio to the first BUNDLE group.,
@ -2657,9 +2758,10 @@ TEST_F(JsepTransportControllerTest, RollbackAndAddToDifferentBundleGroup) {
subsequent_offer_1->AddGroup(modified_bundle_group1);
subsequent_offer_1->AddGroup(bundle_group2);
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, subsequent_offer_1.get())
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer,
subsequent_offer_1.get(),
remote_answer.get())
.ok());
auto mid1_transport = transport_controller_->GetRtpTransport(kMid1Audio);
@ -2689,9 +2791,10 @@ TEST_F(JsepTransportControllerTest, RollbackAndAddToDifferentBundleGroup) {
subsequent_offer_2->AddGroup(bundle_group1);
subsequent_offer_2->AddGroup(modified_bundle_group2);
EXPECT_TRUE(
transport_controller_
->SetLocalDescription(SdpType::kOffer, subsequent_offer_2.get())
EXPECT_TRUE(transport_controller_
->SetLocalDescription(SdpType::kOffer,
subsequent_offer_2.get(),
remote_answer.get())
.ok());
mid1_transport = transport_controller_->GetRtpTransport(kMid1Audio);
@ -2722,8 +2825,8 @@ TEST_F(JsepTransportControllerTest, BundleOnlySectionDoesNotNeedRtcpMux) {
offer->contents()[1].media_description()->set_rtcp_mux(false);
offer->contents()[1].bundle_only = true;
EXPECT_TRUE(
transport_controller_->SetRemoteDescription(SdpType::kOffer, offer.get())
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kOffer, nullptr, offer.get())
.ok());
}
@ -2738,8 +2841,8 @@ TEST_F(JsepTransportControllerTest,
AddAudioSection(offer.get(), kAudioMid1, kIceUfrag1, kIcePwd1,
cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_ACTPASS,
nullptr);
EXPECT_TRUE(
transport_controller_->SetRemoteDescription(SdpType::kOffer, offer.get())
EXPECT_TRUE(transport_controller_
->SetRemoteDescription(SdpType::kOffer, nullptr, offer.get())
.ok());
}

View file

@ -2011,8 +2011,11 @@ RTCError SdpOfferAnswerHandler::ReplaceRemoteDescription(
const cricket::SessionDescription* session_desc =
remote_description()->description();
const auto* local = local_description();
// NOTE: This will perform a BlockingCall() to the network thread.
return transport_controller_s()->SetRemoteDescription(sdp_type, session_desc);
return transport_controller_s()->SetRemoteDescription(
sdp_type, local ? local->description() : nullptr, session_desc);
}
void SdpOfferAnswerHandler::ApplyRemoteDescription(
@ -4954,13 +4957,15 @@ RTCError SdpOfferAnswerHandler::PushdownTransportDescription(
if (source == cricket::CS_LOCAL) {
const SessionDescriptionInterface* sdesc = local_description();
RTC_DCHECK(sdesc);
return transport_controller_s()->SetLocalDescription(type,
sdesc->description());
const auto* remote = remote_description();
return transport_controller_s()->SetLocalDescription(
type, sdesc->description(), remote ? remote->description() : nullptr);
} else {
const SessionDescriptionInterface* sdesc = remote_description();
RTC_DCHECK(sdesc);
return transport_controller_s()->SetRemoteDescription(type,
sdesc->description());
const auto* local = local_description();
return transport_controller_s()->SetRemoteDescription(
type, local ? local->description() : nullptr, sdesc->description());
}
}

View file

@ -173,7 +173,9 @@ void ScenarioIceConnectionImpl::SetRemoteSdp(SdpType type,
});
auto res = jsep_controller_->SetRemoteDescription(
remote_description_->GetType(), remote_description_->description());
remote_description_->GetType(),
local_description_ ? local_description_->description() : nullptr,
remote_description_->description());
RTC_CHECK(res.ok()) << res.message();
RtpDemuxerCriteria criteria;
for (const auto& content : remote_description_->description()->contents()) {
@ -203,7 +205,8 @@ void ScenarioIceConnectionImpl::SetLocalSdp(SdpType type,
RTC_DCHECK_RUN_ON(signaling_thread_);
local_description_ = webrtc::CreateSessionDescription(type, local_sdp);
auto res = jsep_controller_->SetLocalDescription(
local_description_->GetType(), local_description_->description());
local_description_->GetType(), local_description_->description(),
remote_description_ ? remote_description_->description() : nullptr);
RTC_CHECK(res.ok()) << res.message();
jsep_controller_->MaybeStartGathering();
}