From a4baa8b550f6da8cd3fe4bf62eb743c7984a7418 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Fri, 30 Aug 2024 11:19:51 +0530 Subject: [PATCH] Skip ICE restart on unestablished peer connection. (#2967) * Do not ICE restart on an idle/not yet started peer connection. * Skip ICE restart on unestablished peer connection. For publish only participants, the subscriber peer connection is not negotiated. So, ICE restart was hitting an error while trying to restart the SUBSCRIBER peer connection. * use ICE gathering state as peer connection state may not have changed if first offer/answer was missed --- pkg/rtc/transport.go | 9 ++++++++- pkg/rtc/transport_test.go | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/pkg/rtc/transport.go b/pkg/rtc/transport.go index de4f47dbf..860cc3551 100644 --- a/pkg/rtc/transport.go +++ b/pkg/rtc/transport.go @@ -1790,8 +1790,15 @@ func (t *PCTransport) doICERestart() error { return nil } + // if restart is requested, but negotiation never started + iceGatheringState := t.pc.ICEGatheringState() + if iceGatheringState == webrtc.ICEGatheringStateNew { + t.params.Logger.Debugw("skipping ICE restart on not yet started peer connection") + return nil + } + // if restart is requested, and we are not ready, then continue afterwards - if t.pc.ICEGatheringState() == webrtc.ICEGatheringStateGathering { + if iceGatheringState == webrtc.ICEGatheringStateGathering { t.params.Logger.Debugw("deferring ICE restart to after gathering") t.restartAfterGathering = true return nil diff --git a/pkg/rtc/transport_test.go b/pkg/rtc/transport_test.go index ab5cd5a88..c80b206ef 100644 --- a/pkg/rtc/transport_test.go +++ b/pkg/rtc/transport_test.go @@ -315,7 +315,7 @@ func TestFirstAnswerMissedDuringICERestart(t *testing.T) { handlerA.OnOfferCalls(func(sd webrtc.SessionDescription) error { offerCount.Inc() - // the second offer is a ice restart offer, so we wait transportB complete the ice gathering + // the second offer is a ice restart offer, so we wait for transportB to complete ICE gathering if transportB.pc.ICEGatheringState() == webrtc.ICEGatheringStateGathering { require.Eventually(t, func() bool { return transportB.pc.ICEGatheringState() == webrtc.ICEGatheringStateComplete