Commit ec0a778a authored by Youness Alaoui's avatar Youness Alaoui

Fixing TURN support. correctly send the send indication/request and parse the data indication

parent a41c8a64
...@@ -93,6 +93,7 @@ typedef enum ...@@ -93,6 +93,7 @@ typedef enum
STUN_ATTRIBUTE_BANDWIDTH=0x0010, /* TURN-04 */ STUN_ATTRIBUTE_BANDWIDTH=0x0010, /* TURN-04 */
STUN_ATTRIBUTE_DESTINATION_ADDRESS=0x0011, /* TURN jingle */ STUN_ATTRIBUTE_DESTINATION_ADDRESS=0x0011, /* TURN jingle */
STUN_ATTRIBUTE_REMOTE_ADDRESS=0x0012, /* TURN-04 */ STUN_ATTRIBUTE_REMOTE_ADDRESS=0x0012, /* TURN-04 */
STUN_ATTRIBUTE_PEER_ADDRESS=0x0012, /* TURN-09 */
STUN_ATTRIBUTE_DATA=0x0013, /* TURN-04 */ STUN_ATTRIBUTE_DATA=0x0013, /* TURN-04 */
STUN_ATTRIBUTE_REALM=0x0014, /* RFC3489bis-11 */ STUN_ATTRIBUTE_REALM=0x0014, /* RFC3489bis-11 */
STUN_ATTRIBUTE_NONCE=0x0015, /* RFC3489bis-11 */ STUN_ATTRIBUTE_NONCE=0x0015, /* RFC3489bis-11 */
......
...@@ -65,6 +65,7 @@ typedef struct { ...@@ -65,6 +65,7 @@ typedef struct {
size_t username_len; size_t username_len;
uint8_t *password; uint8_t *password;
size_t password_len; size_t password_len;
NiceUdpTurnSocketCompatibility compatibility;
} turn_priv; } turn_priv;
...@@ -90,22 +91,30 @@ nice_udp_turn_socket_parse_recv ( ...@@ -90,22 +91,30 @@ nice_udp_turn_socket_parse_recv (
(uint8_t *) recv_buf, (size_t) recv_len, NULL, NULL); (uint8_t *) recv_buf, (size_t) recv_len, NULL, NULL);
if (valid == STUN_VALIDATION_SUCCESS) { if (valid == STUN_VALIDATION_SUCCESS) {
if (priv->compatibility != NICE_UDP_TURN_SOCKET_COMPATIBILITY_DRAFT9) {
uint32_t cookie; uint32_t cookie;
if (stun_message_find32 (&msg, STUN_ATTRIBUTE_MAGIC_COOKIE, &cookie) != 0) if (stun_message_find32 (&msg, STUN_ATTRIBUTE_MAGIC_COOKIE, &cookie) != 0)
goto recv; goto recv;
if (cookie != TURN_MAGIC_COOKIE) if (cookie != TURN_MAGIC_COOKIE)
goto recv; goto recv;
}
if (stun_message_get_class (&msg) == STUN_RESPONSE && if (stun_message_get_class (&msg) == STUN_RESPONSE &&
stun_message_get_method (&msg) == STUN_SEND) { stun_message_get_method (&msg) == STUN_IND_SEND) {
return 0; return 0;
} else if (stun_message_get_class (&msg) == STUN_INDICATION && } else if (stun_message_get_class (&msg) == STUN_INDICATION &&
stun_message_get_method (&msg) == STUN_IND_DATA) { stun_message_get_method (&msg) == STUN_IND_DATA) {
uint16_t data_len; uint16_t data_len;
uint8_t *data; uint8_t *data;
if (priv->compatibility == NICE_UDP_TURN_SOCKET_COMPATIBILITY_DRAFT9) {
if (stun_message_find_xor_addr (&msg, STUN_ATTRIBUTE_REMOTE_ADDRESS,
(struct sockaddr *)&sa, &from_len) != 0)
goto recv;
} else {
if (stun_message_find_addr (&msg, STUN_ATTRIBUTE_REMOTE_ADDRESS, if (stun_message_find_addr (&msg, STUN_ATTRIBUTE_REMOTE_ADDRESS,
(struct sockaddr *)&sa, &from_len) != 0) (struct sockaddr *)&sa, &from_len) != 0)
goto recv; goto recv;
}
data = (uint8_t *) stun_message_find (&msg, STUN_ATTRIBUTE_DATA, &data_len); data = (uint8_t *) stun_message_find (&msg, STUN_ATTRIBUTE_DATA, &data_len);
if (data == NULL) if (data == NULL)
...@@ -161,7 +170,16 @@ socket_send ( ...@@ -161,7 +170,16 @@ socket_send (
nice_address_copy_to_sockaddr (to, (struct sockaddr *)&sa); nice_address_copy_to_sockaddr (to, (struct sockaddr *)&sa);
if (!stun_agent_init_request (&priv->agent, &msg, buffer, sizeof(buffer), STUN_SEND)) if (priv->compatibility == NICE_UDP_TURN_SOCKET_COMPATIBILITY_DRAFT9) {
if (!stun_agent_init_indication (&priv->agent, &msg,
buffer, sizeof(buffer), STUN_IND_SEND))
goto send;
if (stun_message_append_xor_addr (&msg, STUN_ATTRIBUTE_PEER_ADDRESS,
(struct sockaddr *)&sa, sizeof(sa)) != 0)
goto send;
} else {
if (!stun_agent_init_request (&priv->agent, &msg,
buffer, sizeof(buffer), STUN_SEND))
goto send; goto send;
if (stun_message_append32 (&msg, STUN_ATTRIBUTE_MAGIC_COOKIE, if (stun_message_append32 (&msg, STUN_ATTRIBUTE_MAGIC_COOKIE,
...@@ -174,9 +192,11 @@ socket_send ( ...@@ -174,9 +192,11 @@ socket_send (
goto send; goto send;
} }
if (stun_message_append_addr (&msg, STUN_ATTRIBUTE_DESTINATION_ADDRESS, if (stun_message_append_xor_addr (&msg, STUN_ATTRIBUTE_DESTINATION_ADDRESS,
(struct sockaddr *)&sa, sizeof(sa)) != 0) (struct sockaddr *)&sa, sizeof(sa)) != 0)
goto send; goto send;
}
if (stun_message_append_bytes (&msg, STUN_ATTRIBUTE_DATA, buf, len) != 0) if (stun_message_append_bytes (&msg, STUN_ATTRIBUTE_DATA, buf, len) != 0)
goto send; goto send;
...@@ -185,7 +205,8 @@ socket_send ( ...@@ -185,7 +205,8 @@ socket_send (
priv->password, priv->password_len); priv->password, priv->password_len);
if (stun_len > 0) { if (stun_len > 0) {
nice_udp_socket_send (priv->udp_socket, &priv->server_addr, stun_len, (gchar *)buffer); nice_udp_socket_send (priv->udp_socket, &priv->server_addr,
stun_len, (gchar *)buffer);
return TRUE; return TRUE;
} }
send: send:
...@@ -225,10 +246,17 @@ nice_udp_turn_create_socket_full ( ...@@ -225,10 +246,17 @@ nice_udp_turn_create_socket_full (
{ {
turn_priv *priv = g_new0 (turn_priv, 1); turn_priv *priv = g_new0 (turn_priv, 1);
if (compatibility == NICE_UDP_TURN_SOCKET_COMPATIBILITY_DRAFT9) {
stun_agent_init (&priv->agent, STUN_ALL_KNOWN_ATTRIBUTES,
STUN_COMPATIBILITY_3489BIS,
STUN_AGENT_USAGE_SHORT_TERM_CREDENTIALS |
STUN_AGENT_USAGE_IGNORE_CREDENTIALS);
} else {
stun_agent_init (&priv->agent, STUN_ALL_KNOWN_ATTRIBUTES, stun_agent_init (&priv->agent, STUN_ALL_KNOWN_ATTRIBUTES,
STUN_COMPATIBILITY_RFC3489, STUN_COMPATIBILITY_RFC3489,
STUN_AGENT_USAGE_SHORT_TERM_CREDENTIALS | STUN_AGENT_USAGE_SHORT_TERM_CREDENTIALS |
STUN_AGENT_USAGE_IGNORE_CREDENTIALS); STUN_AGENT_USAGE_IGNORE_CREDENTIALS);
}
priv->locked = FALSE; priv->locked = FALSE;
priv->udp_socket = udp_socket; priv->udp_socket = udp_socket;
...@@ -237,6 +265,7 @@ nice_udp_turn_create_socket_full ( ...@@ -237,6 +265,7 @@ nice_udp_turn_create_socket_full (
priv->password = (uint8_t *)password; priv->password = (uint8_t *)password;
priv->password_len = (size_t) strlen (password); priv->password_len = (size_t) strlen (password);
priv->server_addr = *server_addr; priv->server_addr = *server_addr;
priv->compatibility = compatibility;
sock->addr = *addr; sock->addr = *addr;
sock->fileno = udp_socket->fileno; sock->fileno = udp_socket->fileno;
sock->send = socket_send; sock->send = socket_send;
......
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