/*
net.c -- most of the network code
- Copyright (C) 1998-2005 Ivo Timmermans,
- 2000-2013 Guus Sliepen <guus@tinc-vpn.org>
- 2006 Scott Lamb <slamb@slamb.org>
- 2011 Loïc Grenié <loic.grenie@gmail.com>
+ Copyright (C) 2014 Guus Sliepen <guus@meshlink.io>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "connection.h"
#include "graph.h"
#include "logger.h"
+#include "meshlink_internal.h"
#include "meta.h"
#include "net.h"
#include "netutl.h"
/* Remove all edges owned by unreachable nodes. */
- for splay_each(node_t, n, node_tree) {
+ for splay_each(node_t, n, mesh->nodes) {
if(!n->status.reachable) {
logger(DEBUG_SCARY_THINGS, LOG_DEBUG, "Purging node %s (%s)", n->name, n->hostname);
for splay_each(edge_t, e, n->edge_tree) {
- if(!tunnelserver)
- send_del_edge(everyone, e);
+ send_del_edge(everyone, e);
edge_del(e);
}
}
/* Check if anyone else claims to have an edge to an unreachable node. If not, delete node. */
- for splay_each(node_t, n, node_tree) {
+ for splay_each(node_t, n, mesh->nodes) {
if(!n->status.reachable) {
- for splay_each(edge_t, e, edge_weight_tree)
+ for splay_each(edge_t, e, mesh->edges)
if(e->to == n)
return;
}
c->node->connection = NULL;
if(c->edge) {
- if(report && !tunnelserver)
+ if(report)
send_del_edge(everyone, c->edge);
edge_del(c->edge);
if(report && !c->node->status.reachable) {
edge_t *e;
- e = lookup_edge(c->node, myself);
+ e = lookup_edge(c->node, mesh->self);
if(e) {
- if(!tunnelserver)
- send_del_edge(everyone, e);
+ send_del_edge(everyone, e);
edge_del(e);
}
}
and close the connection.
*/
static void timeout_handler(void *data) {
- for list_each(connection_t, c, connection_list) {
+ for list_each(connection_t, c, mesh->connections) {
if(c->last_ping_time + pingtimeout <= now.tv_sec) {
if(c->status.active) {
if(c->status.pinged) {
/* If AutoConnect is set, check if we need to make or break connections. */
- if(autoconnect && node_tree->count > 1) {
+ if(autoconnect && mesh->nodes->count > 1) {
/* Count number of active connections */
int nc = 0;
- for list_each(connection_t, c, connection_list) {
+ for list_each(connection_t, c, mesh->connections) {
if(c->status.active)
nc++;
}
and we are not already trying to make one, create an
outgoing connection to this node.
*/
- int r = rand() % node_tree->count;
+ int r = rand() % mesh->nodes->count;
int i = 0;
- for splay_each(node_t, n, node_tree) {
+ for splay_each(node_t, n, mesh->nodes) {
if(i++ != r)
continue;
bool found = false;
- for list_each(outgoing_t, outgoing, outgoing_list) {
+ for list_each(outgoing_t, outgoing, mesh->outgoings) {
if(!strcmp(outgoing->name, n->name)) {
found = true;
break;
logger(DEBUG_CONNECTIONS, LOG_INFO, "Autoconnecting to %s", n->name);
outgoing_t *outgoing = xzalloc(sizeof *outgoing);
outgoing->name = xstrdup(n->name);
- list_insert_tail(outgoing_list, outgoing);
+ list_insert_tail(mesh->outgoings, outgoing);
setup_outgoing_connection(outgoing);
}
break;
int r = rand() % nc;
int i = 0;
- for list_each(connection_t, c, connection_list) {
+ for list_each(connection_t, c, mesh->connections) {
if(!c->status.active)
continue;
break;
logger(DEBUG_CONNECTIONS, LOG_INFO, "Autodisconnecting from %s", c->name);
- list_delete(outgoing_list, c->outgoing);
+ list_delete(mesh->outgoings, c->outgoing);
c->outgoing = NULL;
terminate_connection(c, c->status.active);
break;
/* If we have enough active connections,
remove any pending outgoing connections.
*/
- for list_each(outgoing_t, o, outgoing_list) {
+ for list_each(outgoing_t, o, mesh->outgoings) {
bool found = false;
- for list_each(connection_t, c, connection_list) {
+ for list_each(connection_t, c, mesh->connections) {
if(c->outgoing == o) {
found = true;
break;
}
if(!found) {
logger(DEBUG_CONNECTIONS, LOG_INFO, "Cancelled outgoing connection to %s", o->name);
- list_delete_node(outgoing_list, node);
+ list_delete_node(mesh->outgoings, node);
}
}
}
return EINVAL;
}
- read_config_options(config_tree, NULL);
-
- xasprintf(&fname, "%s" SLASH "hosts" SLASH "%s", confbase, myself->name);
+ xasprintf(&fname, "%s" SLASH "hosts" SLASH "%s", confbase, mesh->self->name);
read_config_file(config_tree, fname);
free(fname);
/* Close connections to hosts that have a changed or deleted host config file */
- for list_each(connection_t, c, connection_list) {
+ for list_each(connection_t, c, mesh->connections) {
xasprintf(&fname, "%s" SLASH "hosts" SLASH "%s", confbase, c->name);
struct stat s;
if(stat(fname, &s) || s.st_mtime > last_config_check) {
void retry(void) {
/* Reset the reconnection timers for all outgoing connections */
- for list_each(outgoing_t, outgoing, outgoing_list) {
+ for list_each(outgoing_t, outgoing, mesh->outgoings) {
outgoing->timeout = 0;
if(outgoing->ev.cb)
timeout_set(&outgoing->ev, &(struct timeval){0, 0});
}
/* Check for outgoing connections that are in progress, and reset their ping timers */
- for list_each(connection_t, c, connection_list) {
+ for list_each(connection_t, c, mesh->connections) {
if(c->outgoing && !c->node)
c->last_ping_time = 0;
}