diff --git a/p2p/base/p2p_transport_channel.cc b/p2p/base/p2p_transport_channel.cc index ad002aedbb..f511fb915a 100644 --- a/p2p/base/p2p_transport_channel.cc +++ b/p2p/base/p2p_transport_channel.cc @@ -843,6 +843,13 @@ void P2PTransportChannel::MaybeStartGathering() { static_cast(IceRestartState::MAX_VALUE)); } + for (const auto& session : allocator_sessions_) { + if (session->IsStopped()) { + continue; + } + session->StopGettingPorts(); + } + // Time for a new allocator. std::unique_ptr pooled_session = allocator_->TakePooledSession(transport_name(), component(), diff --git a/p2p/base/p2p_transport_channel_unittest.cc b/p2p/base/p2p_transport_channel_unittest.cc index 2af2a7412e..0b9e1baa0a 100644 --- a/p2p/base/p2p_transport_channel_unittest.cc +++ b/p2p/base/p2p_transport_channel_unittest.cc @@ -6108,4 +6108,36 @@ INSTANTIATE_TEST_SUITE_P(GatherAfterConnectedTest, GatherAfterConnectedTest, ::testing::Values(true, false)); +// Tests no candidates are generated with old ice ufrag/passwd after an ice +// restart even if continual gathering is enabled. +TEST_F(P2PTransportChannelTest, TestIceNoOldCandidatesAfterIceRestart) { + rtc::ScopedFakeClock clock; + AddAddress(0, kAlternateAddrs[0]); + ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags, + kDefaultPortAllocatorFlags); + + // gathers continually. + IceConfig config = CreateIceConfig(1000, GATHER_CONTINUALLY); + CreateChannels(config, config); + + EXPECT_TRUE_SIMULATED_WAIT(CheckConnected(ep1_ch1(), ep2_ch1()), + kDefaultTimeout, clock); + + PauseCandidates(0); + + ep1_ch1()->SetIceParameters(kIceParams[3]); + ep1_ch1()->MaybeStartGathering(); + + EXPECT_TRUE_SIMULATED_WAIT(GetEndpoint(0)->saved_candidates_.size() > 0, + kDefaultTimeout, clock); + + for (const auto& cd : GetEndpoint(0)->saved_candidates_) { + for (const auto& c : cd->candidates) { + EXPECT_EQ(c.username(), kIceUfrag[3]); + } + } + + DestroyChannels(); +} + } // namespace cricket diff --git a/rtc_base/fake_network.h b/rtc_base/fake_network.h index 8bd50b69f0..1bbdd460a0 100644 --- a/rtc_base/fake_network.h +++ b/rtc_base/fake_network.h @@ -70,10 +70,11 @@ class FakeNetworkManager : public NetworkManagerBase, ++start_count_; if (start_count_ == 1) { sent_first_update_ = false; - rtc::Thread::Current()->Post(RTC_FROM_HERE, this); + rtc::Thread::Current()->Post(RTC_FROM_HERE, this, kUpdateNetworksMessage); } else { if (sent_first_update_) { - SignalNetworksChanged(); + rtc::Thread::Current()->Post(RTC_FROM_HERE, this, + kSignalNetworksMessage); } } } @@ -81,7 +82,15 @@ class FakeNetworkManager : public NetworkManagerBase, void StopUpdating() override { --start_count_; } // MessageHandler interface. - void OnMessage(Message* msg) override { DoUpdateNetworks(); } + void OnMessage(Message* msg) override { + if (msg->message_id == kUpdateNetworksMessage) { + DoUpdateNetworks(); + } else if (msg->message_id == kSignalNetworksMessage) { + SignalNetworksChanged(); + } else { + RTC_CHECK(false); + } + } using NetworkManagerBase::set_default_local_addresses; using NetworkManagerBase::set_enumeration_permission; @@ -129,6 +138,9 @@ class FakeNetworkManager : public NetworkManagerBase, int start_count_ = 0; bool sent_first_update_ = false; + static constexpr uint32_t kUpdateNetworksMessage = 1; + static constexpr uint32_t kSignalNetworksMessage = 2; + std::unique_ptr mdns_responder_; };