From 4e36f8631a8ab4ad23dafb379c4da32135563a42 Mon Sep 17 00:00:00 2001 From: Oto Dusek Date: Tue, 30 May 2023 10:54:46 +0200 Subject: [PATCH 1/3] Use ICE role to set DTLS role in answer --- webrtc/src/peer_connection/mod.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webrtc/src/peer_connection/mod.rs b/webrtc/src/peer_connection/mod.rs index 841d121e5..0cc74ccf5 100644 --- a/webrtc/src/peer_connection/mod.rs +++ b/webrtc/src/peer_connection/mod.rs @@ -926,6 +926,9 @@ impl RTCPeerConnection { .to_connection_role(); if connection_role == ConnectionRole::Unspecified { connection_role = DEFAULT_DTLS_ROLE_ANSWER.to_connection_role(); + if remote_is_lite && !self.internal.setting_engine.candidates.ice_lite { + connection_role = DTLSRole::Server.to_connection_role(); + } } let local_transceivers = self.get_transceivers().await; From ab67071f6919db69073abdd59c54e2df67f8ed91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oto=20Du=C5=A1ek?= Date: Tue, 6 Jun 2023 09:38:35 +0200 Subject: [PATCH 2/3] Fix dtls role based on ice role --- webrtc/src/peer_connection/mod.rs | 32 ++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/webrtc/src/peer_connection/mod.rs b/webrtc/src/peer_connection/mod.rs index 0cc74ccf5..b5a2097db 100644 --- a/webrtc/src/peer_connection/mod.rs +++ b/webrtc/src/peer_connection/mod.rs @@ -907,9 +907,14 @@ impl RTCPeerConnection { _options: Option, ) -> Result { let use_identity = self.idp_login_url.is_some(); - if self.remote_description().await.is_none() { + let remote_desc = self.remote_description().await; + let remote_description: RTCSessionDescription; + if let Some(desc) = remote_desc { + remote_description = desc; + }else{ return Err(Error::ErrNoRemoteDescription); - } else if use_identity { + } + if use_identity { return Err(Error::ErrIdentityProviderNotImplemented); } else if self.internal.is_closed.load(Ordering::SeqCst) { return Err(Error::ErrConnectionClosed); @@ -926,8 +931,10 @@ impl RTCPeerConnection { .to_connection_role(); if connection_role == ConnectionRole::Unspecified { connection_role = DEFAULT_DTLS_ROLE_ANSWER.to_connection_role(); - if remote_is_lite && !self.internal.setting_engine.candidates.ice_lite { - connection_role = DTLSRole::Server.to_connection_role(); + if let Some(parsed) = remote_description.parsed { + if Self::is_lite_set(&parsed) && !self.internal.setting_engine.candidates.ice_lite { + connection_role = DTLSRole::Server.to_connection_role(); + } } } @@ -1299,6 +1306,15 @@ impl RTCPeerConnection { self.current_local_description().await } + pub fn is_lite_set(desc: &SessionDescription) -> bool{ + for a in &desc.attributes { + if a.key.trim() == ATTR_KEY_ICELITE { + return true; + } + } + return false; + } + /// set_remote_description sets the SessionDescription of the remote peer pub async fn set_remote_description(&self, mut desc: RTCSessionDescription) -> Result<()> { if self.internal.is_closed.load(Ordering::SeqCst) { @@ -1518,13 +1534,7 @@ impl RTCPeerConnection { return Ok(()); } - let mut remote_is_lite = false; - for a in &parsed.attributes { - if a.key.trim() == ATTR_KEY_ICELITE { - remote_is_lite = true; - break; - } - } + let remote_is_lite = Self::is_lite_set(parsed); let (fingerprint, fingerprint_hash) = extract_fingerprint(parsed)?; From a1c884474325f64bc3a1153594759c3ac5f19829 Mon Sep 17 00:00:00 2001 From: yngrtc <105481434+yngrtc@users.noreply.github.com> Date: Sun, 11 Jun 2023 20:50:48 -0700 Subject: [PATCH 3/3] Update mod.rs --- media/src/io/sample_builder/mod.rs | 5 +---- webrtc/src/peer_connection/mod.rs | 8 ++++---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/media/src/io/sample_builder/mod.rs b/media/src/io/sample_builder/mod.rs index de6e9adc2..c1ad17bf1 100644 --- a/media/src/io/sample_builder/mod.rs +++ b/media/src/io/sample_builder/mod.rs @@ -373,10 +373,7 @@ impl SampleBuilder { if self.prepared.empty() { return None; } - let result = std::mem::replace( - &mut self.prepared_samples[self.prepared.head as usize], - None, - ); + let result = self.prepared_samples[self.prepared.head as usize].take(); self.prepared.head = self.prepared.head.wrapping_add(1); result } diff --git a/webrtc/src/peer_connection/mod.rs b/webrtc/src/peer_connection/mod.rs index b5a2097db..f58b946ad 100644 --- a/webrtc/src/peer_connection/mod.rs +++ b/webrtc/src/peer_connection/mod.rs @@ -911,7 +911,7 @@ impl RTCPeerConnection { let remote_description: RTCSessionDescription; if let Some(desc) = remote_desc { remote_description = desc; - }else{ + } else { return Err(Error::ErrNoRemoteDescription); } if use_identity { @@ -931,7 +931,7 @@ impl RTCPeerConnection { .to_connection_role(); if connection_role == ConnectionRole::Unspecified { connection_role = DEFAULT_DTLS_ROLE_ANSWER.to_connection_role(); - if let Some(parsed) = remote_description.parsed { + if let Some(parsed) = remote_description.parsed { if Self::is_lite_set(&parsed) && !self.internal.setting_engine.candidates.ice_lite { connection_role = DTLSRole::Server.to_connection_role(); } @@ -1306,13 +1306,13 @@ impl RTCPeerConnection { self.current_local_description().await } - pub fn is_lite_set(desc: &SessionDescription) -> bool{ + pub fn is_lite_set(desc: &SessionDescription) -> bool { for a in &desc.attributes { if a.key.trim() == ATTR_KEY_ICELITE { return true; } } - return false; + false } /// set_remote_description sets the SessionDescription of the remote peer