Commit 0c08c052 authored by Youness Alaoui's avatar Youness Alaoui

Completing turn support in udp socket factory

parent 55d80fca
......@@ -58,6 +58,10 @@ typedef struct {
StunAgent agent;
int locked;
NiceUDPSocket udp_socket;
uint8_t *username;
size_t username_len;
uint8_t *password;
size_t password_len;
} turn_priv;
......@@ -69,8 +73,52 @@ socket_recv (
gchar *buf)
{
turn_priv *priv = (turn_priv *) sock->priv;
StunValidationStatus valid;
StunMessage msg;
uint8_t buffer[STUN_MAX_MESSAGE_SIZE];
size_t stun_len;
struct sockaddr_storage sa;
guint from_len = sizeof (sa);
stun_len = nice_udp_socket_recv (&priv->udp_socket, from,
sizeof(buffer), (gchar *)buffer);
valid = stun_agent_validate (&priv->agent, &msg, buffer, stun_len, NULL, NULL);
if (valid == STUN_VALIDATION_SUCCESS) {
uint32_t cookie;
if (stun_message_find32 (&msg, STUN_ATTRIBUTE_MAGIC_COOKIE, &cookie) != 0)
goto recv;
if (cookie != TURN_MAGIC_COOKIE)
goto recv;
if (stun_message_get_class (&msg) == STUN_RESPONSE &&
stun_message_get_method (&msg) == STUN_SEND) {
return 0;
} else if (stun_message_get_class (&msg) == STUN_INDICATION &&
stun_message_get_method (&msg) == STUN_IND_DATA) {
uint16_t data_len;
uint8_t *data;
if (stun_message_find_addr (&msg, STUN_ATTRIBUTE_REMOTE_ADDRESS,
(struct sockaddr *)&sa, &from_len) != 0)
goto recv;
data = (uint8_t *) stun_message_find (&msg, STUN_ATTRIBUTE_DATA, &data_len);
if (data == NULL)
goto recv;
nice_address_set_from_sockaddr (from, (struct sockaddr *)&sa);
memcpy (buf, data, len > data_len ? data_len : len);
return len > data_len ? data_len : len;
} else {
goto recv;
}
}
return nice_udp_socket_recv (&priv->udp_socket, from, len, buf);
recv:
memcpy (buf, buffer, len > stun_len ? stun_len : len);
return len > stun_len ? stun_len : len;
}
static gboolean
......@@ -81,7 +129,41 @@ socket_send (
const gchar *buf)
{
turn_priv *priv = (turn_priv *) sock->priv;
StunMessage msg;
uint8_t buffer[STUN_MAX_MESSAGE_SIZE];
size_t stun_len;
struct sockaddr_storage sa;
nice_address_copy_to_sockaddr (to, (struct sockaddr *)&sa);
if (!stun_agent_init_request (&priv->agent, &msg, buffer, sizeof(buffer), STUN_SEND))
goto send;
if (stun_message_append32 (&msg, STUN_ATTRIBUTE_MAGIC_COOKIE,
TURN_MAGIC_COOKIE) != 0)
goto send;
if (priv->username != NULL && priv->username_len > 0) {
if (stun_message_append_bytes (&msg, STUN_ATTRIBUTE_USERNAME,
priv->username, priv->username_len) != 0)
goto send;
}
if (stun_message_append_addr (&msg, STUN_ATTRIBUTE_DESTINATION_ADDRESS,
(struct sockaddr *)&sa, sizeof(sa)) != 0)
goto send;
if (stun_message_append_bytes (&msg, STUN_ATTRIBUTE_DATA, buf, len) != 0)
goto send;
stun_len = stun_agent_finish_message (&priv->agent, &msg,
priv->password, priv->password_len);
if (stun_len > 0) {
nice_udp_socket_send (&priv->udp_socket, to, stun_len, (gchar *)buffer);
return TRUE;
}
send:
nice_udp_socket_send (&priv->udp_socket, to, len, buf);
return TRUE;
......@@ -107,7 +189,7 @@ socket_factory_init_socket (
NiceUDPSocketFactory *udp_socket_factory = man->priv;
turn_priv *priv = g_new0 (turn_priv, 1);
if (nice_udp_socket_factory_make (udp_socket_factory, &priv->udp_socket, addr)
if (nice_udp_socket_factory_make (udp_socket_factory, &(priv->udp_socket), addr)
== FALSE) {
g_free (priv);
return FALSE;
......@@ -118,6 +200,7 @@ socket_factory_init_socket (
STUN_AGENT_USAGE_SHORT_TERM_CREDENTIALS |
STUN_AGENT_USAGE_IGNORE_CREDENTIALS);
sock->addr = priv->udp_socket.addr;
sock->fileno = priv->udp_socket.fileno;
sock->send = socket_send;
sock->recv = socket_recv;
......
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