Skip to content

Commit

Permalink
SCTP fixes.
Browse files Browse the repository at this point in the history
  • Loading branch information
mom040267 committed Apr 3, 2015
1 parent b830cc1 commit 798a891
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 54 deletions.
2 changes: 1 addition & 1 deletion ChangeLog
Original file line number Diff line number Diff line change
@@ -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':
Expand Down
2 changes: 1 addition & 1 deletion examples/scripts/longtermsecure/secure_sctp_client.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

82 changes: 74 additions & 8 deletions src/apps/common/apputils.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -177,16 +170,25 @@ 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)
perror("SCTP_REUSE_PORT");
}
}
#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;
}
Expand Down Expand Up @@ -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)
Expand Down
51 changes: 8 additions & 43 deletions src/apps/relay/ns_ioalib_engine_impl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 */
Expand All @@ -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 */
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
4 changes: 3 additions & 1 deletion src/server/ns_turn_ioalib.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 798a891

Please sign in to comment.