}
}
-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;
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)
/* 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);
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. */
/* 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;
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;
*/
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);
}