webrtc nice: Let libnice handle STUN/TURN DNS resolution
authorOlivier Crête <olivier.crete@collabora.com>
Mon, 2 Jan 2023 00:19:03 +0000 (19:19 -0500)
committerOlivier Crête <olivier.crete@ocrete.ca>
Sat, 7 Jan 2023 16:03:23 +0000 (16:03 +0000)
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3676>

subprojects/gst-plugins-bad/gst-libs/gst/webrtc/nice/nice.c

index 0cbb61a..d7feae1 100644 (file)
@@ -392,48 +392,23 @@ resolve_host_finish (GstWebRTCNice * ice, GAsyncResult * res, GError ** error)
   return g_task_propagate_pointer (G_TASK (res), error);
 }
 
-struct turn_server_data
-{
-  GstUri *uri;
-  guint nice_stream_id;
-};
-
-static void
-turn_server_data_free (struct turn_server_data *data)
-{
-  gst_uri_unref (data->uri);
-
-  g_free (data);
-}
-
 static void
-on_turn_server_resolved (GstWebRTCICE * ice, GAsyncResult * res,
-    struct turn_server_data *user_data)
+_add_turn_server (GstWebRTCNice * ice, struct NiceStreamItem *item,
+    GstUri * turn_server)
 {
-  GList *addresses;
-  GError *error = NULL;
-  GstUri *turn_server = user_data->uri;
-  gboolean ret;
+  GstWebRTCNice *nice = GST_WEBRTC_NICE (ice);
+  const gchar *host;
+  NiceRelayType relays[4] = { 0, };
   gchar *user, *pass;
   const gchar *userinfo, *transport, *scheme;
-  NiceRelayType relays[4] = { 0, };
   int i, relay_n = 0;
-  gchar *ip = NULL;
-  GstWebRTCNice *nice = GST_WEBRTC_NICE (ice);
 
-  if (!(addresses = resolve_host_finish (nice, res, &error))) {
-    GST_WARNING_OBJECT (ice, "failed to resolve turn address: %s",
-        error->message);
-    g_clear_error (&error);
+  host = gst_uri_get_host (turn_server);
+  if (!host) {
+    GST_ERROR_OBJECT (ice, "Turn server has no host");
     return;
   }
 
-  /* XXX: only the first IP is used */
-  ip = g_inet_address_to_string (addresses->data);
-
-  /* Set the resolved IP as the host since that's what libnice wants */
-  gst_uri_set_host (turn_server, ip);
-
   scheme = gst_uri_get_scheme (turn_server);
   transport = gst_uri_get_query_value (turn_server, "transport");
   userinfo = gst_uri_get_userinfo (turn_server);
@@ -450,42 +425,20 @@ on_turn_server_resolved (GstWebRTCICE * ice, GAsyncResult * res,
   g_assert (relay_n < G_N_ELEMENTS (relays));
 
   for (i = 0; i < relay_n; i++) {
-    ret = nice_agent_set_relay_info (nice->priv->nice_agent,
-        user_data->nice_stream_id, NICE_COMPONENT_TYPE_RTP,
-        gst_uri_get_host (turn_server), gst_uri_get_port (turn_server),
-        user, pass, relays[i]);
-    if (!ret) {
-      gchar *uri = gst_uri_to_string (turn_server);
-      GST_ERROR_OBJECT (ice, "Failed to set TURN server '%s'", uri);
-      g_free (uri);
-      break;
+    if (!nice_agent_set_relay_info (nice->priv->nice_agent,
+            item->nice_stream_id, NICE_COMPONENT_TYPE_RTP,
+            gst_uri_get_host (turn_server), gst_uri_get_port (turn_server),
+            user, pass, relays[i])) {
+      gchar *uri_str = gst_uri_to_string (turn_server);
+      GST_ERROR_OBJECT (ice, "Could not set TURN server %s on libnice",
+          uri_str);
+      g_free (uri_str);
     }
   }
+
   g_free (user);
   g_free (pass);
 
-  g_free (ip);
-}
-
-static void
-_add_turn_server (GstWebRTCNice * ice, struct NiceStreamItem *item,
-    GstUri * turn_server)
-{
-  struct turn_server_data *data;
-  const gchar *host;
-
-  host = gst_uri_get_host (turn_server);
-  if (!host) {
-    GST_ERROR_OBJECT (ice, "Turn server has no host");
-    return;
-  }
-
-  data = g_new0 (struct turn_server_data, 1);
-  data->nice_stream_id = item->nice_stream_id;
-  data->uri = gst_uri_copy (turn_server);
-
-  resolve_host_async (ice, host, (GAsyncReadyCallback) on_turn_server_resolved,
-      data, (GDestroyNotify) turn_server_data_free);
 }
 
 typedef struct
@@ -502,31 +455,6 @@ _add_turn_server_func (const gchar * uri, GstUri * turn_server,
 }
 
 static void
-on_stun_server_resolved (GstWebRTCNice * ice, GAsyncResult * res,
-    gpointer user_data)
-{
-  GList *addresses;
-  GError *error = NULL;
-  guint port = GPOINTER_TO_UINT (user_data);
-  char *ip;
-
-  if (!(addresses = resolve_host_finish (ice, res, &error))) {
-    GST_WARNING_OBJECT (ice, "Failed to resolve stun server: %s",
-        error->message);
-    g_clear_error (&error);
-    return;
-  }
-
-  /* XXX: only the first IP is used */
-  ip = g_inet_address_to_string (addresses->data);
-
-  g_object_set (ice->priv->nice_agent, "stun-server", ip,
-      "stun-server-port", port, NULL);
-
-  g_free (ip);
-}
-
-static void
 _add_stun_server (GstWebRTCNice * ice, GstUri * stun_server)
 {
   const gchar *msg = "must be of the form stun://<host>:<port>";
@@ -550,8 +478,8 @@ _add_stun_server (GstWebRTCNice * ice, GstUri * stun_server)
     gst_uri_set_port (stun_server, port);
   }
 
-  resolve_host_async (ice, host, (GAsyncReadyCallback) on_stun_server_resolved,
-      GUINT_TO_POINTER (port), NULL);
+  g_object_set (ice->priv->nice_agent, "stun-server", host,
+      "stun-server-port", port, NULL);
 
 out:
   g_free (s);