Some refactoring to allow for ice-tcp (non pseudotcp reliable)
authorYouness Alaoui <youness.alaoui@collabora.co.uk>
Tue, 1 Apr 2014 01:13:14 +0000 (21:13 -0400)
committerOlivier Crête <olivier.crete@ocrete.ca>
Thu, 15 May 2014 13:38:47 +0000 (09:38 -0400)
agent/agent-priv.h
agent/agent.c
agent/component.c
agent/conncheck.c

index 37e908c..7b83383 100644 (file)
@@ -184,8 +184,8 @@ void agent_signal_new_selected_pair (
   NiceAgent *agent,
   guint stream_id,
   guint component_id,
-  const gchar *local_foundation,
-  const gchar *remote_foundation);
+  NiceCandidate *lcandidate,
+  NiceCandidate *rcandidate);
 
 void agent_signal_component_state_change (
   NiceAgent *agent,
index d74262c..dd11c99 100644 (file)
@@ -1610,7 +1610,8 @@ process_queued_tcp_packets (NiceAgent *agent, Stream *stream,
   }
 }
 
-void agent_signal_new_selected_pair (NiceAgent *agent, guint stream_id, guint component_id, const gchar *local_foundation, const gchar *remote_foundation)
+void agent_signal_new_selected_pair (NiceAgent *agent, guint stream_id,
+    guint component_id, NiceCandidate *lcandidate, NiceCandidate *rcandidate)
 {
   Component *component;
   Stream *stream;
@@ -1620,23 +1621,29 @@ void agent_signal_new_selected_pair (NiceAgent *agent, guint stream_id, guint co
     return;
 
   if (component->selected_pair.local->type == NICE_CANDIDATE_TYPE_RELAYED) {
-    nice_turn_socket_set_peer (component->selected_pair.local->sockptr,
-                                   &component->selected_pair.remote->addr);
+    nice_turn_socket_set_peer (lcandidate->sockptr, &rcandidate->addr);
   }
 
-  if (component->tcp) {
-    process_queued_tcp_packets (agent, stream, component);
+  if(agent->reliable) {
+    if (lcandidate->transport == NICE_CANDIDATE_TRANSPORT_UDP) {
+      if (component->tcp) {
+        process_queued_tcp_packets (agent, stream, component);
 
-    pseudo_tcp_socket_connect (component->tcp);
-    pseudo_tcp_socket_notify_mtu (component->tcp, MAX_TCP_MTU);
-    adjust_tcp_clock (agent, stream, component);
-  } else if(agent->reliable) {
-    nice_debug ("New selected pair received when pseudo tcp socket in error");
-    return;
+        pseudo_tcp_socket_connect (component->tcp);
+        pseudo_tcp_socket_notify_mtu (component->tcp, MAX_TCP_MTU);
+        adjust_tcp_clock (agent, stream, component);
+      } else {
+        nice_debug ("New reliable UDP pair selected but pseudo tcp socket in error");
+        return;
+      }
+    } else {
+      nice_debug ("ICE-TCP not yet supported");
+      return;
+    }
   }
 
   agent_queue_signal (agent, signals[SIGNAL_NEW_SELECTED_PAIR],
-      stream_id, component_id, local_foundation, remote_foundation);
+      stream_id, component_id, lcandidate->foundation, rcandidate->foundation);
 }
 
 void agent_signal_new_candidate (NiceAgent *agent, NiceCandidate *candidate)
@@ -3505,27 +3512,7 @@ nice_agent_send_messages_nonblocking_internal (
 
   /* FIXME: Cancellation isn’t yet supported, but it doesn’t matter because
    * we only deal with non-blocking writes. */
-
-  if (component->tcp != NULL) {
-    /* Send on the pseudo-TCP socket. */
-    n_sent = pseudo_tcp_socket_send_messages (component->tcp, messages,
-        n_messages, allow_partial, &child_error);
-    adjust_tcp_clock (agent, stream, component);
-
-    if (!pseudo_tcp_socket_can_send (component->tcp))
-      g_cancellable_reset (component->tcp_writable_cancellable);
-    if (n_sent < 0 && !g_error_matches (child_error, G_IO_ERROR,
-            G_IO_ERROR_WOULD_BLOCK)) {
-      /* Signal errors */
-      priv_pseudo_tcp_error (agent, stream, component);
-    }
-  } else if (agent->reliable) {
-    g_set_error (&child_error, G_IO_ERROR, G_IO_ERROR_FAILED,
-        "Error writing data to failed pseudo-TCP socket.");
-  } else if (component->selected_pair.local != NULL) {
-    NiceSocket *sock;
-    NiceAddress *addr;
-
+  if (component->selected_pair.local != NULL) {
     if (nice_debug_is_enabled ()) {
       gchar tmpbuf[INET6_ADDRSTRLEN];
       nice_address_to_string (&component->selected_pair.remote->addr, tmpbuf);
@@ -3535,17 +3522,45 @@ nice_agent_send_messages_nonblocking_internal (
           nice_address_get_port (&component->selected_pair.remote->addr));
     }
 
-    sock = component->selected_pair.local->sockptr;
-    addr = &component->selected_pair.remote->addr;
+    if(agent->reliable) {
+      if (component->selected_pair.local->transport == NICE_CANDIDATE_TRANSPORT_UDP) {
+        if (component->tcp != NULL) {
+          /* Send on the pseudo-TCP socket. */
+          n_sent = pseudo_tcp_socket_send_messages (component->tcp, messages,
+              n_messages, allow_partial, &child_error);
+          adjust_tcp_clock (agent, stream, component);
+
+          if (!pseudo_tcp_socket_can_send (component->tcp))
+            g_cancellable_reset (component->tcp_writable_cancellable);
+          if (n_sent < 0 && !g_error_matches (child_error, G_IO_ERROR,
+                  G_IO_ERROR_WOULD_BLOCK)) {
+            /* Signal errors */
+            priv_pseudo_tcp_error (agent, stream, component);
+          }
+        } else {
+          g_set_error (&child_error, G_IO_ERROR, G_IO_ERROR_FAILED,
+              "Error writing data to failed pseudo-TCP socket.");
+        }
+      } else {
+          g_set_error (&child_error, G_IO_ERROR, G_IO_ERROR_FAILED,
+              "ICE-TCP not yet supported.");
+      }
+    } else {
+      NiceSocket *sock;
+      NiceAddress *addr;
 
-    n_sent = nice_socket_send_messages (sock, addr, messages, n_messages);
+      sock = component->selected_pair.local->sockptr;
+      addr = &component->selected_pair.remote->addr;
 
-    if (n_sent < 0) {
-      g_set_error (&child_error, G_IO_ERROR, G_IO_ERROR_FAILED,
-          "Error writing data to socket.");
-    } else if (allow_partial) {
-      g_assert (n_messages == 1);
-      n_sent = output_message_get_size (messages);
+      n_sent = nice_socket_send_messages (sock, addr, messages, n_messages);
+
+      if (n_sent < 0) {
+        g_set_error (&child_error, G_IO_ERROR, G_IO_ERROR_FAILED,
+            "Error writing data to socket.");
+      } else if (allow_partial) {
+        g_assert (n_messages == 1);
+        n_sent = output_message_get_size (messages);
+      }
     }
   } else {
     /* Socket isn’t properly open yet. */
@@ -4061,7 +4076,8 @@ nice_agent_set_selected_pair (
 
   /* step: set the selected pair */
   component_update_selected_pair (component, &pair);
-  agent_signal_new_selected_pair (agent, stream_id, component_id, lfoundation, rfoundation);
+  agent_signal_new_selected_pair (agent, stream_id, component_id,
+      pair.local, pair.remote);
 
   ret = TRUE;
 
@@ -4189,8 +4205,7 @@ nice_agent_set_selected_remote_candidate (
   agent_signal_component_state_change (agent, stream_id, component_id, NICE_COMPONENT_STATE_READY);
 
   agent_signal_new_selected_pair (agent, stream_id, component_id,
-      lcandidate->foundation,
-      candidate->foundation);
+      lcandidate, candidate);
 
   ret = TRUE;
 
index 3c2d6a2..21a5882 100644 (file)
@@ -375,6 +375,14 @@ void component_update_selected_pair (Component *component, const CandidatePair *
     component->selected_pair.keepalive.tick_source = NULL;
   }
 
+  if (component->selected_pair.local &&
+      component->selected_pair.local == component->turn_candidate) {
+    refresh_prune_candidate (component->agent, component->turn_candidate);
+    component_detach_socket (component, component->turn_candidate->sockptr);
+    nice_candidate_free (component->turn_candidate);
+    component->turn_candidate = NULL;
+  }
+
   memset (&component->selected_pair, 0, sizeof(CandidatePair));
 
   component->selected_pair.local = pair->local;
index cde50c3..1cfe631 100644 (file)
@@ -1115,35 +1115,23 @@ static GSList *priv_limit_conn_check_list_size (GSList *conncheck_list, guint up
  */
 static gboolean priv_update_selected_pair (NiceAgent *agent, Component *component, CandidateCheckPair *pair)
 {
+  CandidatePair cpair;
+
   g_assert (component);
   g_assert (pair);
-  if (pair->priority > component->selected_pair.priority) {
+  if (pair->priority > component->selected_pair.priority &&
+      component_find_pair (component, agent, pair->local->foundation,
+          pair->remote->foundation, &cpair)) {
     nice_debug ("Agent %p : changing SELECTED PAIR for component %u: %s:%s "
-        "(prio:%" G_GUINT64_FORMAT ").", agent, component->id, pair->local->foundation,
-        pair->remote->foundation, pair->priority);
-
-    if (component->selected_pair.keepalive.tick_source != NULL) {
-      g_source_destroy (component->selected_pair.keepalive.tick_source);
-      g_source_unref (component->selected_pair.keepalive.tick_source);
-      component->selected_pair.keepalive.tick_source = NULL;
-    }
-
-    if (component->selected_pair.local &&
-        component->selected_pair.local == component->turn_candidate) {
-      refresh_prune_candidate (agent, component->turn_candidate);
-      component_detach_socket (component, component->turn_candidate->sockptr);
-      nice_candidate_free (component->turn_candidate);
-      component->turn_candidate = NULL;
-    }
+        "(prio:%" G_GUINT64_FORMAT ").", agent, component->id,
+        pair->local->foundation, pair->remote->foundation, pair->priority);
 
-    memset (&component->selected_pair, 0, sizeof(CandidatePair));
-    component->selected_pair.local = pair->local;
-    component->selected_pair.remote = pair->remote;
-    component->selected_pair.priority = pair->priority;
+    component_update_selected_pair (component, &cpair);
 
     priv_conn_keepalive_tick_unlocked (agent);
 
-    agent_signal_new_selected_pair (agent, pair->stream_id, component->id, pair->local->foundation, pair->remote->foundation);
+    agent_signal_new_selected_pair (agent, pair->stream_id, component->id,
+        pair->local, pair->remote);
 
   }