From 948a61d2502ed0b222ee8626095c95041349b22d Mon Sep 17 00:00:00 2001 From: mom040267 Date: Fri, 3 Apr 2015 06:54:10 +0000 Subject: [PATCH] SCTP fixes. --- ChangeLog | 2 +- .../longtermsecure/secure_sctp_client.sh | 2 +- src/apps/common/apputils.c | 82 +++++++++++++++++-- src/apps/relay/ns_ioalib_engine_impl.c | 51 ++---------- src/server/ns_turn_ioalib.h | 4 +- 5 files changed, 87 insertions(+), 54 deletions(-) diff --git a/ChangeLog b/ChangeLog index dc71c762..e01eebf8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,6 @@ 3/31/2015 Oleg Moskalenko Version 4.4.4.2 'Ardee West': - - minor SCTP fix; + - SCTP fixes; 3/15/2015 Oleg Moskalenko Version 4.4.4.1 'Ardee West': diff --git a/examples/scripts/longtermsecure/secure_sctp_client.sh b/examples/scripts/longtermsecure/secure_sctp_client.sh index e6ca3ce0..8bdc3427 100755 --- a/examples/scripts/longtermsecure/secure_sctp_client.sh +++ b/examples/scripts/longtermsecure/secure_sctp_client.sh @@ -30,5 +30,5 @@ fi export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib/ -PATH=examples/bin/:../bin:./bin/:${PATH} turnutils_uclient -b -S -k turn_client_pkey.pem -n 1000 -m 10 -l 170 -e 127.0.0.1 -X -g -u gorst -w hero $@ ::1 +PATH=examples/bin/:../bin:./bin/:${PATH} turnutils_uclient -b -k turn_client_pkey.pem -n 1000 -m 10 -l 170 -e 127.0.0.1 -X -g -u gorst -w hero $@ ::1 diff --git a/src/apps/common/apputils.c b/src/apps/common/apputils.c index c9d7b7fe..0d3b7fe4 100644 --- a/src/apps/common/apputils.c +++ b/src/apps/common/apputils.c @@ -161,13 +161,6 @@ int socket_set_reusable(evutil_socket_t fd, int flag, SOCKET_TYPE st) int use_reuseaddr = 1; #endif -#if defined(SO_REUSEPORT) - if (use_reuseaddr) { - int on = flag; - setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, (const void*) &on, (socklen_t) sizeof(on)); - } -#endif - #if defined(SO_REUSEADDR) if (use_reuseaddr) { int on = flag; @@ -177,9 +170,10 @@ int socket_set_reusable(evutil_socket_t fd, int flag, SOCKET_TYPE st) } #endif +#if !defined(TURN_NO_SCTP) #if defined(SCTP_REUSE_PORT) if (use_reuseaddr) { - if((st == SCTP_SOCKET)||(st==TLS_SCTP_SOCKET)||(st==TENTATIVE_SCTP_SOCKET)) { + if(is_sctp_socket(st)) { int on = flag; int ret = setsockopt(fd, IPPROTO_SCTP, SCTP_REUSE_PORT, (const void*) &on, (socklen_t) sizeof(on)); if (ret < 0) @@ -187,6 +181,14 @@ int socket_set_reusable(evutil_socket_t fd, int flag, SOCKET_TYPE st) } } #endif +#endif + +#if defined(SO_REUSEPORT) + if (use_reuseaddr) { + int on = flag; + setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, (const void*) &on, (socklen_t) sizeof(on)); + } +#endif return 0; } @@ -434,6 +436,70 @@ int set_raw_socket_tos(evutil_socket_t fd, int family, int tos) 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; +} + +int is_tcp_socket(int st) { + switch(st) { + case TCP_SOCKET: + case TLS_SOCKET: + case TENTATIVE_TCP_SOCKET: + return 1; + default: + ; + } + return 0; +} + +int is_sctp_socket(int st) { + switch(st) { + 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"; +} + /////////////////// MTU ///////////////////////////////////////// int set_socket_df(evutil_socket_t fd, int family, int value) diff --git a/src/apps/relay/ns_ioalib_engine_impl.c b/src/apps/relay/ns_ioalib_engine_impl.c index 2deca3e6..4fa84a85 100644 --- a/src/apps/relay/ns_ioalib_engine_impl.c +++ b/src/apps/relay/ns_ioalib_engine_impl.c @@ -823,7 +823,7 @@ int set_socket_options_fd(evutil_socket_t fd, SOCKET_TYPE st, int family) set_sock_buf_size(fd,UR_CLIENT_SOCK_BUF_SIZE); - if(is_stream_socket(st)) { + if(is_tcp_socket(st)) { /* <<== FREEBSD fix */ struct linger so_linger; so_linger.l_onoff = 1; so_linger.l_linger = 0; @@ -869,7 +869,7 @@ int set_socket_options_fd(evutil_socket_t fd, SOCKET_TYPE st, int family) int flag = 1; - if((st == TENTATIVE_TCP_SOCKET)||(st == TCP_SOCKET)||(st == TLS_SOCKET)) { + if(is_tcp_socket(st)) { setsockopt(fd, /* socket affected */ IPPROTO_TCP, /* set option at TCP level */ TCP_NODELAY, /* name of option */ @@ -878,7 +878,7 @@ int set_socket_options_fd(evutil_socket_t fd, SOCKET_TYPE st, int family) } else { #if defined(SCTP_NODELAY) setsockopt(fd, /* socket affected */ - IPPROTO_SCTP, /* set option at TCP level */ + IPPROTO_SCTP, /* set option at SCTP level */ SCTP_NODELAY, /* name of option */ (char*)&flag, /* value */ sizeof(int)); /* length of option value */ @@ -907,46 +907,6 @@ 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_relay_ioa_socket(ioa_engine_handle e, int family, SOCKET_TYPE st, SOCKET_APP_TYPE sat) @@ -3171,6 +3131,11 @@ int send_data_from_ioa_socket_nbh(ioa_socket_handle s, ioa_addr* dest_addr, s->tobeclosed = 1; s->broken = 1; } + /* + bufferevent_flush(s->bev, + EV_READ|EV_WRITE, + BEV_FLUSH); + */ s->in_write = 0; } else { //drop the packet diff --git a/src/server/ns_turn_ioalib.h b/src/server/ns_turn_ioalib.h index 51e44a58..e464c0c7 100644 --- a/src/server/ns_turn_ioalib.h +++ b/src/server/ns_turn_ioalib.h @@ -231,7 +231,9 @@ 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); +int is_tcp_socket(int st); +int is_sctp_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);