|
|
|
|
@ -50,6 +50,10 @@ |
|
|
|
|
#include "hiredis_libevent2.h" |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#if !defined(TURN_NO_SCTP) && defined(TURN_SCTP_INCLUDE) |
|
|
|
|
#include TURN_SCTP_INCLUDE |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* Compilation test:
|
|
|
|
|
#if defined(IP_RECVTTL) |
|
|
|
|
#undef IP_RECVTTL |
|
|
|
|
@ -121,8 +125,12 @@ static int is_socket_writeable(ioa_socket_handle s, size_t sz, const char *msg, |
|
|
|
|
|
|
|
|
|
switch (s->st){ |
|
|
|
|
|
|
|
|
|
case SCTP_SOCKET: |
|
|
|
|
case TLS_SCTP_SOCKET: |
|
|
|
|
|
|
|
|
|
case TCP_SOCKET: |
|
|
|
|
case TLS_SOCKET: |
|
|
|
|
|
|
|
|
|
if (s->bev) { |
|
|
|
|
|
|
|
|
|
struct evbuffer *evb = bufferevent_get_output(s->bev); |
|
|
|
|
@ -810,7 +818,6 @@ int set_raw_socket_tos_options(evutil_socket_t fd, int family) |
|
|
|
|
|
|
|
|
|
int set_socket_options_fd(evutil_socket_t fd, int tcp, int family) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
if(fd<0) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
@ -859,14 +866,23 @@ int set_socket_options_fd(evutil_socket_t fd, int tcp, int family) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
|
|
int flag = 1; |
|
|
|
|
int result = setsockopt(fd, /* socket affected */ |
|
|
|
|
IPPROTO_TCP, /* set option at TCP level */ |
|
|
|
|
TCP_NODELAY, /* name of option */ |
|
|
|
|
(char*)&flag, /* value */ |
|
|
|
|
sizeof(int)); /* length of option value */ |
|
|
|
|
if (result < 0) |
|
|
|
|
perror("TCP_NODELAY"); |
|
|
|
|
if(setsockopt(fd, /* socket affected */ |
|
|
|
|
IPPROTO_TCP, /* set option at TCP level */ |
|
|
|
|
TCP_NODELAY, /* name of option */ |
|
|
|
|
(char*)&flag, /* value */ |
|
|
|
|
sizeof(int))<0) { /* length of option value */ |
|
|
|
|
|
|
|
|
|
#if defined(SCTP_NODELAY) |
|
|
|
|
setsockopt(fd, /* socket affected */ |
|
|
|
|
IPPROTO_SCTP, /* set option at TCP level */ |
|
|
|
|
SCTP_NODELAY, /* name of option */ |
|
|
|
|
(char*)&flag, /* value */ |
|
|
|
|
sizeof(int)); /* length of option value */ |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
socket_tcp_set_keepalive(fd); |
|
|
|
|
} |
|
|
|
|
@ -879,7 +895,7 @@ int set_socket_options(ioa_socket_handle s) |
|
|
|
|
if(!s || (s->parent_s)) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
set_socket_options_fd(s->fd,((s->st == TCP_SOCKET) || (s->st == TLS_SOCKET) || (s->st == TENTATIVE_TCP_SOCKET)),s->family); |
|
|
|
|
set_socket_options_fd(s->fd,is_stream_socket(s->st),s->family); |
|
|
|
|
|
|
|
|
|
s->default_ttl = get_raw_socket_ttl(s->fd, s->family); |
|
|
|
|
s->current_ttl = s->default_ttl; |
|
|
|
|
@ -890,16 +906,56 @@ int set_socket_options(ioa_socket_handle s) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int is_stream_socket(int st) { |
|
|
|
|
switch(st) { |
|
|
|
|
case TCP_SOCKET: |
|
|
|
|
case TLS_SOCKET: |
|
|
|
|
case TENTATIVE_TCP_SOCKET: |
|
|
|
|
case SCTP_SOCKET: |
|
|
|
|
case TLS_SCTP_SOCKET: |
|
|
|
|
case TENTATIVE_SCTP_SOCKET: |
|
|
|
|
return 1; |
|
|
|
|
default: |
|
|
|
|
; |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const char* socket_type_name(SOCKET_TYPE st) |
|
|
|
|
{ |
|
|
|
|
switch(st) { |
|
|
|
|
case TCP_SOCKET: |
|
|
|
|
return "TCP"; |
|
|
|
|
case SCTP_SOCKET: |
|
|
|
|
return "SCTP"; |
|
|
|
|
case UDP_SOCKET: |
|
|
|
|
return "UDP"; |
|
|
|
|
case TLS_SOCKET: |
|
|
|
|
return "TLS/TCP"; |
|
|
|
|
case TLS_SCTP_SOCKET: |
|
|
|
|
return "TLS/SCTP"; |
|
|
|
|
case DTLS_SOCKET: |
|
|
|
|
return "DTLS"; |
|
|
|
|
case TENTATIVE_TCP_SOCKET: |
|
|
|
|
return "TLS/TCP ?"; |
|
|
|
|
case TENTATIVE_SCTP_SOCKET: |
|
|
|
|
return "TLS/SCTP ?"; |
|
|
|
|
default: |
|
|
|
|
; |
|
|
|
|
}; |
|
|
|
|
return "UNKNOWN"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* <<== Socket options helpers */ |
|
|
|
|
|
|
|
|
|
ioa_socket_handle create_unbound_ioa_socket(ioa_engine_handle e, int family, SOCKET_TYPE st, SOCKET_APP_TYPE sat) |
|
|
|
|
ioa_socket_handle create_unbound_relay_ioa_socket(ioa_engine_handle e, int family, SOCKET_TYPE st, SOCKET_APP_TYPE sat) |
|
|
|
|
{ |
|
|
|
|
evutil_socket_t fd = -1; |
|
|
|
|
ioa_socket_handle ret = NULL; |
|
|
|
|
|
|
|
|
|
switch (st){ |
|
|
|
|
case UDP_SOCKET: |
|
|
|
|
fd = socket(family, SOCK_DGRAM, 0); |
|
|
|
|
fd = socket(family, RELAY_DGRAM_SOCKET_TYPE, RELAY_DGRAM_SOCKET_PROTOCOL); |
|
|
|
|
if (fd < 0) { |
|
|
|
|
perror("UDP socket"); |
|
|
|
|
return NULL; |
|
|
|
|
@ -907,7 +963,7 @@ ioa_socket_handle create_unbound_ioa_socket(ioa_engine_handle e, int family, SOC |
|
|
|
|
set_sock_buf_size(fd, UR_CLIENT_SOCK_BUF_SIZE); |
|
|
|
|
break; |
|
|
|
|
case TCP_SOCKET: |
|
|
|
|
fd = socket(family, SOCK_STREAM, 0); |
|
|
|
|
fd = socket(family, RELAY_STREAM_SOCKET_TYPE, RELAY_STREAM_SOCKET_PROTOCOL); |
|
|
|
|
if (fd < 0) { |
|
|
|
|
perror("TCP socket"); |
|
|
|
|
return NULL; |
|
|
|
|
@ -942,7 +998,7 @@ static int bind_ioa_socket(ioa_socket_handle s, const ioa_addr* local_addr, int |
|
|
|
|
|
|
|
|
|
if (s && s->fd >= 0 && s->e && local_addr) { |
|
|
|
|
|
|
|
|
|
int res = addr_bind(s->fd, local_addr, reusable); |
|
|
|
|
int res = addr_bind(s->fd, local_addr, reusable,1); |
|
|
|
|
if (res >= 0) { |
|
|
|
|
s->bound = 1; |
|
|
|
|
addr_cpy(&(s->local_addr), local_addr); |
|
|
|
|
@ -1016,7 +1072,7 @@ int create_relay_ioa_sockets(ioa_engine_handle e, |
|
|
|
|
if (port >= 0 && even_port > 0) { |
|
|
|
|
|
|
|
|
|
IOA_CLOSE_SOCKET(*rtcp_s); |
|
|
|
|
*rtcp_s = create_unbound_ioa_socket(e, relay_addr.ss.sa_family, UDP_SOCKET, RELAY_RTCP_SOCKET); |
|
|
|
|
*rtcp_s = create_unbound_relay_ioa_socket(e, relay_addr.ss.sa_family, UDP_SOCKET, RELAY_RTCP_SOCKET); |
|
|
|
|
if (*rtcp_s == NULL) { |
|
|
|
|
perror("socket"); |
|
|
|
|
IOA_CLOSE_SOCKET(*rtp_s); |
|
|
|
|
@ -1052,7 +1108,7 @@ int create_relay_ioa_sockets(ioa_engine_handle e, |
|
|
|
|
|
|
|
|
|
IOA_CLOSE_SOCKET(*rtp_s); |
|
|
|
|
|
|
|
|
|
*rtp_s = create_unbound_ioa_socket(e, relay_addr.ss.sa_family, |
|
|
|
|
*rtp_s = create_unbound_relay_ioa_socket(e, relay_addr.ss.sa_family, |
|
|
|
|
(transport == STUN_ATTRIBUTE_TRANSPORT_TCP_VALUE) ? TCP_SOCKET : UDP_SOCKET, |
|
|
|
|
RELAY_SOCKET); |
|
|
|
|
if (*rtp_s == NULL) { |
|
|
|
|
@ -1224,7 +1280,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 ret = create_unbound_ioa_socket(s->e, s->family, s->st, TCP_RELAY_DATA_SOCKET); |
|
|
|
|
ioa_socket_handle ret = create_unbound_relay_ioa_socket(s->e, s->family, s->st, TCP_RELAY_DATA_SOCKET); |
|
|
|
|
|
|
|
|
|
if(!ret) { |
|
|
|
|
return NULL; |
|
|
|
|
@ -1284,7 +1340,7 @@ ioa_socket_handle ioa_create_connecting_tcp_relay_socket(ioa_socket_handle s, io |
|
|
|
|
* Section 5.2 of RFC 6062 will not work correctly |
|
|
|
|
* for those OSes (for example, Linux pre-3.9 kernel). |
|
|
|
|
*/ |
|
|
|
|
s->fd = socket(s->family, SOCK_STREAM, 0); |
|
|
|
|
s->fd = socket(s->family, RELAY_STREAM_SOCKET_TYPE, RELAY_STREAM_SOCKET_PROTOCOL); |
|
|
|
|
if (s->fd < 0) { |
|
|
|
|
perror("TCP socket"); |
|
|
|
|
if(ret) { |
|
|
|
|
@ -1590,7 +1646,7 @@ ioa_socket_handle detach_ioa_socket(ioa_socket_handle s) |
|
|
|
|
evutil_socket_t udp_fd = -1; |
|
|
|
|
|
|
|
|
|
if(s->parent_s) { |
|
|
|
|
udp_fd = socket(s->local_addr.ss.sa_family, SOCK_DGRAM, 0); |
|
|
|
|
udp_fd = socket(s->local_addr.ss.sa_family, CLIENT_DGRAM_SOCKET_TYPE, CLIENT_DGRAM_SOCKET_PROTOCOL); |
|
|
|
|
if (udp_fd < 0) { |
|
|
|
|
perror("socket"); |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"%s: Cannot allocate new socket\n",__FUNCTION__); |
|
|
|
|
@ -1600,7 +1656,7 @@ ioa_socket_handle detach_ioa_socket(ioa_socket_handle s) |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"Cannot bind udp server socket to device %s\n",(char*)(s->e->relay_ifname)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(addr_bind(udp_fd,&(s->local_addr),1)<0) { |
|
|
|
|
if(addr_bind(udp_fd,&(s->local_addr),1,1)<0) { |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"Cannot bind new detached udp server socket to local addr\n"); |
|
|
|
|
close(udp_fd); |
|
|
|
|
return ret; |
|
|
|
|
@ -2211,7 +2267,7 @@ static int socket_input_worker(ioa_socket_handle s) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(s->st == TLS_SOCKET) { |
|
|
|
|
if((s->st == TLS_SOCKET)||(s->st == TLS_SCTP_SOCKET)) { |
|
|
|
|
#if TLS_SUPPORTED |
|
|
|
|
SSL *ctx = bufferevent_openssl_get_ssl(s->bev); |
|
|
|
|
if(!ctx || SSL_get_shutdown(ctx)) { |
|
|
|
|
@ -2297,6 +2353,74 @@ static int socket_input_worker(ioa_socket_handle s) |
|
|
|
|
bufferevent_setwatermark(s->bev, EV_READ|EV_WRITE, 0, BUFFEREVENT_HIGH_WATERMARK); |
|
|
|
|
bufferevent_enable(s->bev, EV_READ|EV_WRITE); /* Start reading. */ |
|
|
|
|
} |
|
|
|
|
} else if(s->st == TENTATIVE_SCTP_SOCKET) { |
|
|
|
|
EVENT_DEL(s->read_event); |
|
|
|
|
#if TLS_SUPPORTED |
|
|
|
|
TURN_TLS_TYPE tls_type = check_tentative_tls(s->fd); |
|
|
|
|
if(tls_type) { |
|
|
|
|
s->st = TLS_SCTP_SOCKET; |
|
|
|
|
if(s->ssl) { |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "!!!%s on socket: 0x%lx, st=%d, sat=%d: ssl already exist\n", __FUNCTION__,(long)s, s->st, s->sat); |
|
|
|
|
} |
|
|
|
|
if(s->bev) { |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "!!!%s on socket: 0x%lx, st=%d, sat=%d: bev already exist\n", __FUNCTION__,(long)s, s->st, s->sat); |
|
|
|
|
} |
|
|
|
|
switch(tls_type) { |
|
|
|
|
#if TLSv1_2_SUPPORTED |
|
|
|
|
case TURN_TLS_v1_2: |
|
|
|
|
if(s->e->tls_ctx_v1_2) { |
|
|
|
|
set_socket_ssl(s,SSL_NEW(s->e->tls_ctx_v1_2)); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
#endif |
|
|
|
|
#if TLSv1_1_SUPPORTED |
|
|
|
|
case TURN_TLS_v1_1: |
|
|
|
|
if(s->e->tls_ctx_v1_1) { |
|
|
|
|
set_socket_ssl(s,SSL_NEW(s->e->tls_ctx_v1_1)); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
#endif |
|
|
|
|
case TURN_TLS_v1_0: |
|
|
|
|
if(s->e->tls_ctx_v1_0) { |
|
|
|
|
set_socket_ssl(s,SSL_NEW(s->e->tls_ctx_v1_0)); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
if(s->e->tls_ctx_ssl23) { |
|
|
|
|
set_socket_ssl(s,SSL_NEW(s->e->tls_ctx_ssl23)); |
|
|
|
|
} else { |
|
|
|
|
s->tobeclosed = 1; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
if(s->ssl) { |
|
|
|
|
s->bev = bufferevent_openssl_socket_new(s->e->event_base, |
|
|
|
|
s->fd, |
|
|
|
|
s->ssl, |
|
|
|
|
BUFFEREVENT_SSL_ACCEPTING, |
|
|
|
|
TURN_BUFFEREVENTS_OPTIONS); |
|
|
|
|
debug_ptr_add(s->bev); |
|
|
|
|
bufferevent_setcb(s->bev, socket_input_handler_bev, socket_output_handler_bev, |
|
|
|
|
eventcb_bev, s); |
|
|
|
|
bufferevent_setwatermark(s->bev, EV_READ|EV_WRITE, 0, BUFFEREVENT_HIGH_WATERMARK); |
|
|
|
|
bufferevent_enable(s->bev, EV_READ|EV_WRITE); /* Start reading. */ |
|
|
|
|
} |
|
|
|
|
} else |
|
|
|
|
#endif //TLS_SUPPORTED
|
|
|
|
|
{ |
|
|
|
|
s->st = SCTP_SOCKET; |
|
|
|
|
if(s->bev) { |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "!!!%s on socket: 0x%lx, st=%d, sat=%d: bev already exist\n", __FUNCTION__,(long)s, s->st, s->sat); |
|
|
|
|
} |
|
|
|
|
s->bev = bufferevent_socket_new(s->e->event_base, |
|
|
|
|
s->fd, |
|
|
|
|
TURN_BUFFEREVENTS_OPTIONS); |
|
|
|
|
debug_ptr_add(s->bev); |
|
|
|
|
bufferevent_setcb(s->bev, socket_input_handler_bev, socket_output_handler_bev, |
|
|
|
|
eventcb_bev, s); |
|
|
|
|
bufferevent_setwatermark(s->bev, EV_READ|EV_WRITE, 0, BUFFEREVENT_HIGH_WATERMARK); |
|
|
|
|
bufferevent_enable(s->bev, EV_READ|EV_WRITE); /* Start reading. */ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
try_start: |
|
|
|
|
@ -2310,7 +2434,7 @@ static int socket_input_worker(ioa_socket_handle s) |
|
|
|
|
stun_buffer_list_elem *buf_elem = new_blist_elem(s->e); |
|
|
|
|
len = -1; |
|
|
|
|
|
|
|
|
|
if(s->bev) { /* TCP & TLS */ |
|
|
|
|
if(s->bev) { /* TCP & TLS & SCTP & SCTP/TLS */ |
|
|
|
|
struct evbuffer *inbuf = bufferevent_get_input(s->bev); |
|
|
|
|
if(inbuf) { |
|
|
|
|
ev_ssize_t blen = evbuffer_copyout(inbuf, buf_elem->buf.buf, STUN_BUFFER_SIZE); |
|
|
|
|
@ -2320,7 +2444,7 @@ static int socket_input_worker(ioa_socket_handle s) |
|
|
|
|
if(blen>(ev_ssize_t)STUN_BUFFER_SIZE) |
|
|
|
|
blen=(ev_ssize_t)STUN_BUFFER_SIZE; |
|
|
|
|
|
|
|
|
|
if(((s->st == TCP_SOCKET)||(s->st == TLS_SOCKET)) && ((s->sat == TCP_CLIENT_DATA_SOCKET)||(s->sat==TCP_RELAY_DATA_SOCKET))) { |
|
|
|
|
if(is_stream_socket(s->st) && ((s->sat == TCP_CLIENT_DATA_SOCKET)||(s->sat==TCP_RELAY_DATA_SOCKET))) { |
|
|
|
|
mlen = blen; |
|
|
|
|
} else { |
|
|
|
|
mlen = stun_get_message_len_str(buf_elem->buf.buf, blen, 1, &app_msg_len); |
|
|
|
|
@ -2333,7 +2457,7 @@ static int socket_input_worker(ioa_socket_handle s) |
|
|
|
|
s->tobeclosed = 1; |
|
|
|
|
s->broken = 1; |
|
|
|
|
log_socket_event(s, "socket read failed, to be closed",1); |
|
|
|
|
} else if(s->st == TLS_SOCKET) { |
|
|
|
|
} else if((s->st == TLS_SOCKET)||(s->st == TLS_SCTP_SOCKET)) { |
|
|
|
|
#if TLS_SUPPORTED |
|
|
|
|
SSL *ctx = bufferevent_openssl_get_ssl(s->bev); |
|
|
|
|
if(!ctx || SSL_get_shutdown(ctx)) { |
|
|
|
|
@ -2652,7 +2776,7 @@ static void eventcb_bev(struct bufferevent *bev, short events, void *arg) |
|
|
|
|
if (arg) { |
|
|
|
|
ioa_socket_handle s = (ioa_socket_handle) arg; |
|
|
|
|
|
|
|
|
|
if((s->st != TCP_SOCKET)&&(s->st != TLS_SOCKET)&&(s->st != TENTATIVE_TCP_SOCKET)) { |
|
|
|
|
if(!is_stream_socket(s->st)) { |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "!!! %s: socket type is wrong on the socket: 0x%lx, st=%d, sat=%d\n",__FUNCTION__,(long)s,s->st,s->sat); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
@ -2712,24 +2836,36 @@ static void eventcb_bev(struct bufferevent *bev, short events, void *arg) |
|
|
|
|
addr_to_string(&(s->remote_addr),(u08bits*)sraddr); |
|
|
|
|
if (events & BEV_EVENT_EOF) { |
|
|
|
|
if(server->verbose) |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: TCP socket closed remotely %s\n",(unsigned long long)(ss->id),sraddr); |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: %s socket closed remotely %s\n", |
|
|
|
|
(unsigned long long)(ss->id),socket_type_name(s->st),sraddr); |
|
|
|
|
if(s == ss->client_socket) { |
|
|
|
|
shutdown_client_connection(server, ss, 0, "TCP connection closed by client (callback)"); |
|
|
|
|
char msg[256]; |
|
|
|
|
snprintf(msg,sizeof(msg)-1,"%s connection closed by client (callback)",socket_type_name(s->st)); |
|
|
|
|
shutdown_client_connection(server, ss, 0, msg); |
|
|
|
|
} else if(s == ss->alloc.relay_sessions[ALLOC_IPV4_INDEX].s) { |
|
|
|
|
shutdown_client_connection(server, ss, 0, "TCP connection closed by peer (ipv4 callback)"); |
|
|
|
|
char msg[256]; |
|
|
|
|
snprintf(msg,sizeof(msg)-1,"%s connection closed by peer (ipv4 callback)",socket_type_name(s->st)); |
|
|
|
|
shutdown_client_connection(server, ss, 0, msg); |
|
|
|
|
} else if(s == ss->alloc.relay_sessions[ALLOC_IPV6_INDEX].s) { |
|
|
|
|
shutdown_client_connection(server, ss, 0, "TCP connection closed by peer (ipv6 callback)"); |
|
|
|
|
char msg[256]; |
|
|
|
|
snprintf(msg,sizeof(msg)-1,"%s connection closed by peer (ipv6 callback)",socket_type_name(s->st)); |
|
|
|
|
shutdown_client_connection(server, ss, 0, msg); |
|
|
|
|
} else { |
|
|
|
|
shutdown_client_connection(server, ss, 0, "TCP connection closed by remote party (callback)"); |
|
|
|
|
char msg[256]; |
|
|
|
|
snprintf(msg,sizeof(msg)-1,"%s connection closed by remote party (callback)",socket_type_name(s->st)); |
|
|
|
|
shutdown_client_connection(server, ss, 0, msg); |
|
|
|
|
} |
|
|
|
|
} else if (events & BEV_EVENT_ERROR) { |
|
|
|
|
if(EVUTIL_SOCKET_ERROR()) { |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"session %018llu: TCP socket error: %s %s\n",(unsigned long long)(ss->id), |
|
|
|
|
evutil_socket_error_to_string(EVUTIL_SOCKET_ERROR()), sraddr); |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"session %018llu: %s socket error: %s %s\n",(unsigned long long)(ss->id), |
|
|
|
|
socket_type_name(s->st),evutil_socket_error_to_string(EVUTIL_SOCKET_ERROR()), sraddr); |
|
|
|
|
} else if(server->verbose) { |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: TCP socket disconnected: %s\n",(unsigned long long)(ss->id),sraddr); |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: %s socket disconnected: %s\n", |
|
|
|
|
(unsigned long long)(ss->id),socket_type_name(s->st),sraddr); |
|
|
|
|
} |
|
|
|
|
shutdown_client_connection(server, ss, 0, "TCP socket buffer operation error (callback)"); |
|
|
|
|
char msg[256]; |
|
|
|
|
snprintf(msg,sizeof(msg)-1,"%s socket buffer operation error (callback)",socket_type_name(s->st)); |
|
|
|
|
shutdown_client_connection(server, ss, 0, msg); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -3005,7 +3141,7 @@ int send_data_from_ioa_socket_nbh(ioa_socket_handle s, ioa_addr* dest_addr, |
|
|
|
|
set_socket_tos(s, tos); |
|
|
|
|
|
|
|
|
|
if (s->connected && s->bev) { |
|
|
|
|
if (s->st == TLS_SOCKET) { |
|
|
|
|
if ((s->st == TLS_SOCKET)||(s->st == TLS_SCTP_SOCKET)) { |
|
|
|
|
#if TLS_SUPPORTED |
|
|
|
|
SSL *ctx = bufferevent_openssl_get_ssl(s->bev); |
|
|
|
|
if (!ctx || SSL_get_shutdown(ctx)) { |
|
|
|
|
@ -3109,7 +3245,7 @@ int send_data_from_ioa_socket_tcp(ioa_socket_handle s, const void *data, size_t |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "!!! %s socket: 0x%lx was closed\n", __FUNCTION__,(long)s); |
|
|
|
|
|
|
|
|
|
} else if (s->connected && s->bev) { |
|
|
|
|
if (s->st == TLS_SOCKET) { |
|
|
|
|
if ((s->st == TLS_SOCKET)||(s->st == TLS_SCTP_SOCKET)) { |
|
|
|
|
#if TLS_SUPPORTED |
|
|
|
|
SSL *ctx = bufferevent_openssl_get_ssl(s->bev); |
|
|
|
|
if (!ctx || SSL_get_shutdown(ctx)) { |
|
|
|
|
@ -3182,6 +3318,7 @@ int register_callback_on_ioa_socket(ioa_engine_handle e, ioa_socket_handle s, in |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case TENTATIVE_TCP_SOCKET: |
|
|
|
|
case TENTATIVE_SCTP_SOCKET: |
|
|
|
|
if(s->bev) { |
|
|
|
|
if(!clean_preexisting) { |
|
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, |
|
|
|
|
@ -3199,6 +3336,7 @@ int register_callback_on_ioa_socket(ioa_engine_handle e, ioa_socket_handle s, in |
|
|
|
|
event_add(s->read_event,NULL); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case SCTP_SOCKET: |
|
|
|
|
case TCP_SOCKET: |
|
|
|
|
if(s->bev) { |
|
|
|
|
if(!clean_preexisting) { |
|
|
|
|
@ -3222,6 +3360,7 @@ int register_callback_on_ioa_socket(ioa_engine_handle e, ioa_socket_handle s, in |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case TLS_SCTP_SOCKET: |
|
|
|
|
case TLS_SOCKET: |
|
|
|
|
if(s->bev) { |
|
|
|
|
if(!clean_preexisting) { |
|
|
|
|
|