diff --git a/configure b/configure index 61a25a5c..43a9928f 100755 --- a/configure +++ b/configure @@ -1157,11 +1157,25 @@ if [ -z "${LDCONFIG}" ] ; then fi fi +############################### +# SCTP +############################### + +if [ -z "${TURN_NO_SCTP}" ] ; then + if ! [ -f "/usr/include/linux/sctp.h" ] ; then + if ! [ -f "/usr/include/netinet/sctp.h" ] ; then + TURN_NO_SCTP="-DTURN_NO_SCTP" + fi + fi +else + TURN_NO_SCTP="-DTURN_NO_SCTP" +fi + ############################### # So, what we have now: ############################### -OSCFLAGS="${OSCFLAGS} ${TURN_NO_THREAD_BARRIERS} ${TURN_NO_DTLS} ${TURN_NO_GCM} ${TURN_NO_TLS} -DINSTALL_PREFIX=${PREFIX} -DTURNDB=${TURNDBDIR}/turndb" +OSCFLAGS="${OSCFLAGS} ${TURN_NO_SCTP} ${TURN_NO_THREAD_BARRIERS} ${TURN_NO_DTLS} ${TURN_NO_GCM} ${TURN_NO_TLS} -DINSTALL_PREFIX=${PREFIX} -DTURNDB=${TURNDBDIR}/turndb" if ! [ -z "${TURN_ACCEPT_RPATH}" ] ; then if [ -z "${TURN_DISABLE_RPATH}" ] ; then diff --git a/src/apps/relay/ns_ioalib_engine_impl.c b/src/apps/relay/ns_ioalib_engine_impl.c index 0ef9de52..0ab4b4c0 100644 --- a/src/apps/relay/ns_ioalib_engine_impl.c +++ b/src/apps/relay/ns_ioalib_engine_impl.c @@ -50,12 +50,13 @@ #include "hiredis_libevent2.h" #endif +#if !defined(TURN_NO_SCTP) #if defined(__linux__) || defined(__LINUX__) || defined(__linux) || defined(linux__) || defined(LINUX) || defined(__LINUX) || defined(LINUX__) #include #else #include #endif - +#endif /* Compilation test: #if defined(IP_RECVTTL) @@ -877,11 +878,14 @@ int set_socket_options_fd(evutil_socket_t fd, int tcp, int family) (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); @@ -921,6 +925,31 @@ int is_stream_socket(int st) { 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_relay_ioa_socket(ioa_engine_handle e, int family, SOCKET_TYPE st, SOCKET_APP_TYPE sat) @@ -2811,24 +2840,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: stream (TCP or SCTP) 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, "Stream (TCP or SCTP) 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, "Stream (TCP or SCTP) 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, "Stream (TCP or SCTP) 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, "Stream (TCP or SCTP) 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 (or SCTP) 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: stream (TCP or SCTP) 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, "Stream (TCP or SCTP) 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); } } } diff --git a/src/apps/relay/tls_listener.c b/src/apps/relay/tls_listener.c index accdfa26..291556e1 100644 --- a/src/apps/relay/tls_listener.c +++ b/src/apps/relay/tls_listener.c @@ -121,6 +121,8 @@ static void server_input_handler(struct evconnlistener *l, evutil_socket_t fd, FUNCEND ; } +#if !defined(TURN_NO_SCTP) + static void sctp_server_input_handler(struct evconnlistener *l, evutil_socket_t fd, struct sockaddr *sa, int socklen, void *arg) { @@ -184,6 +186,8 @@ static void sctp_server_input_handler(struct evconnlistener *l, evutil_socket_t FUNCEND ; } +#endif + ///////////////////// operations ////////////////////////// static int create_server_listener(tls_listener_relay_server_type* server) { @@ -251,6 +255,8 @@ static int create_server_listener(tls_listener_relay_server_type* server) { return 0; } +#if !defined(TURN_NO_SCTP) + static int sctp_create_server_listener(tls_listener_relay_server_type* server) { FUNCSTART; @@ -299,6 +305,8 @@ static int sctp_create_server_listener(tls_listener_relay_server_type* server) { return 0; } +#endif + static int init_server(tls_listener_relay_server_type* server, const char* ifname, const char *local_address, @@ -323,8 +331,10 @@ static int init_server(tls_listener_relay_server_type* server, server->verbose=verbose; server->e = e; - + +#if !defined(TURN_NO_SCTP) sctp_create_server_listener(server); +#endif return create_server_listener(server); } diff --git a/src/apps/relay/turn_admin_server.c b/src/apps/relay/turn_admin_server.c index f86f26c1..47264bd1 100644 --- a/src/apps/relay/turn_admin_server.c +++ b/src/apps/relay/turn_admin_server.c @@ -414,31 +414,6 @@ struct ps_arg { size_t users_number; }; -static const char* pname(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"; -} - static int print_session(ur_map_key_type key, ur_map_value_type value, void *arg) { if(key && value && arg) { @@ -518,7 +493,7 @@ static int print_session(ur_map_key_type key, ur_map_value_type value, void *arg } else { myprintf(cs," expiring in %lu secs\n",(unsigned long)(tsi->expiration_time - csarg->ct)); } - myprintf(cs," client protocol %s, relay protocol %s\n",pname(tsi->client_protocol),pname(tsi->peer_protocol)); + myprintf(cs," client protocol %s, relay protocol %s\n",socket_type_name(tsi->client_protocol),socket_type_name(tsi->peer_protocol)); { if(!tsi->local_addr_data.saddr[0]) addr_to_string(&(tsi->local_addr_data.addr),(u08bits*)tsi->local_addr_data.saddr); @@ -2247,9 +2222,9 @@ static int https_print_session(ur_map_key_type key, ur_map_value_type value, voi str_buffer_append_sz(sb,(size_t)(tsi->expiration_time - csarg->ct)); } str_buffer_append(sb,""); - str_buffer_append(sb,pname(tsi->client_protocol)); + str_buffer_append(sb,socket_type_name(tsi->client_protocol)); str_buffer_append(sb,""); - str_buffer_append(sb,pname(tsi->peer_protocol)); + str_buffer_append(sb,socket_type_name(tsi->peer_protocol)); str_buffer_append(sb,""); { if(!tsi->local_addr_data.saddr[0]) diff --git a/src/server/ns_turn_ioalib.h b/src/server/ns_turn_ioalib.h index 75fc3ae5..51e44a58 100644 --- a/src/server/ns_turn_ioalib.h +++ b/src/server/ns_turn_ioalib.h @@ -231,6 +231,7 @@ int get_ioa_socket_from_reservation(ioa_engine_handle e, u64bits in_reservation_ int get_ioa_socket_address_family(ioa_socket_handle s); int is_stream_socket(int st); + const char* socket_type_name(SOCKET_TYPE st); const char* get_ioa_socket_cipher(ioa_socket_handle s); const char* get_ioa_socket_ssl_method(ioa_socket_handle s); SOCKET_TYPE get_ioa_socket_type(ioa_socket_handle s);