@@ -1108,7 +1108,59 @@ func (pc *PeerConnection) SetRemoteDescription(desc SessionDescription) error {
11081108 pc .ops .Enqueue (func () {
11091109 pc .startRTP (true , & desc , currentTransceivers )
11101110 })
1111+ } else if pc .dtlsTransport .State () != DTLSTransportStateNew {
1112+ fingerprint , fingerprintHash , fErr := extractFingerprint (desc .parsed )
1113+ if fErr != nil {
1114+ return fErr
1115+ }
1116+
1117+ fingerPrintDidChange := true
1118+
1119+ for _ , fp := range pc .dtlsTransport .remoteParameters .Fingerprints {
1120+ if fingerprint == fp .Value && fingerprintHash == fp .Algorithm {
1121+ fingerPrintDidChange = false
1122+ break
1123+ }
1124+ }
1125+
1126+ if fingerPrintDidChange {
1127+ pc .ops .Enqueue (func () {
1128+ // SCTP uses DTLS, so prevent any use, by locking, while
1129+ // DTLS is restarting.
1130+ pc .sctpTransport .lock .Lock ()
1131+ defer pc .sctpTransport .lock .Unlock ()
1132+
1133+ if dErr := pc .dtlsTransport .Stop (); dErr != nil {
1134+ pc .log .Warnf ("Failed to stop DTLS: %s" , dErr )
1135+ }
1136+
1137+ // libwebrtc switches the connection back to `new`.
1138+ pc .dtlsTransport .lock .Lock ()
1139+ pc .dtlsTransport .onStateChange (DTLSTransportStateNew )
1140+ pc .dtlsTransport .lock .Unlock ()
1141+
1142+ // Restart the dtls transport with updated fingerprints
1143+ err = pc .dtlsTransport .Start (DTLSParameters {
1144+ Role : dtlsRoleFromRemoteSDP (desc .parsed ),
1145+ Fingerprints : []DTLSFingerprint {{Algorithm : fingerprintHash , Value : fingerprint }},
1146+ })
1147+ pc .updateConnectionState (pc .ICEConnectionState (), pc .dtlsTransport .State ())
1148+ if err != nil {
1149+ pc .log .Warnf ("Failed to restart DTLS: %s" , err )
1150+ return
1151+ }
1152+
1153+ // If SCTP was enabled, restart it with the new DTLS transport.
1154+ if pc .sctpTransport .isStarted {
1155+ if dErr := pc .sctpTransport .restart (pc .dtlsTransport .conn ); dErr != nil {
1156+ pc .log .Warnf ("Failed to restart SCTP: %s" , dErr )
1157+ return
1158+ }
1159+ }
1160+ })
1161+ }
11111162 }
1163+
11121164 return nil
11131165 }
11141166
@@ -1317,7 +1369,7 @@ func (pc *PeerConnection) startSCTP() {
13171369 var openedDCCount uint32
13181370 for _ , d := range dataChannels {
13191371 if d .ReadyState () == DataChannelStateConnecting {
1320- err := d .open (pc .sctpTransport )
1372+ err := d .open (pc .sctpTransport , false )
13211373 if err != nil {
13221374 pc .log .Warnf ("failed to open data channel: %s" , err )
13231375 continue
@@ -1775,7 +1827,7 @@ func (pc *PeerConnection) CreateDataChannel(label string, options *DataChannelIn
17751827
17761828 // If SCTP already connected open all the channels
17771829 if pc .sctpTransport .State () == SCTPTransportStateConnected {
1778- if err = d .open (pc .sctpTransport ); err != nil {
1830+ if err = d .open (pc .sctpTransport , false ); err != nil {
17791831 return nil , err
17801832 }
17811833 }
0 commit comments