mirror of
https://github.com/coturn/coturn.git
synced 2025-10-24 20:41:03 +02:00
'no sctp' implemented
This commit is contained in:
parent
8f821880fc
commit
6c247bbbae
16
configure
vendored
16
configure
vendored
@ -1157,11 +1157,25 @@ if [ -z "${LDCONFIG}" ] ; then
|
||||
fi
|
||||
fi
|
||||
|
||||
###############################
|
||||
# SCTP
|
||||
###############################
|
||||
|
||||
if [ -z "${TURN_NO_SCTP}" ] ; then
|
||||
if ! [ -f "/usr/include/linux/sctp.h" ] ; then
|
||||
if ! [ -f "/usr/include/netinet/sctp.h" ] ; then
|
||||
TURN_NO_SCTP="-DTURN_NO_SCTP"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
TURN_NO_SCTP="-DTURN_NO_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_NO_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
|
||||
|
||||
@ -50,12 +50,13 @@
|
||||
#include "hiredis_libevent2.h"
|
||||
#endif
|
||||
|
||||
#if !defined(TURN_NO_SCTP)
|
||||
#if defined(__linux__) || defined(__LINUX__) || defined(__linux) || defined(linux__) || defined(LINUX) || defined(__LINUX) || defined(LINUX__)
|
||||
#include <linux/sctp.h>
|
||||
#else
|
||||
#include <netinet/sctp.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* Compilation test:
|
||||
#if defined(IP_RECVTTL)
|
||||
@ -877,11 +878,14 @@ int set_socket_options_fd(evutil_socket_t fd, int tcp, int family)
|
||||
(char*)&flag, /* value */
|
||||
sizeof(int))<0) { /* length of option value */
|
||||
|
||||
#if defined(SCTP_NODELAY)
|
||||
setsockopt(fd, /* socket affected */
|
||||
IPPROTO_SCTP, /* set option at TCP level */
|
||||
SCTP_NODELAY, /* name of option */
|
||||
(char*)&flag, /* value */
|
||||
sizeof(int)); /* length of option value */
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
socket_tcp_set_keepalive(fd);
|
||||
@ -921,6 +925,31 @@ int is_stream_socket(int st) {
|
||||
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)
|
||||
@ -2811,24 +2840,36 @@ static void eventcb_bev(struct bufferevent *bev, short events, void *arg)
|
||||
addr_to_string(&(s->remote_addr),(u08bits*)sraddr);
|
||||
if (events & BEV_EVENT_EOF) {
|
||||
if(server->verbose)
|
||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: stream (TCP or SCTP) socket closed remotely %s\n",(unsigned long long)(ss->id),sraddr);
|
||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: %s socket closed remotely %s\n",
|
||||
(unsigned long long)(ss->id),socket_type_name(s->st),sraddr);
|
||||
if(s == ss->client_socket) {
|
||||
shutdown_client_connection(server, ss, 0, "Stream (TCP or SCTP) connection closed by client (callback)");
|
||||
char msg[256];
|
||||
snprintf(msg,sizeof(msg)-1,"%s connection closed by client (callback)",socket_type_name(s->st));
|
||||
shutdown_client_connection(server, ss, 0, msg);
|
||||
} else if(s == ss->alloc.relay_sessions[ALLOC_IPV4_INDEX].s) {
|
||||
shutdown_client_connection(server, ss, 0, "Stream (TCP or SCTP) connection closed by peer (ipv4 callback)");
|
||||
char msg[256];
|
||||
snprintf(msg,sizeof(msg)-1,"%s connection closed by peer (ipv4 callback)",socket_type_name(s->st));
|
||||
shutdown_client_connection(server, ss, 0, msg);
|
||||
} else if(s == ss->alloc.relay_sessions[ALLOC_IPV6_INDEX].s) {
|
||||
shutdown_client_connection(server, ss, 0, "Stream (TCP or SCTP) connection closed by peer (ipv6 callback)");
|
||||
char msg[256];
|
||||
snprintf(msg,sizeof(msg)-1,"%s connection closed by peer (ipv6 callback)",socket_type_name(s->st));
|
||||
shutdown_client_connection(server, ss, 0, msg);
|
||||
} else {
|
||||
shutdown_client_connection(server, ss, 0, "Stream (TCP or SCTP) connection closed by remote party (callback)");
|
||||
char msg[256];
|
||||
snprintf(msg,sizeof(msg)-1,"%s connection closed by remote party (callback)",socket_type_name(s->st));
|
||||
shutdown_client_connection(server, ss, 0, msg);
|
||||
}
|
||||
} else if (events & BEV_EVENT_ERROR) {
|
||||
if(EVUTIL_SOCKET_ERROR()) {
|
||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"session %018llu: TCP (or SCTP) socket error: %s %s\n",(unsigned long long)(ss->id),
|
||||
evutil_socket_error_to_string(EVUTIL_SOCKET_ERROR()), sraddr);
|
||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"session %018llu: %s socket error: %s %s\n",(unsigned long long)(ss->id),
|
||||
socket_type_name(s->st),evutil_socket_error_to_string(EVUTIL_SOCKET_ERROR()), sraddr);
|
||||
} else if(server->verbose) {
|
||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: stream (TCP or SCTP) socket disconnected: %s\n",(unsigned long long)(ss->id),sraddr);
|
||||
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: %s socket disconnected: %s\n",
|
||||
(unsigned long long)(ss->id),socket_type_name(s->st),sraddr);
|
||||
}
|
||||
shutdown_client_connection(server, ss, 0, "Stream (TCP or SCTP) socket buffer operation error (callback)");
|
||||
char msg[256];
|
||||
snprintf(msg,sizeof(msg)-1,"%s socket buffer operation error (callback)",socket_type_name(s->st));
|
||||
shutdown_client_connection(server, ss, 0, msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -121,6 +121,8 @@ static void server_input_handler(struct evconnlistener *l, evutil_socket_t fd,
|
||||
FUNCEND ;
|
||||
}
|
||||
|
||||
#if !defined(TURN_NO_SCTP)
|
||||
|
||||
static void sctp_server_input_handler(struct evconnlistener *l, evutil_socket_t fd,
|
||||
struct sockaddr *sa, int socklen, void *arg)
|
||||
{
|
||||
@ -184,6 +186,8 @@ static void sctp_server_input_handler(struct evconnlistener *l, evutil_socket_t
|
||||
FUNCEND ;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
///////////////////// operations //////////////////////////
|
||||
|
||||
static int create_server_listener(tls_listener_relay_server_type* server) {
|
||||
@ -251,6 +255,8 @@ static int create_server_listener(tls_listener_relay_server_type* server) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if !defined(TURN_NO_SCTP)
|
||||
|
||||
static int sctp_create_server_listener(tls_listener_relay_server_type* server) {
|
||||
|
||||
FUNCSTART;
|
||||
@ -299,6 +305,8 @@ static int sctp_create_server_listener(tls_listener_relay_server_type* server) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static int init_server(tls_listener_relay_server_type* server,
|
||||
const char* ifname,
|
||||
const char *local_address,
|
||||
@ -323,8 +331,10 @@ static int init_server(tls_listener_relay_server_type* server,
|
||||
server->verbose=verbose;
|
||||
|
||||
server->e = e;
|
||||
|
||||
|
||||
#if !defined(TURN_NO_SCTP)
|
||||
sctp_create_server_listener(server);
|
||||
#endif
|
||||
|
||||
return create_server_listener(server);
|
||||
}
|
||||
|
||||
@ -414,31 +414,6 @@ struct ps_arg {
|
||||
size_t users_number;
|
||||
};
|
||||
|
||||
static const char* pname(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";
|
||||
}
|
||||
|
||||
static int print_session(ur_map_key_type key, ur_map_value_type value, void *arg)
|
||||
{
|
||||
if(key && value && arg) {
|
||||
@ -518,7 +493,7 @@ static int print_session(ur_map_key_type key, ur_map_value_type value, void *arg
|
||||
} else {
|
||||
myprintf(cs," expiring in %lu secs\n",(unsigned long)(tsi->expiration_time - csarg->ct));
|
||||
}
|
||||
myprintf(cs," client protocol %s, relay protocol %s\n",pname(tsi->client_protocol),pname(tsi->peer_protocol));
|
||||
myprintf(cs," client protocol %s, relay protocol %s\n",socket_type_name(tsi->client_protocol),socket_type_name(tsi->peer_protocol));
|
||||
{
|
||||
if(!tsi->local_addr_data.saddr[0])
|
||||
addr_to_string(&(tsi->local_addr_data.addr),(u08bits*)tsi->local_addr_data.saddr);
|
||||
@ -2247,9 +2222,9 @@ static int https_print_session(ur_map_key_type key, ur_map_value_type value, voi
|
||||
str_buffer_append_sz(sb,(size_t)(tsi->expiration_time - csarg->ct));
|
||||
}
|
||||
str_buffer_append(sb,"</td><td>");
|
||||
str_buffer_append(sb,pname(tsi->client_protocol));
|
||||
str_buffer_append(sb,socket_type_name(tsi->client_protocol));
|
||||
str_buffer_append(sb,"</td><td>");
|
||||
str_buffer_append(sb,pname(tsi->peer_protocol));
|
||||
str_buffer_append(sb,socket_type_name(tsi->peer_protocol));
|
||||
str_buffer_append(sb,"</td><td>");
|
||||
{
|
||||
if(!tsi->local_addr_data.saddr[0])
|
||||
|
||||
@ -231,6 +231,7 @@ 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);
|
||||
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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user