Skip to content

Commit

Permalink
Add option to disable close by dtls
Browse files Browse the repository at this point in the history
Close peerconnection on DTLS.CloseNotify
could break ice restart with dtls restart,
when the dtls finger-print changed, the
browser could teardown the old dtlstransport
and establish new one then pion could close
the peerconnection and restart failed. So
browser don't do this and spec also don't
say peerconnection should close when dtls
is closed.
  • Loading branch information
cnderrauber authored and Sean-Der committed Nov 29, 2024
1 parent 2553783 commit 8e2c868
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 1 deletion.
2 changes: 1 addition & 1 deletion peerconnection.go
Original file line number Diff line number Diff line change
Expand Up @@ -2417,7 +2417,7 @@ func (pc *PeerConnection) startTransports(iceRole ICERole, dtlsRole DTLSRole, re
}

pc.dtlsTransport.internalOnCloseHandler = func() {
if pc.isClosed.get() {
if pc.isClosed.get() || pc.api.settingEngine.disableCloseByDTLS {
return
}

Expand Down
8 changes: 8 additions & 0 deletions settingengine.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ type SettingEngine struct {
receiveMTU uint
iceMaxBindingRequests *uint16
fireOnTrackBeforeFirstRTP bool
disableCloseByDTLS bool
}

// getReceiveMTU returns the configured MTU. If SettingEngine's MTU is configured to 0 it returns the default
Expand Down Expand Up @@ -501,3 +502,10 @@ func (e *SettingEngine) SetICEBindingRequestHandler(bindingRequestHandler func(m
func (e *SettingEngine) SetFireOnTrackBeforeFirstRTP(fireOnTrackBeforeFirstRTP bool) {
e.fireOnTrackBeforeFirstRTP = fireOnTrackBeforeFirstRTP
}

// DisableCloseByDTLS sets if the connection should be closed when dtls transport is closed.
// Setting this to true will keep the connection open when dtls transport is closed
// and relies on the ice failed state to detect the connection is interrupted.
func (e *SettingEngine) DisableCloseByDTLS(isEnabled bool) {
e.disableCloseByDTLS = isEnabled
}
23 changes: 23 additions & 0 deletions settingengine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -394,3 +394,26 @@ func TestSetFireOnTrackBeforeFirstRTP(t *testing.T) {

closePairNow(t, offerer, answerer)
}

func TestDisableCloseByDTLS(t *testing.T) {
lim := test.TimeOut(time.Second * 30)
defer lim.Stop()

report := test.CheckRoutines(t)
defer report()

s := SettingEngine{}
s.DisableCloseByDTLS(true)

offer, answer, err := NewAPI(WithSettingEngine(s)).newPair(Configuration{})
assert.NoError(t, err)

assert.NoError(t, signalPair(offer, answer))

untilConnectionState(PeerConnectionStateConnected, offer, answer).Wait()
assert.NoError(t, answer.Close())

time.Sleep(time.Second)
assert.True(t, offer.ConnectionState() == PeerConnectionStateConnected)
assert.NoError(t, offer.Close())
}

0 comments on commit 8e2c868

Please sign in to comment.