#endif
int addressfamily = AF_UNSPEC;
-int maxtimeout = 900;
int seconds_till_retry = 5;
int max_connection_burst = 100;
-listen_socket_t listen_socket[MAXSOCKETS];
-int listen_sockets;
-
/* Setup sockets */
static void configure_tcp(connection_t *c) {
static bool bind_to_address(connection_t *c) {
int s = -1;
- for(int i = 0; i < listen_sockets && listen_socket[i].bindto; i++) {
- if(listen_socket[i].sa.sa.sa_family != c->address.sa.sa_family)
+ for(int i = 0; i < mesh->listen_sockets && mesh->listen_socket[i].bindto; i++) {
+ if(mesh->listen_socket[i].sa.sa.sa_family != c->address.sa.sa_family)
continue;
if(s >= 0)
return false;
if(s < 0)
return false;
- sockaddr_t sa = listen_socket[s].sa;
+ sockaddr_t sa = mesh->listen_socket[s].sa;
if(sa.sa.sa_family == AF_INET)
sa.in.sin_port = 0;
else if(sa.sa.sa_family == AF_INET6)
return nfd;
} /* int setup_vpn_in_socket */
-static void retry_outgoing_handler(void *data) {
+static void retry_outgoing_handler(event_loop_t *loop, void *data) {
setup_outgoing_connection(data);
}
void retry_outgoing(outgoing_t *outgoing) {
outgoing->timeout += 5;
- if(outgoing->timeout > maxtimeout)
- outgoing->timeout = maxtimeout;
+ if(outgoing->timeout > mesh->maxtimeout)
+ outgoing->timeout = mesh->maxtimeout;
- timeout_add(&outgoing->ev, retry_outgoing_handler, outgoing, &(struct timeval){outgoing->timeout, rand() % 100000});
+ timeout_add(&mesh->loop, &outgoing->ev, retry_outgoing_handler, outgoing, &(struct timeval){outgoing->timeout, rand() % 100000});
logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Trying to re-establish outgoing connection in %d seconds", outgoing->timeout);
}
buffer_read(&c->outbuf, outlen);
if(!c->outbuf.len)
- io_set(&c->io, IO_READ);
+ io_set(&mesh->loop, &c->io, IO_READ);
}
-static void handle_meta_io(void *data, int flags) {
+static void handle_meta_io(event_loop_t *loop, void *data, int flags) {
connection_t *c = data;
if(c->status.connecting) {
logger(DEBUG_CONNECTIONS, LOG_INFO, "Trying to connect to %s (%s)", outgoing->name, c->hostname);
- if(!proxytype) {
+ if(!mesh->proxytype) {
c->socket = socket(c->address.sa.sa_family, SOCK_STREAM, IPPROTO_TCP);
configure_tcp(c);
- } else if(proxytype == PROXY_EXEC) {
- do_outgoing_pipe(c, proxyhost);
+ } else if(mesh->proxytype == PROXY_EXEC) {
+ do_outgoing_pipe(c, mesh->proxyhost);
} else {
- proxyai = str2addrinfo(proxyhost, proxyport, SOCK_STREAM);
+ proxyai = str2addrinfo(mesh->proxyhost, mesh->proxyport, SOCK_STREAM);
if(!proxyai) {
free_connection(c);
goto begin;
}
- logger(DEBUG_CONNECTIONS, LOG_INFO, "Using proxy at %s port %s", proxyhost, proxyport);
+ logger(DEBUG_CONNECTIONS, LOG_INFO, "Using proxy at %s port %s", mesh->proxyhost, mesh->proxyport);
c->socket = socket(proxyai->ai_family, SOCK_STREAM, IPPROTO_TCP);
configure_tcp(c);
}
fcntl(c->socket, F_SETFD, FD_CLOEXEC);
#endif
- if(proxytype != PROXY_EXEC) {
+ if(mesh->proxytype != PROXY_EXEC) {
#if defined(SOL_IPV6) && defined(IPV6_V6ONLY)
int option = 1;
if(c->address.sa.sa_family == AF_INET6)
/* Connect */
- if(!proxytype) {
+ if(!mesh->proxytype) {
result = connect(c->socket, &c->address.sa, SALEN(c->address.sa));
- } else if(proxytype == PROXY_EXEC) {
+ } else if(mesh->proxytype == PROXY_EXEC) {
result = 0;
} else {
result = connect(c->socket, proxyai->ai_addr, proxyai->ai_addrlen);
connection_add(c);
- io_add(&c->io, handle_meta_io, c, c->socket, IO_READ|IO_WRITE);
+ io_add(&mesh->loop, &c->io, handle_meta_io, c, c->socket, IO_READ|IO_WRITE);
return true;
}
}
void setup_outgoing_connection(outgoing_t *outgoing) {
- timeout_del(&outgoing->ev);
+ timeout_del(&mesh->loop, &outgoing->ev);
node_t *n = lookup_node(outgoing->name);
accept a new tcp connect and create a
new connection
*/
-void handle_new_meta_connection(void *data, int flags) {
+void handle_new_meta_connection(event_loop_t *loop, void *data, int flags) {
listen_socket_t *l = data;
connection_t *c;
sockaddr_t sa;
logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Connection from %s", c->hostname);
- io_add(&c->io, handle_meta_io, c, c->socket, IO_READ);
+ io_add(&mesh->loop, &c->io, handle_meta_io, c, c->socket, IO_READ);
configure_tcp(c);
}
static void free_outgoing(outgoing_t *outgoing) {
- timeout_del(&outgoing->ev);
+ timeout_del(&mesh->loop, &outgoing->ev);
if(outgoing->ai)
freeaddrinfo(outgoing->ai);