'no sctp' implemented

libevent.rpm
mom040267 10 years ago
parent 8f821880fc
commit 6c247bbbae
  1. 16
      configure
  2. 61
      src/apps/relay/ns_ioalib_engine_impl.c
  3. 12
      src/apps/relay/tls_listener.c
  4. 31
      src/apps/relay/turn_admin_server.c
  5. 1
      src/server/ns_turn_ioalib.h

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…
Cancel
Save