@@ -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