From 1b279a2a5ff58aa9f7b00a7cc8c33cd68c51b8d0 Mon Sep 17 00:00:00 2001 From: mom040267 Date: Sun, 15 Mar 2015 06:10:49 +0000 Subject: [PATCH] optional SCTP support added --- ChangeLog | 4 ++++ configure | 12 +++++++++++- rpm/build.settings.sh | 2 +- rpm/turnserver.spec | 4 +++- src/apps/peer/udpserver.c | 2 +- src/apps/relay/dtls_listener.c | 6 +++--- src/apps/relay/mainrelay.c | 6 +++++- src/apps/relay/ns_ioalib_engine_impl.c | 14 +++++++------- src/apps/relay/tls_listener.c | 2 +- src/apps/relay/turn_admin_server.c | 2 +- src/apps/stunclient/stunclient.c | 4 ++-- src/apps/uclient/startuclient.c | 8 +++++--- src/ns_turn_defs.h | 26 +++++++++++++++++++++++++- src/server/ns_turn_ioalib.h | 2 +- 14 files changed, 70 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0a5a39c5..5e16ef91 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +3/15/2015 Oleg Moskalenko +Version 4.4.3.1 'Ardee West': + - SCTP support compilation option; + 2/28/2015 Oleg Moskalenko Version 4.4.2.3 'Ardee West': - bandwidth control fixed; diff --git a/configure b/configure index fbb02442..1cb67df0 100755 --- a/configure +++ b/configure @@ -1157,12 +1157,22 @@ if [ -z "${LDCONFIG}" ] ; then fi fi +############################### +# SCTP +############################### + +if [ -z "${TURN_SCTP}" ] ; then + echo "no SCTP support" +else + echo "compiling with native SCTP client-side support (in place of TCP)" + TURN_SCTP="-DTURN_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_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/rpm/build.settings.sh b/rpm/build.settings.sh index 0150ec91..df864e5f 100755 --- a/rpm/build.settings.sh +++ b/rpm/build.settings.sh @@ -2,7 +2,7 @@ # Common settings script. -TURNVERSION=4.4.2.3 +TURNVERSION=4.4.3.1 BUILDDIR=~/rpmbuild ARCH=`uname -p` TURNSERVER_SVN_URL=http://coturn.googlecode.com/svn diff --git a/rpm/turnserver.spec b/rpm/turnserver.spec index 32e4ae8d..be515ffd 100644 --- a/rpm/turnserver.spec +++ b/rpm/turnserver.spec @@ -1,5 +1,5 @@ Name: turnserver -Version: 4.4.2.3 +Version: 4.4.3.1 Release: 0%{dist} Summary: Coturn TURN Server @@ -288,6 +288,8 @@ fi %{_includedir}/turn/client/TurnMsgLib.h %changelog +* Sun Mar 15 2015 Oleg Moskalenko + - Sync to 4.4.3.1 * Sat Feb 28 2015 Oleg Moskalenko - Sync to 4.4.2.3 * Wed Feb 18 2015 Oleg Moskalenko diff --git a/src/apps/peer/udpserver.c b/src/apps/peer/udpserver.c index 9e6e3fde..4b15f0bd 100644 --- a/src/apps/peer/udpserver.c +++ b/src/apps/peer/udpserver.c @@ -74,7 +74,7 @@ static int udp_create_server_socket(server_type* server, if(make_ioa_addr((const u08bits*)local_address, port, server_addr)<0) return -1; - udp_fd = socket(server_addr->ss.sa_family, SOCK_DGRAM, 0); + udp_fd = socket(server_addr->ss.sa_family, RELAY_DGRAM_SOCKET_TYPE, RELAY_DGRAM_SOCKET_PROTOCOL); if (udp_fd < 0) { perror("socket"); return -1; diff --git a/src/apps/relay/dtls_listener.c b/src/apps/relay/dtls_listener.c index 0762fbc8..26393548 100644 --- a/src/apps/relay/dtls_listener.c +++ b/src/apps/relay/dtls_listener.c @@ -474,7 +474,7 @@ static int create_new_connected_udp_socket( dtls_listener_relay_server_type* server, ioa_socket_handle s) { - evutil_socket_t udp_fd = socket(s->local_addr.ss.sa_family, SOCK_DGRAM, 0); + evutil_socket_t 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", @@ -751,7 +751,7 @@ static int create_server_socket(dtls_listener_relay_server_type* server, int rep { ioa_socket_raw udp_listen_fd = -1; - udp_listen_fd = socket(server->addr.ss.sa_family, SOCK_DGRAM, 0); + udp_listen_fd = socket(server->addr.ss.sa_family, CLIENT_DGRAM_SOCKET_TYPE, CLIENT_DGRAM_SOCKET_PROTOCOL); if (udp_listen_fd < 0) { perror("socket"); return -1; @@ -830,7 +830,7 @@ static int reopen_server_socket(dtls_listener_relay_server_type* server, evutil_ return create_server_socket(server,1); } - ioa_socket_raw udp_listen_fd = socket(server->addr.ss.sa_family, SOCK_DGRAM, 0); + ioa_socket_raw udp_listen_fd = socket(server->addr.ss.sa_family, CLIENT_DGRAM_SOCKET_TYPE, CLIENT_DGRAM_SOCKET_PROTOCOL); if (udp_listen_fd < 0) { perror("socket"); FUNCEND; diff --git a/src/apps/relay/mainrelay.c b/src/apps/relay/mainrelay.c index 035caf8e..206e1075 100644 --- a/src/apps/relay/mainrelay.c +++ b/src/apps/relay/mainrelay.c @@ -1690,7 +1690,11 @@ static void set_network_engine(void) turn_params.net_engine_version = NEV_UDP_SOCKET_PER_ENDPOINT; #if defined(SO_REUSEPORT) #if defined(__linux__) || defined(__LINUX__) || defined(__linux) || defined(linux__) || defined(LINUX) || defined(__LINUX) || defined(LINUX__) - turn_params.net_engine_version = NEV_UDP_SOCKET_PER_THREAD; + if(CLIENT_STREAM_SOCKET_PROTOCOL == IPPROTO_IP) { + turn_params.net_engine_version = NEV_UDP_SOCKET_PER_THREAD; + } else { + turn_params.net_engine_version = NEV_UDP_SOCKET_PER_SESSION; + } #else /* BSD ? */ turn_params.net_engine_version = NEV_UDP_SOCKET_PER_SESSION; #endif /* Linux */ diff --git a/src/apps/relay/ns_ioalib_engine_impl.c b/src/apps/relay/ns_ioalib_engine_impl.c index b7066335..3804a80a 100644 --- a/src/apps/relay/ns_ioalib_engine_impl.c +++ b/src/apps/relay/ns_ioalib_engine_impl.c @@ -892,14 +892,14 @@ int set_socket_options(ioa_socket_handle s) /* <<== 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 +907,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; @@ -1016,7 +1016,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 +1052,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 +1224,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; @@ -1590,7 +1590,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__); diff --git a/src/apps/relay/tls_listener.c b/src/apps/relay/tls_listener.c index 03208b4a..12d874be 100644 --- a/src/apps/relay/tls_listener.c +++ b/src/apps/relay/tls_listener.c @@ -130,7 +130,7 @@ static int create_server_listener(tls_listener_relay_server_type* server) { evutil_socket_t tls_listen_fd = -1; - tls_listen_fd = socket(server->addr.ss.sa_family, SOCK_STREAM, 0); + tls_listen_fd = socket(server->addr.ss.sa_family, CLIENT_STREAM_SOCKET_TYPE, CLIENT_STREAM_SOCKET_PROTOCOL); if (tls_listen_fd < 0) { perror("socket"); return -1; diff --git a/src/apps/relay/turn_admin_server.c b/src/apps/relay/turn_admin_server.c index af616aa8..a9fb4d3a 100644 --- a/src/apps/relay/turn_admin_server.c +++ b/src/apps/relay/turn_admin_server.c @@ -1263,7 +1263,7 @@ void setup_admin_thread(void) addr_set_port(&cli_addr,cli_port); - adminserver.listen_fd = socket(cli_addr.ss.sa_family, SOCK_STREAM, 0); + adminserver.listen_fd = socket(cli_addr.ss.sa_family, ADMIN_STREAM_SOCKET_TYPE, ADMIN_STREAM_SOCKET_PROTOCOL); if (adminserver.listen_fd < 0) { perror("socket"); TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"Cannot open CLI socket\n"); diff --git a/src/apps/stunclient/stunclient.c b/src/apps/stunclient/stunclient.c index d7ff4c81..6565d5f2 100644 --- a/src/apps/stunclient/stunclient.c +++ b/src/apps/stunclient/stunclient.c @@ -258,7 +258,7 @@ static int run_stunclient(const char* rip, int rport, int *port, int *rfc5780, i err(-1, NULL); if (udp_fd < 0) { - udp_fd = socket(remote_addr.ss.sa_family, SOCK_DGRAM, 0); + udp_fd = socket(remote_addr.ss.sa_family, CLIENT_DGRAM_SOCKET_TYPE, CLIENT_DGRAM_SOCKET_PROTOCOL); if (udp_fd < 0) err(-1, NULL); @@ -270,7 +270,7 @@ static int run_stunclient(const char* rip, int rport, int *port, int *rfc5780, i if (response_port >= 0) { - new_udp_fd = socket(remote_addr.ss.sa_family, SOCK_DGRAM, 0); + new_udp_fd = socket(remote_addr.ss.sa_family, CLIENT_DGRAM_SOCKET_TYPE, CLIENT_DGRAM_SOCKET_PROTOCOL); if (new_udp_fd < 0) err(-1, NULL); diff --git a/src/apps/uclient/startuclient.c b/src/apps/uclient/startuclient.c index c8e2e138..f9345717 100644 --- a/src/apps/uclient/startuclient.c +++ b/src/apps/uclient/startuclient.c @@ -229,7 +229,9 @@ static int clnet_connect(uint16_t clnet_remote_port, const char *remote_address, ns_bzero(&local_addr, sizeof(ioa_addr)); - clnet_fd = socket(remote_addr.ss.sa_family, use_tcp ? SOCK_STREAM : SOCK_DGRAM, 0); + clnet_fd = socket(remote_addr.ss.sa_family, + use_tcp ? CLIENT_STREAM_SOCKET_TYPE : CLIENT_DGRAM_SOCKET_TYPE, + use_tcp ? CLIENT_STREAM_SOCKET_PROTOCOL : CLIENT_DGRAM_SOCKET_PROTOCOL); if (clnet_fd < 0) { perror("socket"); exit(-1); @@ -1570,7 +1572,7 @@ void tcp_data_connect(app_ur_session *elem, u32bits cid) again: - clnet_fd = socket(elem->pinfo.remote_addr.ss.sa_family, SOCK_STREAM, 0); + clnet_fd = socket(elem->pinfo.remote_addr.ss.sa_family, CLIENT_STREAM_SOCKET_TYPE, CLIENT_STREAM_SOCKET_PROTOCOL); if (clnet_fd < 0) { perror("socket"); exit(-1); @@ -1606,7 +1608,7 @@ void tcp_data_connect(app_ur_session *elem, u32bits cid) if (addr_connect(clnet_fd, &(elem->pinfo.remote_addr),&err) < 0) { if(err == EADDRINUSE) { socket_closesocket(clnet_fd); - clnet_fd = socket(elem->pinfo.remote_addr.ss.sa_family, SOCK_STREAM, 0); + clnet_fd = socket(elem->pinfo.remote_addr.ss.sa_family, CLIENT_STREAM_SOCKET_TYPE, CLIENT_STREAM_SOCKET_PROTOCOL); if (clnet_fd < 0) { perror("socket"); exit(-1); diff --git a/src/ns_turn_defs.h b/src/ns_turn_defs.h index d5af888d..3a4325bf 100644 --- a/src/ns_turn_defs.h +++ b/src/ns_turn_defs.h @@ -31,7 +31,7 @@ #ifndef __IOADEFS__ #define __IOADEFS__ -#define TURN_SERVER_VERSION "4.4.2.3" +#define TURN_SERVER_VERSION "4.4.3.1" #define TURN_SERVER_VERSION_NAME "Ardee West" #define TURN_SOFTWARE "Coturn-" TURN_SERVER_VERSION " '" TURN_SERVER_VERSION_NAME "'" @@ -218,6 +218,30 @@ typedef u32bits turn_time_t; //////////////////////////////////////////////////////// +//#define DGRAM_SOCKET_TYPE SOCK_SEQPACKET +//#define DGRAM_SOCKET_PROTOCOL IPPROTO_SCTP + +#define CLIENT_DGRAM_SOCKET_TYPE SOCK_DGRAM +#define CLIENT_DGRAM_SOCKET_PROTOCOL IPPROTO_IP + +#define CLIENT_STREAM_SOCKET_TYPE SOCK_STREAM + +#if defined(TURN_SCTP) + #define CLIENT_STREAM_SOCKET_PROTOCOL IPPROTO_SCTP +#else + #define CLIENT_STREAM_SOCKET_PROTOCOL IPPROTO_IP +#endif + +#define RELAY_DGRAM_SOCKET_TYPE SOCK_DGRAM +#define RELAY_DGRAM_SOCKET_PROTOCOL IPPROTO_IP +#define RELAY_STREAM_SOCKET_TYPE SOCK_STREAM +#define RELAY_STREAM_SOCKET_PROTOCOL IPPROTO_IP + +#define ADMIN_STREAM_SOCKET_TYPE SOCK_STREAM +#define ADMIN_STREAM_SOCKET_PROTOCOL IPPROTO_IP + +//////////////////////////////////////////////////////// + #ifdef __cplusplus } #endif diff --git a/src/server/ns_turn_ioalib.h b/src/server/ns_turn_ioalib.h index 4e6cb518..5208484a 100644 --- a/src/server/ns_turn_ioalib.h +++ b/src/server/ns_turn_ioalib.h @@ -206,7 +206,7 @@ void stop_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) -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); void inc_ioa_socket_ref_counter(ioa_socket_handle s);