Commit e1f748cc authored by Jakub Adam's avatar Jakub Adam Committed by Philip Withnall

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.
Reviewed-by: default avatarPhilip Withnall <philip.withnall@collabora.co.uk>
Reviewed-by: default avatarOlivier Crête <olivier.crete@collabora.com>

http://phabricator.freedesktop.org/T117
parent cd61af31
......@@ -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,
......
......@@ -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;
......
......@@ -1914,6 +1914,12 @@ int conn_check_send (NiceAgent *agent, CandidateCheckPair *pair)
if (new_socket) {
pair->sockptr = new_socket;
_priv_set_socket_tos (agent, pair->sockptr, stream2->tos);
if (agent->reliable) {
nice_socket_set_writable_callback (pair->sockptr,
_tcp_sock_is_writable, component2);
}
component_attach_socket (component2, new_socket);
}
}
......
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