From fc34ae1b2f19d73e1cf7b1c76f744f3fed9b8b2a Mon Sep 17 00:00:00 2001 From: Jakub Adam Date: Thu, 18 Jun 2015 09:05:21 +0200 Subject: [PATCH] conncheck: set writable callback to socket from TCP active connect A new socket created in nice_tcp_active_socket_connect() should have its writable callback set, because it's possible for it to become a base socket of a peer reflexive candidate, if some is discovered by connection checks on that TCP active candidate. Previously, when such prflx candidate became selected, without write_cb on the socket the agent was never notified about it becoming writable again after the socket's buffer got filled up. This caused the data flow to hang permanently. --- agent/agent-priv.h | 2 ++ agent/agent.c | 2 +- agent/conncheck.c | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/agent/agent-priv.h b/agent/agent-priv.h index c413bc1..4e7225a 100644 --- a/agent/agent-priv.h +++ b/agent/agent-priv.h @@ -220,6 +220,8 @@ void nice_agent_init_stun_agent (NiceAgent *agent, StunAgent *stun_agent); void _priv_set_socket_tos (NiceAgent *agent, NiceSocket *sock, gint tos); +void _tcp_sock_is_writable (NiceSocket *sock, gpointer user_data); + gboolean component_io_cb ( GSocket *gsocket, diff --git a/agent/agent.c b/agent/agent.c index 84d4093..c0eae1e 100644 --- a/agent/agent.c +++ b/agent/agent.c @@ -1837,7 +1837,7 @@ adjust_tcp_clock (NiceAgent *agent, Stream *stream, Component *component) } } -static void +void _tcp_sock_is_writable (NiceSocket *sock, gpointer user_data) { Component *component = user_data; diff --git a/agent/conncheck.c b/agent/conncheck.c index 057fc81..b47a02f 100644 --- a/agent/conncheck.c +++ b/agent/conncheck.c @@ -1914,6 +1914,8 @@ int conn_check_send (NiceAgent *agent, CandidateCheckPair *pair) if (new_socket) { pair->sockptr = new_socket; _priv_set_socket_tos (agent, pair->sockptr, stream2->tos); + nice_socket_set_writable_callback (pair->sockptr, + _tcp_sock_is_writable, component2); component_attach_socket (component2, new_socket); } } -- 2.1.4