1
0
mirror of https://github.com/coturn/coturn.git synced 2025-10-28 21:41:29 +01:00

issue 123

This commit is contained in:
mom040267 2014-04-27 09:38:19 +00:00
parent c5afa961a0
commit 8553e9f46a
3 changed files with 53 additions and 53 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);