fixing SCTP on Linux

This commit is contained in:
mom040267 2015-03-15 21:08:31 +00:00
parent 69653ea259
commit 0496635edd
9 changed files with 29 additions and 23 deletions

View File

@ -229,7 +229,7 @@ int addr_connect(evutil_socket_t fd, const ioa_addr* addr, int *out_errno)
}
}
int addr_bind(evutil_socket_t fd, const ioa_addr* addr, int reusable)
int addr_bind(evutil_socket_t fd, const ioa_addr* addr, int reusable, int debug)
{
if (!addr || fd < 0) {
@ -255,11 +255,13 @@ int addr_bind(evutil_socket_t fd, const ioa_addr* addr, int reusable)
return -1;
}
if(ret<0) {
int err = errno;
perror("bind");
char str[129];
addr_to_string(addr,(u08bits*)str);
TURN_LOG_FUNC(TURN_LOG_LEVEL_WARNING, "Trying to bind fd %d to <%s>: errno=%d\n", fd, str, err);
if(debug) {
int err = errno;
perror("bind");
char str[129];
addr_to_string(addr,(u08bits*)str);
TURN_LOG_FUNC(TURN_LOG_LEVEL_WARNING, "Trying to bind fd %d to <%s>: errno=%d\n", fd, str, err);
}
}
return ret;
}

View File

@ -180,7 +180,7 @@ int socket_tcp_set_keepalive(evutil_socket_t fd);
int addr_connect(evutil_socket_t fd, const ioa_addr* addr, int *out_errno);
int addr_bind(evutil_socket_t fd, const ioa_addr* addr, int reusable);
int addr_bind(evutil_socket_t fd, const ioa_addr* addr, int reusable, int debug);
int addr_get_from_sock(evutil_socket_t fd, ioa_addr *addr);

View File

@ -86,7 +86,7 @@ static int udp_create_server_socket(server_type* server,
set_sock_buf_size(udp_fd,UR_SERVER_SOCK_BUF_SIZE);
if(addr_bind(udp_fd,server_addr,1)<0) return -1;
if(addr_bind(udp_fd,server_addr,1,1)<0) return -1;
socket_set_nonblocking(udp_fd);

View File

@ -509,7 +509,7 @@ static int create_new_connected_udp_socket(
ret->local_addr_known = 1;
addr_cpy(&(ret->local_addr), &(s->local_addr));
if (addr_bind(udp_fd,&(s->local_addr),1) < 0) {
if (addr_bind(udp_fd,&(s->local_addr),1,1) < 0) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,
"Cannot bind new detached udp server socket to local addr\n");
IOA_CLOSE_SOCKET(ret);
@ -773,7 +773,7 @@ static int create_server_socket(dtls_listener_relay_server_type* server, int rep
int addr_bind_cycle = 0;
retry_addr_bind:
if(addr_bind(udp_listen_fd,&server->addr,1)<0) {
if(addr_bind(udp_listen_fd,&server->addr,1,1)<0) {
perror("Cannot bind local socket to addr");
char saddr[129];
addr_to_string(&server->addr,(u08bits*)saddr);
@ -851,7 +851,7 @@ static int reopen_server_socket(dtls_listener_relay_server_type* server, evutil_
server->ifname);
}
if(addr_bind(udp_listen_fd,&server->addr,1)<0) {
if(addr_bind(udp_listen_fd,&server->addr,1,1)<0) {
perror("Cannot bind local socket to addr");
char saddr[129];
addr_to_string(&server->addr,(u08bits*)saddr);

View File

@ -940,7 +940,7 @@ static int bind_ioa_socket(ioa_socket_handle s, const ioa_addr* local_addr, int
if (s && s->fd >= 0 && s->e && local_addr) {
int res = addr_bind(s->fd, local_addr, reusable);
int res = addr_bind(s->fd, local_addr, reusable,1);
if (res >= 0) {
s->bound = 1;
addr_cpy(&(s->local_addr), local_addr);
@ -1598,7 +1598,7 @@ ioa_socket_handle detach_ioa_socket(ioa_socket_handle s)
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"Cannot bind udp server socket to device %s\n",(char*)(s->e->relay_ifname));
}
if(addr_bind(udp_fd,&(s->local_addr),1)<0) {
if(addr_bind(udp_fd,&(s->local_addr),1,1)<0) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"Cannot bind new detached udp server socket to local addr\n");
close(udp_fd);
return ret;

View File

@ -38,7 +38,11 @@
#include <event2/listener.h>
#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
///////////////////////////////////////////////////
@ -148,7 +152,7 @@ static int create_server_listener(tls_listener_relay_server_type* server) {
int addr_bind_cycle = 0;
retry_addr_bind:
if(addr_bind(tls_listen_fd,&server->addr,1)<0) {
if(addr_bind(tls_listen_fd,&server->addr,1,1)<0) {
perror("Cannot bind local socket to addr");
char saddr[129];
addr_to_string(&server->addr,(u08bits*)saddr);
@ -208,10 +212,10 @@ static int sctp_create_server_listener(tls_listener_relay_server_type* server) {
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) {
if(addr_bind(tls_listen_fd,&server->addr,1,0)<0) {
close(tls_listen_fd);
return -1;
}
}
socket_tcp_set_keepalive(tls_listen_fd);

View File

@ -1270,7 +1270,7 @@ void setup_admin_thread(void)
return;
}
if(addr_bind(adminserver.listen_fd,&cli_addr,1)<0) {
if(addr_bind(adminserver.listen_fd,&cli_addr,1,1)<0) {
perror("Cannot bind CLI socket to addr");
char saddr[129];
addr_to_string(&cli_addr,(u08bits*)saddr);

View File

@ -263,7 +263,7 @@ static int run_stunclient(const char* rip, int rport, int *port, int *rfc5780, i
err(-1, NULL);
if (!addr_any(&real_local_addr)) {
if (addr_bind(udp_fd, &real_local_addr,0) < 0)
if (addr_bind(udp_fd, &real_local_addr,0,1) < 0)
err(-1, NULL);
}
}
@ -276,7 +276,7 @@ static int run_stunclient(const char* rip, int rport, int *port, int *rfc5780, i
addr_set_port(&real_local_addr, response_port);
if (addr_bind(new_udp_fd, &real_local_addr,0) < 0)
if (addr_bind(new_udp_fd, &real_local_addr,0,1) < 0)
err(-1, NULL);
}

View File

@ -259,7 +259,7 @@ static int clnet_connect(uint16_t clnet_remote_port, const char *remote_address,
}
}
addr_bind(clnet_fd, &local_addr, 0);
addr_bind(clnet_fd, &local_addr, 0, 1);
} else if (strlen(local_address) > 0) {
@ -267,7 +267,7 @@ static int clnet_connect(uint16_t clnet_remote_port, const char *remote_address,
&local_addr) < 0)
return -1;
addr_bind(clnet_fd, &local_addr,0);
addr_bind(clnet_fd, &local_addr,0,1);
}
if(clnet_info->is_peer) {
@ -1597,7 +1597,7 @@ void tcp_data_connect(app_ur_session *elem, u32bits cid)
addr_set_port(&(elem->pinfo.tcp_conn[i]->tcp_data_local_addr),0);
addr_bind(clnet_fd, &(elem->pinfo.tcp_conn[i]->tcp_data_local_addr), 1);
addr_bind(clnet_fd, &(elem->pinfo.tcp_conn[i]->tcp_data_local_addr), 1, 1);
addr_get_from_sock(clnet_fd,&(elem->pinfo.tcp_conn[i]->tcp_data_local_addr));
@ -1625,7 +1625,7 @@ void tcp_data_connect(app_ur_session *elem, u32bits cid)
addr_set_port(&(elem->pinfo.tcp_conn[i]->tcp_data_local_addr),0);
addr_bind(clnet_fd, &(elem->pinfo.tcp_conn[i]->tcp_data_local_addr),1);
addr_bind(clnet_fd, &(elem->pinfo.tcp_conn[i]->tcp_data_local_addr),1,1);
addr_get_from_sock(clnet_fd,&(elem->pinfo.tcp_conn[i]->tcp_data_local_addr));