|
|
@@ -38,6 +38,8 @@
|
|
|
|
|
|
#include <event2/listener.h>
|
|
|
|
|
|
+#include <netinet/sctp.h>
|
|
|
+
|
|
|
///////////////////////////////////////////////////
|
|
|
|
|
|
#define FUNCSTART if(server && eve(server->verbose)) TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"%s:%d:start\n",__FUNCTION__,__LINE__)
|
|
|
@@ -50,6 +52,7 @@ struct tls_listener_relay_server_info
|
|
|
ioa_engine_handle e;
|
|
|
int verbose;
|
|
|
struct evconnlistener *l;
|
|
|
+ struct evconnlistener *sctp_l;
|
|
|
struct message_to_relay sm;
|
|
|
ioa_engine_new_connection_event_handler connect_cb;
|
|
|
struct relay_server *relay_server;
|
|
|
@@ -149,13 +152,13 @@ static int create_server_listener(tls_listener_relay_server_type* server) {
|
|
|
perror("Cannot bind local socket to addr");
|
|
|
char saddr[129];
|
|
|
addr_to_string(&server->addr,(u08bits*)saddr);
|
|
|
- TURN_LOG_FUNC(TURN_LOG_LEVEL_WARNING,"Cannot bind TCP/TLS listener socket to addr %s\n",saddr);
|
|
|
+ TURN_LOG_FUNC(TURN_LOG_LEVEL_WARNING,"Cannot bind TLS/TCP listener socket to addr %s\n",saddr);
|
|
|
if(addr_bind_cycle++<max_binding_time) {
|
|
|
- TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Trying to bind TCP/TLS listener socket to addr %s, again...\n",saddr);
|
|
|
+ TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Trying to bind TLS/TCP listener socket to addr %s, again...\n",saddr);
|
|
|
sleep(1);
|
|
|
goto retry_addr_bind;
|
|
|
}
|
|
|
- TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"Fatal final failure: cannot bind TCP/TLS listener socket to addr %s\n",saddr);
|
|
|
+ TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"Fatal final failure: cannot bind TLS/TCP listener socket to addr %s\n",saddr);
|
|
|
exit(-1);
|
|
|
}
|
|
|
}
|
|
|
@@ -176,7 +179,7 @@ static int create_server_listener(tls_listener_relay_server_type* server) {
|
|
|
}
|
|
|
|
|
|
if(!turn_params.no_tcp && !turn_params.no_tls)
|
|
|
- addr_debug_print(server->verbose, &server->addr,"TCP/TLS listener opened on ");
|
|
|
+ addr_debug_print(server->verbose, &server->addr,"TLS/TCP listener opened on ");
|
|
|
else if(!turn_params.no_tls)
|
|
|
addr_debug_print(server->verbose, &server->addr,"TLS listener opened on ");
|
|
|
else if(!turn_params.no_tcp)
|
|
|
@@ -187,6 +190,78 @@ static int create_server_listener(tls_listener_relay_server_type* server) {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int sctp_create_server_listener(tls_listener_relay_server_type* server) {
|
|
|
+
|
|
|
+ FUNCSTART;
|
|
|
+
|
|
|
+ if(!server) return -1;
|
|
|
+
|
|
|
+ evutil_socket_t tls_listen_fd = -1;
|
|
|
+
|
|
|
+ tls_listen_fd = socket(server->addr.ss.sa_family, SCTP_CLIENT_STREAM_SOCKET_TYPE, SCTP_CLIENT_STREAM_SOCKET_PROTOCOL);
|
|
|
+ if (tls_listen_fd < 0) {
|
|
|
+ perror("socket");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(sock_bind_to_device(tls_listen_fd, (unsigned char*)server->ifname)<0) {
|
|
|
+ TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Cannot bind listener socket to device %s\n",server->ifname);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(addr_bind(tls_listen_fd,&server->addr,1)<0) {
|
|
|
+ close(tls_listen_fd);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ socket_tcp_set_keepalive(tls_listen_fd);
|
|
|
+
|
|
|
+ socket_set_nonblocking(tls_listen_fd);
|
|
|
+
|
|
|
+ {
|
|
|
+ struct sctp_paddrparams heartbeat;
|
|
|
+ ns_bzero(&heartbeat, sizeof(struct sctp_paddrparams));
|
|
|
+
|
|
|
+ heartbeat.spp_flags = SPP_HB_ENABLE;
|
|
|
+ heartbeat.spp_hbinterval = 5000;
|
|
|
+ heartbeat.spp_pathmaxrxt = 5;
|
|
|
+
|
|
|
+ /*Set Heartbeats*/
|
|
|
+ if(setsockopt(tls_listen_fd, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS , &heartbeat, sizeof(heartbeat)) != 0)
|
|
|
+ perror("setsockopt");
|
|
|
+ }
|
|
|
+
|
|
|
+ {
|
|
|
+ struct sctp_rtoinfo rtoinfo;
|
|
|
+ ns_bzero(&rtoinfo, sizeof(struct sctp_rtoinfo));
|
|
|
+
|
|
|
+ rtoinfo.srto_max = 5000;
|
|
|
+
|
|
|
+ /*Set rto_max*/
|
|
|
+ if(setsockopt(tls_listen_fd, IPPROTO_SCTP, SCTP_RTOINFO , &rtoinfo, sizeof(rtoinfo)) != 0)
|
|
|
+ perror("setsockopt");
|
|
|
+ }
|
|
|
+
|
|
|
+ server->sctp_l = evconnlistener_new(server->e->event_base,
|
|
|
+ server_input_handler, server,
|
|
|
+ LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE,
|
|
|
+ 1024, tls_listen_fd);
|
|
|
+
|
|
|
+ if(!(server->sctp_l)) {
|
|
|
+ TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Cannot create SCTP listener\n");
|
|
|
+ socket_closesocket(tls_listen_fd);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!turn_params.no_tls)
|
|
|
+ addr_debug_print(server->verbose, &server->addr, "TLS/SCTP listener opened on ");
|
|
|
+ else
|
|
|
+ addr_debug_print(server->verbose, &server->addr, "SCTP listener opened on ");
|
|
|
+
|
|
|
+ FUNCEND;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int init_server(tls_listener_relay_server_type* server,
|
|
|
const char* ifname,
|
|
|
const char *local_address,
|
|
|
@@ -212,6 +287,8 @@ static int init_server(tls_listener_relay_server_type* server,
|
|
|
|
|
|
server->e = e;
|
|
|
|
|
|
+ sctp_create_server_listener(server);
|
|
|
+
|
|
|
return create_server_listener(server);
|
|
|
}
|
|
|
|