Browse Source

SCTP fixes.

mom040267 10 years ago
parent
commit
948a61d250

+ 1 - 1
ChangeLog

@@ -1,6 +1,6 @@
 3/31/2015 Oleg Moskalenko <[email protected]>
 Version 4.4.4.2 'Ardee West':
-	- minor SCTP fix;
+	- SCTP fixes;
 	
 3/15/2015 Oleg Moskalenko <[email protected]>
 Version 4.4.4.1 'Ardee West':

+ 1 - 1
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
 

+ 74 - 8
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)

+ 8 - 43
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

+ 3 - 1
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);