[Pkg-telepathy-commits] [libnice] 248/265: component: Clear turn local candidates when clearing turn servers

Simon McVittie smcv at debian.org
Wed May 14 12:05:13 UTC 2014


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to branch debian
in repository libnice.

commit 69749bad4e2660db6dcf6460b3ac60235715ef5c
Author: Olivier Crête <olivier.crete at collabora.com>
Date:   Tue Apr 15 22:52:30 2014 -0400

    component: Clear turn local candidates when clearing turn servers
    
    But keep the turn connection that's currently being used if it is
    the selected candidate. Also clear the TURN candidate refresh.
---
 agent/component.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 agent/component.h |  2 +-
 agent/conncheck.c |  8 ++++++++
 agent/discovery.c | 23 ++++++++++++++++++++++-
 agent/discovery.h |  1 +
 5 files changed, 80 insertions(+), 3 deletions(-)

diff --git a/agent/component.c b/agent/component.c
index 3cd4855..3c2d6a2 100644
--- a/agent/component.c
+++ b/agent/component.c
@@ -51,6 +51,7 @@
 #include "debug.h"
 
 #include "component.h"
+#include "discovery.h"
 #include "agent-priv.h"
 
 
@@ -148,9 +149,48 @@ component_new (guint id, NiceAgent *agent, Stream *stream)
 void
 component_clean_turn_servers (Component *cmp)
 {
+  GSList *i;
 
   g_list_free_full (cmp->turn_servers, (GDestroyNotify) turn_server_unref);
   cmp->turn_servers = NULL;
+
+  for (i = cmp->local_candidates; i;) {
+    NiceCandidate *candidate = i->data;
+    GSList *next = i->next;
+
+    if (candidate->type != NICE_CANDIDATE_TYPE_RELAYED) {
+      i = next;
+      continue;
+    }
+
+    /* note: do not remove the remote candidate that is
+     *       currently part of the 'selected pair', see ICE
+     *       9.1.1.1. "ICE Restarts" (ID-19)
+     *
+     * So what we do instead is that we put the selected candidate
+     * in a special location and keep it "alive" that way. This is
+     * especially important for TURN, because refresh requests to the
+     * server need to keep happening.
+     */
+    if (candidate == cmp->selected_pair.local) {
+      if (cmp->turn_candidate) {
+        refresh_prune_candidate (cmp->agent, cmp->turn_candidate);
+        component_detach_socket (cmp, cmp->turn_candidate->sockptr);
+	nice_candidate_free (cmp->turn_candidate);
+      }
+      /* Bring the priority down to 0, so that it will be replaced
+       * on the new run.
+       */
+      cmp->selected_pair.priority = 0;
+      cmp->turn_candidate = candidate;
+    } else {
+      refresh_prune_candidate (cmp->agent, candidate);
+      component_detach_socket (cmp, candidate->sockptr);
+      nice_candidate_free (candidate);
+    }
+    cmp->local_candidates = g_slist_delete_link (cmp->local_candidates, i);
+    i = next;
+  }
 }
 
 void
@@ -174,6 +214,10 @@ component_free (Component *cmp)
     nice_candidate_free (cmp->restart_candidate),
       cmp->restart_candidate = NULL;
 
+  if (cmp->turn_candidate)
+    nice_candidate_free (cmp->turn_candidate),
+        cmp->turn_candidate = NULL;
+
   for (i = cmp->incoming_checks; i; i = i->next) {
     IncomingCheck *icheck = i->data;
     g_free (icheck->username);
@@ -181,9 +225,12 @@ component_free (Component *cmp)
   }
 
   g_slist_free (cmp->local_candidates);
+  cmp->local_candidates = NULL;
   g_slist_free (cmp->remote_candidates);
+  cmp->remote_candidates = NULL;
   component_free_socket_sources (cmp);
   g_slist_free (cmp->incoming_checks);
+  cmp->incoming_checks = NULL;
 
   component_clean_turn_servers (cmp);
 
@@ -285,7 +332,7 @@ component_restart (Component *cmp)
   for (i = cmp->remote_candidates; i; i = i->next) {
     NiceCandidate *candidate = i->data;
 
-    /* note: do not remove the remote candidate that is
+    /* note: do not remove the local candidate that is
      *       currently part of the 'selected pair', see ICE
      *       9.1.1.1. "ICE Restarts" (ID-19) */
     if (candidate == cmp->selected_pair.remote) {
diff --git a/agent/component.h b/agent/component.h
index b1e6507..207fdcb 100644
--- a/agent/component.h
+++ b/agent/component.h
@@ -149,7 +149,7 @@ struct _Component
   CandidatePair selected_pair; /**< independent from checklists, 
 				    see ICE 11.1. "Sending Media" (ID-19) */
   NiceCandidate *restart_candidate; /**< for storing active remote candidate during a restart */
-
+  NiceCandidate *turn_candidate; /**< for storing active turn candidate if turn servers have been cleared */
   /* I/O handling. The main context must always be non-NULL, and is used for all
    * socket recv() operations. All io_callback emissions are invoked in this
    * context too.
diff --git a/agent/conncheck.c b/agent/conncheck.c
index 376fb18..e697cb6 100644
--- a/agent/conncheck.c
+++ b/agent/conncheck.c
@@ -1128,6 +1128,14 @@ static gboolean priv_update_selected_pair (NiceAgent *agent, Component *componen
       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;
+    }
+
     memset (&component->selected_pair, 0, sizeof(CandidatePair));
     component->selected_pair.local = pair->local;
     component->selected_pair.remote = pair->remote;
diff --git a/agent/discovery.c b/agent/discovery.c
index 6866f57..a484d72 100644
--- a/agent/discovery.c
+++ b/agent/discovery.c
@@ -206,7 +206,7 @@ void refresh_free (NiceAgent *agent)
 
 /*
  * Prunes the list of discovery processes for items related
- * to stream 'stream_id'. 
+ * to stream 'stream_id'.
  *
  * @return TRUE on success, FALSE on a fatal error
  */
@@ -218,6 +218,9 @@ void refresh_prune_stream (NiceAgent *agent, guint stream_id)
     CandidateRefresh *cand = i->data;
     GSList *next = i->next;
 
+    /* Don't free the candidate refresh to the currently selected local candidate
+     * unless the whole pair is being destroyed.
+     */
     if (cand->stream->id == stream_id) {
       agent->refresh_list = g_slist_delete_link (agent->refresh_list, i);
       refresh_free_item (cand);
@@ -228,6 +231,23 @@ void refresh_prune_stream (NiceAgent *agent, guint stream_id)
 
 }
 
+void refresh_prune_candidate (NiceAgent *agent, NiceCandidate *candidate)
+{
+  GSList *i;
+
+  for (i = agent->refresh_list; i;) {
+    GSList *next = i->next;
+    CandidateRefresh *refresh = i->data;
+
+    if (refresh->candidate == candidate) {
+      agent->refresh_list = g_slist_delete_link (agent->refresh_list, i);
+      refresh_free_item (refresh);
+    }
+
+    i = next;
+  }
+}
+
 void refresh_cancel (CandidateRefresh *refresh)
 {
   refresh->agent->refresh_list = g_slist_remove (refresh->agent->refresh_list,
@@ -235,6 +255,7 @@ void refresh_cancel (CandidateRefresh *refresh)
   refresh_free_item (refresh);
 }
 
+
 /*
  * Adds a new local candidate. Implements the candidate pruning
  * defined in ICE spec section 4.1.3 "Eliminating Redundant
diff --git a/agent/discovery.h b/agent/discovery.h
index e4cc20a..f6d3bdd 100644
--- a/agent/discovery.h
+++ b/agent/discovery.h
@@ -84,6 +84,7 @@ typedef struct
 
 void refresh_free (NiceAgent *agent);
 void refresh_prune_stream (NiceAgent *agent, guint stream_id);
+void refresh_prune_candidate (NiceAgent *agent, NiceCandidate *candidate);
 void refresh_cancel (CandidateRefresh *refresh);
 
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-telepathy/libnice.git



More information about the Pkg-telepathy-commits mailing list