Commit 3d4cdee1 authored by Olivier Crête's avatar Olivier Crête Committed by Olivier Crête

agent: Check for early checks on dribbled candidates too

We have to check this list every time candidates are added.
parent f97f1072
...@@ -3616,6 +3616,7 @@ _set_remote_candidates_locked (NiceAgent *agent, NiceStream *stream, ...@@ -3616,6 +3616,7 @@ _set_remote_candidates_locked (NiceAgent *agent, NiceStream *stream,
} }
if (added > 0) { if (added > 0) {
conn_check_remote_candidates_set(agent, stream, component);
conn_check_schedule_next (agent); conn_check_schedule_next (agent);
} }
......
...@@ -1630,56 +1630,64 @@ gint conn_check_compare (const CandidateCheckPair *a, const CandidateCheckPair * ...@@ -1630,56 +1630,64 @@ gint conn_check_compare (const CandidateCheckPair *a, const CandidateCheckPair *
return 0; return 0;
} }
void
conn_check_remote_candidates_set(NiceAgent *agent, NiceStream *stream,
NiceComponent *component)
{
GSList *l, *m;
GList *k;
for (k = component->incoming_checks.head; k;) {
IncomingCheck *icheck = k->data;
GList *k_next = k->next;
/* sect 7.2.1.3., "Learning Peer Reflexive Candidates", has to
* be handled separately */
for (l = component->remote_candidates; l; l = l->next) {
NiceCandidate *rcand = l->data;
NiceCandidate *lcand = NULL;
if (nice_address_equal (&rcand->addr, &icheck->from)) {
for (m = component->local_candidates; m; m = m->next) {
NiceCandidate *cand = m->data;
if (nice_address_equal (&cand->addr, &icheck->local_socket->addr)) {
lcand = cand;
break;
}
}
g_assert (lcand != NULL);
priv_schedule_triggered_check (agent, stream, component,
icheck->local_socket, rcand);
if (icheck->use_candidate)
priv_mark_pair_nominated (agent, stream, component,
lcand, rcand);
g_queue_delete_link (&component->incoming_checks, k);
break;
}
}
k = k_next;
}
}
/* /*
* Handle any processing steps for connectivity checks after * Handle any processing steps for connectivity checks after
* remote credentials have been set. This function handles * remote credentials have been set. This function handles
* the special case where answerer has sent us connectivity * the special case where answerer has sent us connectivity
* checks before the answer (containing credentials information), * checks before the answer (containing credentials information),
* reaches us. The special case is documented in sect 7.2 * reaches us. The special case is documented in RFC 5245 sect 7.2.
* if ICE spec (ID-19). * ).
*/ */
void conn_check_remote_credentials_set(NiceAgent *agent, NiceStream *stream) void conn_check_remote_credentials_set(NiceAgent *agent, NiceStream *stream)
{ {
GSList *j, *l, *m; GSList *j;
GList *k;
IncomingCheck *c;
for (j = stream->components; j ; j = j->next) { for (j = stream->components; j ; j = j->next) {
NiceComponent *component = j->data; NiceComponent *component = j->data;
for (k = component->incoming_checks.head; k;) { conn_check_remote_candidates_set(agent, stream, component);
IncomingCheck *icheck = k->data;
GList *k_next = k->next;
/* sect 7.2.1.3., "Learning Peer Reflexive Candidates", has to
* be handled separately */
for (l = component->remote_candidates; l; l = l->next) {
NiceCandidate *rcand = l->data;
NiceCandidate *lcand = NULL;
if (nice_address_equal (&rcand->addr, &icheck->from)) {
for (m = component->local_candidates; m; m = m->next) {
NiceCandidate *cand = m->data;
if (nice_address_equal (&cand->addr, &icheck->local_socket->addr)) {
lcand = cand;
break;
}
}
g_assert (lcand != NULL);
priv_schedule_triggered_check (agent, stream, component,
icheck->local_socket, rcand);
if (icheck->use_candidate)
priv_mark_pair_nominated (agent, stream, component,
lcand, rcand);
g_queue_delete_link (&component->incoming_checks, k);
break;
}
}
k = k_next;
}
} }
} }
......
...@@ -111,6 +111,7 @@ int conn_check_send (NiceAgent *agent, CandidateCheckPair *pair); ...@@ -111,6 +111,7 @@ int conn_check_send (NiceAgent *agent, CandidateCheckPair *pair);
void conn_check_prune_stream (NiceAgent *agent, NiceStream *stream); void conn_check_prune_stream (NiceAgent *agent, NiceStream *stream);
gboolean conn_check_handle_inbound_stun (NiceAgent *agent, NiceStream *stream, NiceComponent *component, NiceSocket *udp_socket, const NiceAddress *from, gchar *buf, guint len); gboolean conn_check_handle_inbound_stun (NiceAgent *agent, NiceStream *stream, NiceComponent *component, NiceSocket *udp_socket, const NiceAddress *from, gchar *buf, guint len);
gint conn_check_compare (const CandidateCheckPair *a, const CandidateCheckPair *b); gint conn_check_compare (const CandidateCheckPair *a, const CandidateCheckPair *b);
void conn_check_remote_candidates_set(NiceAgent *agent, NiceStream *stream, NiceComponent *component);
void conn_check_remote_credentials_set(NiceAgent *agent, NiceStream *stream); void conn_check_remote_credentials_set(NiceAgent *agent, NiceStream *stream);
NiceCandidateTransport conn_check_match_transport (NiceCandidateTransport transport); NiceCandidateTransport conn_check_match_transport (NiceCandidateTransport transport);
void void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment