From f760869c913df0fe74c9f68eb7b8e22ca19b0b2a Mon Sep 17 00:00:00 2001
From: Roxie Linden <roxie@lindenlab.com>
Date: Tue, 10 Oct 2023 09:52:51 -0700
Subject: generate ice candidate with proper formatting

---
 indra/llwebrtc/llwebrtc.cpp | 41 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 39 insertions(+), 2 deletions(-)

(limited to 'indra/llwebrtc')

diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp
index d8f2a6028c..b5b820e3da 100644
--- a/indra/llwebrtc/llwebrtc.cpp
+++ b/indra/llwebrtc/llwebrtc.cpp
@@ -683,6 +683,43 @@ void LLWebRTCImpl::OnConnectionChange(webrtc::PeerConnectionInterface::PeerConne
     }
 }
 
+static std::string iceCandidateToTrickleString(const webrtc::IceCandidateInterface *candidate)
+{
+    std::ostringstream candidate_stream;
+
+    candidate_stream <<
+        candidate->candidate().foundation() << " " <<
+        std::to_string(candidate->candidate().component()) << " " <<
+        candidate->candidate().protocol() << " " <<
+        std::to_string(candidate->candidate().priority()) << " " <<
+        candidate->candidate().address().ipaddr().ToString() << " " <<
+        candidate->candidate().address().PortAsString() << " typ ";
+    if (candidate->candidate().type() == cricket::LOCAL_PORT_TYPE)
+    {
+        candidate_stream << "host";
+    }
+    else if (candidate->candidate().type() == cricket::STUN_PORT_TYPE)
+    {
+        candidate_stream << "srflx " <<
+            "raddr " << candidate->candidate().related_address().ipaddr().ToString() << " " <<
+            "rport " << candidate->candidate().related_address().PortAsString();
+    }
+    else if (candidate->candidate().type() == cricket::RELAY_PORT_TYPE)
+    {
+        candidate_stream << "relay " <<
+            "raddr " << candidate->candidate().related_address().ipaddr().ToString() << " " <<
+            "rport " << candidate->candidate().related_address().PortAsString();
+    }
+    else if (candidate->candidate().type() == cricket::PRFLX_PORT_TYPE)
+    {
+        candidate_stream << "prflx " <<
+            "raddr " << candidate->candidate().related_address().ipaddr().ToString() << " " <<
+            "rport " << candidate->candidate().related_address().PortAsString();
+    }
+    
+    return candidate_stream.str();
+}
+
 void LLWebRTCImpl::OnIceCandidate(const webrtc::IceCandidateInterface *candidate)
 {
     RTC_LOG(LS_INFO) << __FUNCTION__ << " " << candidate->sdp_mline_index();
@@ -697,7 +734,7 @@ void LLWebRTCImpl::OnIceCandidate(const webrtc::IceCandidateInterface *candidate
         for (auto &observer : mSignalingObserverList)
         {
             LLWebRTCIceCandidate ice_candidate;
-            ice_candidate.candidate   = candidate->candidate().ToString();
+            ice_candidate.candidate   = iceCandidateToTrickleString(candidate);
             ice_candidate.mline_index = candidate->sdp_mline_index();
             ice_candidate.sdp_mid     = candidate->sdp_mid();
             observer->OnIceCandidate(ice_candidate);
@@ -781,7 +818,7 @@ void LLWebRTCImpl::OnSetRemoteDescriptionComplete(webrtc::RTCError error)
         for (auto &candidate : mCachedIceCandidates)
         {
             LLWebRTCIceCandidate ice_candidate;
-            ice_candidate.candidate   = candidate->candidate().ToString();
+            ice_candidate.candidate   = iceCandidateToTrickleString(candidate.get());
             ice_candidate.mline_index = candidate->sdp_mline_index();
             ice_candidate.sdp_mid     = candidate->sdp_mid();
             observer->OnIceCandidate(ice_candidate);
-- 
cgit v1.2.3