mirror of
https://github.com/coturn/coturn.git
synced 2025-10-28 21:41:29 +01:00
issue 123
This commit is contained in:
parent
c5afa961a0
commit
8553e9f46a
@ -998,12 +998,11 @@ int set_socket_options(ioa_socket_handle s)
|
|||||||
|
|
||||||
/* <<== Socket options helpers */
|
/* <<== Socket options helpers */
|
||||||
|
|
||||||
ioa_socket_handle create_unbound_ioa_socket(ioa_engine_handle e, ioa_socket_handle parent_s, int family, SOCKET_TYPE st, SOCKET_APP_TYPE sat)
|
ioa_socket_handle create_unbound_ioa_socket(ioa_engine_handle e, int family, SOCKET_TYPE st, SOCKET_APP_TYPE sat)
|
||||||
{
|
{
|
||||||
evutil_socket_t fd = -1;
|
evutil_socket_t fd = -1;
|
||||||
ioa_socket_handle ret = NULL;
|
ioa_socket_handle ret = NULL;
|
||||||
|
|
||||||
if(!parent_s) {
|
|
||||||
switch (st){
|
switch (st){
|
||||||
case UDP_SOCKET:
|
case UDP_SOCKET:
|
||||||
fd = socket(family, SOCK_DGRAM, 0);
|
fd = socket(family, SOCK_DGRAM, 0);
|
||||||
@ -1025,7 +1024,6 @@ ioa_socket_handle create_unbound_ioa_socket(ioa_engine_handle e, ioa_socket_hand
|
|||||||
/* we do not support other sockets in the relay position */
|
/* we do not support other sockets in the relay position */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ret = (ioa_socket*)turn_malloc(sizeof(ioa_socket));
|
ret = (ioa_socket*)turn_malloc(sizeof(ioa_socket));
|
||||||
ns_bzero(ret,sizeof(ioa_socket));
|
ns_bzero(ret,sizeof(ioa_socket));
|
||||||
@ -1038,11 +1036,7 @@ ioa_socket_handle create_unbound_ioa_socket(ioa_engine_handle e, ioa_socket_hand
|
|||||||
ret->sat = sat;
|
ret->sat = sat;
|
||||||
ret->e = e;
|
ret->e = e;
|
||||||
|
|
||||||
if(parent_s) {
|
|
||||||
add_socket_to_parent(parent_s, ret);
|
|
||||||
} else {
|
|
||||||
set_socket_options(ret);
|
set_socket_options(ret);
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1128,7 +1122,7 @@ int create_relay_ioa_sockets(ioa_engine_handle e,
|
|||||||
if (port >= 0 && even_port > 0) {
|
if (port >= 0 && even_port > 0) {
|
||||||
|
|
||||||
IOA_CLOSE_SOCKET(*rtcp_s);
|
IOA_CLOSE_SOCKET(*rtcp_s);
|
||||||
*rtcp_s = create_unbound_ioa_socket(e, NULL, relay_addr.ss.sa_family, UDP_SOCKET, RELAY_RTCP_SOCKET);
|
*rtcp_s = create_unbound_ioa_socket(e, relay_addr.ss.sa_family, UDP_SOCKET, RELAY_RTCP_SOCKET);
|
||||||
if (*rtcp_s == NULL) {
|
if (*rtcp_s == NULL) {
|
||||||
perror("socket");
|
perror("socket");
|
||||||
IOA_CLOSE_SOCKET(*rtp_s);
|
IOA_CLOSE_SOCKET(*rtp_s);
|
||||||
@ -1164,7 +1158,7 @@ int create_relay_ioa_sockets(ioa_engine_handle e,
|
|||||||
|
|
||||||
IOA_CLOSE_SOCKET(*rtp_s);
|
IOA_CLOSE_SOCKET(*rtp_s);
|
||||||
|
|
||||||
*rtp_s = create_unbound_ioa_socket(e, NULL, relay_addr.ss.sa_family,
|
*rtp_s = create_unbound_ioa_socket(e, relay_addr.ss.sa_family,
|
||||||
(transport == STUN_ATTRIBUTE_TRANSPORT_TCP_VALUE) ? TCP_SOCKET : UDP_SOCKET,
|
(transport == STUN_ATTRIBUTE_TRANSPORT_TCP_VALUE) ? TCP_SOCKET : UDP_SOCKET,
|
||||||
RELAY_SOCKET);
|
RELAY_SOCKET);
|
||||||
if (*rtp_s == NULL) {
|
if (*rtp_s == NULL) {
|
||||||
@ -1334,7 +1328,7 @@ static void connect_eventcb(struct bufferevent *bev, short events, void *ptr)
|
|||||||
|
|
||||||
ioa_socket_handle ioa_create_connecting_tcp_relay_socket(ioa_socket_handle s, ioa_addr *peer_addr, connect_cb cb, void *arg)
|
ioa_socket_handle ioa_create_connecting_tcp_relay_socket(ioa_socket_handle s, ioa_addr *peer_addr, connect_cb cb, void *arg)
|
||||||
{
|
{
|
||||||
ioa_socket_handle ret = create_unbound_ioa_socket(s->e, NULL, s->family, s->st, TCP_RELAY_DATA_SOCKET);
|
ioa_socket_handle ret = create_unbound_ioa_socket(s->e, s->family, s->st, TCP_RELAY_DATA_SOCKET);
|
||||||
|
|
||||||
if(!ret) {
|
if(!ret) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1509,6 +1503,9 @@ ioa_socket_handle create_ioa_socket_from_fd(ioa_engine_handle e,
|
|||||||
/* Only must be called for DTLS_SOCKET */
|
/* Only must be called for DTLS_SOCKET */
|
||||||
ioa_socket_handle create_ioa_socket_from_ssl(ioa_engine_handle e, ioa_socket_handle parent_s, SSL* ssl, SOCKET_TYPE st, SOCKET_APP_TYPE sat, const ioa_addr *remote_addr, const ioa_addr *local_addr)
|
ioa_socket_handle create_ioa_socket_from_ssl(ioa_engine_handle e, ioa_socket_handle parent_s, SSL* ssl, SOCKET_TYPE st, SOCKET_APP_TYPE sat, const ioa_addr *remote_addr, const ioa_addr *local_addr)
|
||||||
{
|
{
|
||||||
|
if(!parent_s)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
ioa_socket_handle ret = create_ioa_socket_from_fd(e, parent_s->fd, parent_s, st, sat, remote_addr, local_addr);
|
ioa_socket_handle ret = create_ioa_socket_from_fd(e, parent_s->fd, parent_s, st, sat, remote_addr, local_addr);
|
||||||
|
|
||||||
if(ret) {
|
if(ret) {
|
||||||
@ -1637,7 +1634,7 @@ void close_ioa_socket(ioa_socket_handle s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ioa_socket_handle detach_ioa_socket(ioa_socket_handle s, int full_detach)
|
ioa_socket_handle detach_ioa_socket(ioa_socket_handle s)
|
||||||
{
|
{
|
||||||
ioa_socket_handle ret = NULL;
|
ioa_socket_handle ret = NULL;
|
||||||
|
|
||||||
@ -1669,14 +1666,15 @@ ioa_socket_handle detach_ioa_socket(ioa_socket_handle s, int full_detach)
|
|||||||
|
|
||||||
evutil_socket_t udp_fd = -1;
|
evutil_socket_t udp_fd = -1;
|
||||||
|
|
||||||
if(full_detach && s->parent_s) {
|
if(s->parent_s) {
|
||||||
|
#if defined(SO_REUSEPORT)
|
||||||
udp_fd = socket(s->local_addr.ss.sa_family, SOCK_DGRAM, 0);
|
udp_fd = socket(s->local_addr.ss.sa_family, SOCK_DGRAM, 0);
|
||||||
if (udp_fd < 0) {
|
if (udp_fd < 0) {
|
||||||
perror("socket");
|
perror("socket");
|
||||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"%s: Cannot allocate new socket\n",__FUNCTION__);
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"%s: Cannot allocate new socket\n",__FUNCTION__);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
detach_socket_net_data(s);
|
detach_socket_net_data(s);
|
||||||
@ -1711,15 +1709,20 @@ ioa_socket_handle detach_ioa_socket(ioa_socket_handle s, int full_detach)
|
|||||||
ret->local_addr_known = s->local_addr_known;
|
ret->local_addr_known = s->local_addr_known;
|
||||||
addr_cpy(&(ret->local_addr),&(s->local_addr));
|
addr_cpy(&(ret->local_addr),&(s->local_addr));
|
||||||
ret->connected = s->connected;
|
ret->connected = s->connected;
|
||||||
ioa_socket_handle parent_s = s->parent_s;
|
|
||||||
addr_cpy(&(ret->remote_addr),&(s->remote_addr));
|
addr_cpy(&(ret->remote_addr),&(s->remote_addr));
|
||||||
|
|
||||||
|
ioa_socket_handle parent_s = s->parent_s;
|
||||||
ur_addr_map *sockets_container = s->sockets_container;
|
ur_addr_map *sockets_container = s->sockets_container;
|
||||||
|
|
||||||
delete_socket_from_map(s);
|
delete_socket_from_map(s);
|
||||||
delete_socket_from_parent(s);
|
delete_socket_from_parent(s);
|
||||||
|
|
||||||
if(full_detach && parent_s) {
|
if(udp_fd<0) {
|
||||||
|
|
||||||
|
add_socket_to_parent(parent_s, ret);
|
||||||
|
add_socket_to_map(ret,sockets_container);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
ret->fd = udp_fd;
|
ret->fd = udp_fd;
|
||||||
|
|
||||||
@ -1741,10 +1744,6 @@ ioa_socket_handle detach_ioa_socket(ioa_socket_handle s, int full_detach)
|
|||||||
}
|
}
|
||||||
|
|
||||||
set_socket_options(ret);
|
set_socket_options(ret);
|
||||||
|
|
||||||
} else {
|
|
||||||
add_socket_to_parent(parent_s, ret);
|
|
||||||
add_socket_to_map(ret,sockets_container);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret->current_ttl = s->current_ttl;
|
ret->current_ttl = s->current_ttl;
|
||||||
@ -1825,7 +1824,7 @@ void set_ioa_socket_app_type(ioa_socket_handle s, SOCKET_APP_TYPE sat) {
|
|||||||
|
|
||||||
ioa_addr* get_local_addr_from_ioa_socket(ioa_socket_handle s)
|
ioa_addr* get_local_addr_from_ioa_socket(ioa_socket_handle s)
|
||||||
{
|
{
|
||||||
if (s) {
|
if (s && (s->magic == SOCKET_MAGIC) && !(s->done)) {
|
||||||
|
|
||||||
if(s->parent_s) {
|
if(s->parent_s) {
|
||||||
return get_local_addr_from_ioa_socket(s->parent_s);
|
return get_local_addr_from_ioa_socket(s->parent_s);
|
||||||
@ -1859,7 +1858,7 @@ ioa_addr* get_local_addr_from_ioa_socket(ioa_socket_handle s)
|
|||||||
|
|
||||||
ioa_addr* get_remote_addr_from_ioa_socket(ioa_socket_handle s)
|
ioa_addr* get_remote_addr_from_ioa_socket(ioa_socket_handle s)
|
||||||
{
|
{
|
||||||
if (s) {
|
if (s && (s->magic == SOCKET_MAGIC) && !(s->done)) {
|
||||||
|
|
||||||
if (s->connected) {
|
if (s->connected) {
|
||||||
return &(s->remote_addr);
|
return &(s->remote_addr);
|
||||||
@ -2325,24 +2324,23 @@ static int socket_input_worker(ioa_socket_handle s)
|
|||||||
if(s->e->tls_ctx_v1_2) {
|
if(s->e->tls_ctx_v1_2) {
|
||||||
s->ssl = SSL_new(s->e->tls_ctx_v1_2);
|
s->ssl = SSL_new(s->e->tls_ctx_v1_2);
|
||||||
STRCPY(s->orig_ctx_type,"TLSv1.2");
|
STRCPY(s->orig_ctx_type,"TLSv1.2");
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
#if defined(SSL_TXT_TLSV1_1)
|
#if defined(SSL_TXT_TLSV1_1)
|
||||||
case TURN_TLS_v1_1:
|
case TURN_TLS_v1_1:
|
||||||
if(s->e->tls_ctx_v1_1) {
|
if(s->e->tls_ctx_v1_1) {
|
||||||
s->ssl = SSL_new(s->e->tls_ctx_v1_1);
|
s->ssl = SSL_new(s->e->tls_ctx_v1_1);
|
||||||
STRCPY(s->orig_ctx_type,"TLSv1.1");
|
STRCPY(s->orig_ctx_type,"TLSv1.1");
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
case TURN_TLS_v1_0:
|
case TURN_TLS_v1_0:
|
||||||
if(s->e->tls_ctx_v1_0) {
|
if(s->e->tls_ctx_v1_0) {
|
||||||
s->ssl = SSL_new(s->e->tls_ctx_v1_0);
|
s->ssl = SSL_new(s->e->tls_ctx_v1_0);
|
||||||
STRCPY(s->orig_ctx_type,"TLSv1.0");
|
STRCPY(s->orig_ctx_type,"TLSv1.0");
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if(s->e->tls_ctx_ssl23) {
|
if(s->e->tls_ctx_ssl23) {
|
||||||
s->ssl = SSL_new(s->e->tls_ctx_ssl23);
|
s->ssl = SSL_new(s->e->tls_ctx_ssl23);
|
||||||
|
|||||||
@ -197,7 +197,7 @@ void stop_ioa_timer(ioa_timer_handle th);
|
|||||||
void delete_ioa_timer(ioa_timer_handle th);
|
void delete_ioa_timer(ioa_timer_handle th);
|
||||||
#define IOA_EVENT_DEL(E) do { if(E) { delete_ioa_timer(E); E = NULL; } } while(0)
|
#define IOA_EVENT_DEL(E) do { if(E) { delete_ioa_timer(E); E = NULL; } } while(0)
|
||||||
|
|
||||||
ioa_socket_handle create_unbound_ioa_socket(ioa_engine_handle e, ioa_socket_handle parent_s, int family, SOCKET_TYPE st, SOCKET_APP_TYPE sat);
|
ioa_socket_handle create_unbound_ioa_socket(ioa_engine_handle e, int family, SOCKET_TYPE st, SOCKET_APP_TYPE sat);
|
||||||
|
|
||||||
void inc_ioa_socket_ref_counter(ioa_socket_handle s);
|
void inc_ioa_socket_ref_counter(ioa_socket_handle s);
|
||||||
|
|
||||||
@ -235,7 +235,7 @@ int register_callback_on_ioa_socket(ioa_engine_handle e, ioa_socket_handle s, in
|
|||||||
int send_data_from_ioa_socket_nbh(ioa_socket_handle s, ioa_addr* dest_addr, ioa_network_buffer_handle nbh, int ttl, int tos);
|
int send_data_from_ioa_socket_nbh(ioa_socket_handle s, ioa_addr* dest_addr, ioa_network_buffer_handle nbh, int ttl, int tos);
|
||||||
void close_ioa_socket(ioa_socket_handle s);
|
void close_ioa_socket(ioa_socket_handle s);
|
||||||
#define IOA_CLOSE_SOCKET(S) do { if(S) { close_ioa_socket(S); S = NULL; } } while(0)
|
#define IOA_CLOSE_SOCKET(S) do { if(S) { close_ioa_socket(S); S = NULL; } } while(0)
|
||||||
ioa_socket_handle detach_ioa_socket(ioa_socket_handle s, int full_detach);
|
ioa_socket_handle detach_ioa_socket(ioa_socket_handle s);
|
||||||
void detach_socket_net_data(ioa_socket_handle s);
|
void detach_socket_net_data(ioa_socket_handle s);
|
||||||
int set_df_on_ioa_socket(ioa_socket_handle s, int value);
|
int set_df_on_ioa_socket(ioa_socket_handle s, int value);
|
||||||
void set_do_not_use_df(ioa_socket_handle s);
|
void set_do_not_use_df(ioa_socket_handle s);
|
||||||
|
|||||||
@ -374,9 +374,11 @@ int turn_session_info_copy_from(struct turn_session_info* tsi, ts_ur_super_sessi
|
|||||||
}
|
}
|
||||||
if(ss->alloc.relay_session.s) {
|
if(ss->alloc.relay_session.s) {
|
||||||
tsi->peer_protocol = get_ioa_socket_type(ss->alloc.relay_session.s);
|
tsi->peer_protocol = get_ioa_socket_type(ss->alloc.relay_session.s);
|
||||||
|
if(ss->alloc.is_valid) {
|
||||||
addr_cpy(&(tsi->relay_addr_data.addr),get_local_addr_from_ioa_socket(ss->alloc.relay_session.s));
|
addr_cpy(&(tsi->relay_addr_data.addr),get_local_addr_from_ioa_socket(ss->alloc.relay_session.s));
|
||||||
addr_to_string(&(tsi->relay_addr_data.addr),(u08bits*)tsi->relay_addr_data.saddr);
|
addr_to_string(&(tsi->relay_addr_data.addr),(u08bits*)tsi->relay_addr_data.saddr);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
STRCPY(tsi->username,ss->username);
|
STRCPY(tsi->username,ss->username);
|
||||||
tsi->enforce_fingerprints = ss->enforce_fingerprints;
|
tsi->enforce_fingerprints = ss->enforce_fingerprints;
|
||||||
STRCPY(tsi->tls_method, get_ioa_socket_tls_method(ss->client_session.s));
|
STRCPY(tsi->tls_method, get_ioa_socket_tls_method(ss->client_session.s));
|
||||||
@ -1238,7 +1240,7 @@ static int handle_turn_refresh(turn_turnserver *server,
|
|||||||
if(tsid != server->id) {
|
if(tsid != server->id) {
|
||||||
|
|
||||||
if(server->send_socket_to_relay) {
|
if(server->send_socket_to_relay) {
|
||||||
ioa_socket_handle new_s = detach_ioa_socket(ss->client_session.s, 1);
|
ioa_socket_handle new_s = detach_ioa_socket(ss->client_session.s);
|
||||||
if(new_s) {
|
if(new_s) {
|
||||||
if(server->send_socket_to_relay(tsid, mid, tid, new_s, message_integrity,
|
if(server->send_socket_to_relay(tsid, mid, tid, new_s, message_integrity,
|
||||||
RMT_MOBILE_SOCKET, in_buffer)<0) {
|
RMT_MOBILE_SOCKET, in_buffer)<0) {
|
||||||
@ -1316,7 +1318,7 @@ static int handle_turn_refresh(turn_turnserver *server,
|
|||||||
|
|
||||||
//Transfer socket:
|
//Transfer socket:
|
||||||
|
|
||||||
ioa_socket_handle s = detach_ioa_socket(ss->client_session.s, 0);
|
ioa_socket_handle s = detach_ioa_socket(ss->client_session.s);
|
||||||
|
|
||||||
ss->to_be_closed = 1;
|
ss->to_be_closed = 1;
|
||||||
|
|
||||||
@ -1950,7 +1952,7 @@ static int handle_turn_connection_bind(turn_turnserver *server,
|
|||||||
turnserver_id sid = (id & 0xFF000000)>>24;
|
turnserver_id sid = (id & 0xFF000000)>>24;
|
||||||
ioa_socket_handle s = ss->client_session.s;
|
ioa_socket_handle s = ss->client_session.s;
|
||||||
if(s) {
|
if(s) {
|
||||||
ioa_socket_handle new_s = detach_ioa_socket(s, 1);
|
ioa_socket_handle new_s = detach_ioa_socket(s);
|
||||||
if(new_s) {
|
if(new_s) {
|
||||||
if(server->send_socket_to_relay(sid, id, tid, new_s, message_integrity, RMT_CB_SOCKET, NULL)<0) {
|
if(server->send_socket_to_relay(sid, id, tid, new_s, message_integrity, RMT_CB_SOCKET, NULL)<0) {
|
||||||
*err_code = 400;
|
*err_code = 400;
|
||||||
@ -2344,8 +2346,8 @@ static int handle_turn_binding(turn_turnserver *server,
|
|||||||
stun_attr_get_addr_str(ioa_network_buffer_data(in_buffer->nbh),
|
stun_attr_get_addr_str(ioa_network_buffer_data(in_buffer->nbh),
|
||||||
ioa_network_buffer_get_size(in_buffer->nbh),
|
ioa_network_buffer_get_size(in_buffer->nbh),
|
||||||
sar, response_destination, response_destination);
|
sar, response_destination, response_destination);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if(attr_type>=0x0000 && attr_type<=0x7FFF)
|
if(attr_type>=0x0000 && attr_type<=0x7FFF)
|
||||||
unknown_attrs[(*ua_num)++] = nswap16(attr_type);
|
unknown_attrs[(*ua_num)++] = nswap16(attr_type);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user