2 net.c -- most of the network code
3 Copyright (C) 1998-2005 Ivo Timmermans,
4 2000-2015 Guus Sliepen <guus@tinc-vpn.org>
5 2006 Scott Lamb <slamb@slamb.org>
6 2011 Loïc Grenié <loic.grenie@gmail.com>
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 #include "connection.h"
39 int contradicting_add_edge = 0;
40 int contradicting_del_edge = 0;
41 static int sleeptime = 10;
42 time_t last_config_check = 0;
43 static timeout_t pingtimer;
44 static timeout_t periodictimer;
45 static struct timeval last_periodic_run_time;
47 /* Purge edges and subnets of unreachable nodes. Use carefully. */
50 logger(DEBUG_PROTOCOL, LOG_DEBUG, "Purging unreachable nodes");
52 /* Remove all edges and subnets owned by unreachable nodes. */
54 for splay_each(node_t, n, node_tree) {
55 if(!n->status.reachable) {
56 logger(DEBUG_SCARY_THINGS, LOG_DEBUG, "Purging node %s (%s)", n->name, n->hostname);
58 for splay_each(subnet_t, s, n->subnet_tree) {
59 send_del_subnet(everyone, s);
64 for splay_each(edge_t, e, n->edge_tree) {
66 send_del_edge(everyone, e);
72 /* Check if anyone else claims to have an edge to an unreachable node. If not, delete node. */
74 for splay_each(node_t, n, node_tree) {
75 if(!n->status.reachable) {
76 for splay_each(edge_t, e, edge_weight_tree)
80 if(!autoconnect && (!strictsubnets || !n->subnet_tree->head))
81 /* in strictsubnets mode do not delete nodes with subnets */
88 Terminate a connection:
90 - Remove the edge representing this connection
92 - Check if we need to retry making an outgoing connection
94 void terminate_connection(connection_t *c, bool report) {
95 logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Closing connection with %s (%s)", c->name, c->hostname);
98 if(c->node->connection == c)
99 c->node->connection = NULL;
102 if(report && !tunnelserver)
103 send_del_edge(everyone, c->edge);
108 /* Run MST and SSSP algorithms */
112 /* If the node is not reachable anymore but we remember it had an edge to us, clean it up */
114 if(report && !c->node->status.reachable) {
116 e = lookup_edge(c->node, myself);
119 send_del_edge(everyone, e);
126 outgoing_t *outgoing = c->outgoing;
129 /* Check if this was our outgoing connection */
132 do_outgoing_connection(outgoing);
135 /* Clean up dead proxy processes */
137 while(waitpid(-1, NULL, WNOHANG) > 0);
142 Check if the other end is active.
143 If we have sent packets, but didn't receive any,
144 then possibly the other end is dead. We send a
145 PING request over the meta connection. If the other
146 end does not reply in time, we consider them dead
147 and close the connection.
149 static void timeout_handler(void *data) {
151 bool close_all_connections = false;
154 timeout_handler will start after 30 seconds from start of tincd
155 hold information about the elapsed time since last time the handler
158 long sleep_time = now.tv_sec - last_periodic_run_time.tv_sec;
160 It seems that finding sane default value is harder than expected
161 Since we send every second a UDP packet to make holepunching work
162 And default UDP state expire on firewalls is between 15-30 seconds
163 we drop all connections after 60 Seconds - UDPDiscoveryTimeout=30
166 if (sleep_time > 2 * udp_discovery_timeout) {
167 logger(DEBUG_ALWAYS, LOG_ERR, "Awaking from dead after %ld seconds of sleep", sleep_time);
169 Do not send any packets to tinc after we wake up.
170 The other node probably closed our connection but we still
171 are holding context information to them. This may happen on
172 laptops or any other hardware which can be suspended for some time.
173 Sending any data to node that wasn't expecting it will produce
174 annoying and misleading errors on the other side about failed signature
175 verification and or about missing sptps context
177 close_all_connections = true;
179 last_periodic_run_time = now;
181 for list_each(connection_t, c, connection_list) {
182 // control connections (eg. tinc ctl) do not have any timeout
183 if(c->status.control)
186 if(close_all_connections) {
187 logger(DEBUG_ALWAYS, LOG_ERR, "Forcing connection close after sleep time %s (%s)", c->name, c->hostname);
188 terminate_connection(c, c->edge);
192 // Bail out early if we haven't reached the ping timeout for this node yet
193 if(c->last_ping_time + pingtimeout > now.tv_sec)
196 // timeout during connection establishing
198 if(c->status.connecting)
199 logger(DEBUG_CONNECTIONS, LOG_WARNING, "Timeout while connecting to %s (%s)", c->name, c->hostname);
201 logger(DEBUG_CONNECTIONS, LOG_WARNING, "Timeout from %s (%s) during authentication", c->name, c->hostname);
203 terminate_connection(c, c->edge);
207 // helps in UDP holepunching
208 try_tx(c->node, false);
210 // timeout during ping
211 if(c->status.pinged) {
212 logger(DEBUG_CONNECTIONS, LOG_INFO, "%s (%s) didn't respond to PING in %ld seconds", c->name, c->hostname, (long)now.tv_sec - c->last_ping_time);
213 terminate_connection(c, c->edge);
217 // check whether we need to send a new ping
218 if(c->last_ping_time + pinginterval <= now.tv_sec)
222 timeout_set(data, &(struct timeval){1, rand() % 100000});
225 static void periodic_handler(void *data) {
226 /* Check if there are too many contradicting ADD_EDGE and DEL_EDGE messages.
227 This usually only happens when another node has the same Name as this node.
228 If so, sleep for a short while to prevent a storm of contradicting messages.
231 if(contradicting_del_edge > 100 && contradicting_add_edge > 100) {
232 logger(DEBUG_ALWAYS, LOG_WARNING, "Possible node with same Name as us! Sleeping %d seconds.", sleeptime);
233 nanosleep(&(struct timespec){sleeptime, 0}, NULL);
243 contradicting_add_edge = 0;
244 contradicting_del_edge = 0;
246 /* If AutoConnect is set, check if we need to make or break connections. */
248 if(autoconnect && node_tree->count > 1) {
249 /* Count number of active connections */
251 for list_each(connection_t, c, connection_list) {
257 /* Not enough active connections, try to add one.
258 Choose a random node, if we don't have a connection to it,
259 and we are not already trying to make one, create an
260 outgoing connection to this node.
263 for splay_each(node_t, n, node_tree) {
264 if(n == myself || n->connection || !(n->status.has_address || n->status.reachable))
272 int r = rand() % count;
274 for splay_each(node_t, n, node_tree) {
275 if(n == myself || n->connection || !(n->status.has_address || n->status.reachable))
283 for list_each(outgoing_t, outgoing, outgoing_list) {
284 if(!strcmp(outgoing->name, n->name)) {
291 logger(DEBUG_CONNECTIONS, LOG_INFO, "Autoconnecting to %s", n->name);
292 outgoing_t *outgoing = xzalloc(sizeof *outgoing);
293 outgoing->name = xstrdup(n->name);
294 list_insert_tail(outgoing_list, outgoing);
295 setup_outgoing_connection(outgoing);
301 /* Too many active connections, try to remove one.
302 Choose a random outgoing connection to a node
303 that has at least one other connection.
308 for list_each(connection_t, c, connection_list) {
315 if(!c->outgoing || !c->node || c->node->edge_tree->count < 2)
318 logger(DEBUG_CONNECTIONS, LOG_INFO, "Autodisconnecting from %s", c->name);
319 list_delete(outgoing_list, c->outgoing);
321 terminate_connection(c, c->edge);
327 /* If we have enough active connections,
328 remove any pending outgoing connections.
330 for list_each(outgoing_t, o, outgoing_list) {
332 for list_each(connection_t, c, connection_list) {
333 if(c->outgoing == o) {
339 logger(DEBUG_CONNECTIONS, LOG_INFO, "Cancelled outgoing connection to %s", o->name);
340 list_delete_node(outgoing_list, node);
347 timeout_set(data, &(struct timeval){5, rand() % 100000});
350 void handle_meta_connection_data(connection_t *c) {
351 if (!receive_meta(c)) {
352 terminate_connection(c, c->edge);
358 static void sigterm_handler(void *data) {
359 logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s signal", strsignal(((signal_t *)data)->signum));
363 static void sighup_handler(void *data) {
364 logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s signal", strsignal(((signal_t *)data)->signum));
366 if(reload_configuration())
370 static void sigalrm_handler(void *data) {
371 logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s signal", strsignal(((signal_t *)data)->signum));
376 int reload_configuration(void) {
377 char fname[PATH_MAX];
379 /* Reread our own configuration file */
381 exit_configuration(&config_tree);
382 init_configuration(&config_tree);
384 if(!read_server_config()) {
385 logger(DEBUG_ALWAYS, LOG_ERR, "Unable to reread configuration file.");
389 read_config_options(config_tree, NULL);
391 snprintf(fname, sizeof fname, "%s" SLASH "hosts" SLASH "%s", confbase, myself->name);
392 read_config_file(config_tree, fname);
394 /* Parse some options that are allowed to be changed while tinc is running */
396 setup_myself_reloadable();
398 /* If StrictSubnet is set, expire deleted Subnets and read new ones in */
401 for splay_each(subnet_t, subnet, subnet_tree)
406 for splay_each(node_t, n, node_tree)
407 n->status.has_address = false;
412 for splay_each(subnet_t, subnet, subnet_tree) {
415 if(subnet->expires == 1) {
416 send_del_subnet(everyone, subnet);
417 if(subnet->owner->status.reachable)
418 subnet_update(subnet->owner, subnet, false);
419 subnet_del(subnet->owner, subnet);
420 } else if(subnet->expires == -1) {
423 send_add_subnet(everyone, subnet);
424 if(subnet->owner->status.reachable)
425 subnet_update(subnet->owner, subnet, true);
428 } else { /* Only read our own subnets back in */
429 for splay_each(subnet_t, subnet, myself->subnet_tree)
433 config_t *cfg = lookup_config(config_tree, "Subnet");
436 subnet_t *subnet, *s2;
438 if(!get_config_subnet(cfg, &subnet))
441 if((s2 = lookup_subnet(myself, subnet))) {
447 subnet_add(myself, subnet);
448 send_add_subnet(everyone, subnet);
449 subnet_update(myself, subnet, true);
452 cfg = lookup_config_next(config_tree, cfg);
455 for splay_each(subnet_t, subnet, myself->subnet_tree) {
456 if(subnet->expires == 1) {
457 send_del_subnet(everyone, subnet);
458 subnet_update(myself, subnet, false);
459 subnet_del(myself, subnet);
464 /* Try to make outgoing connections */
466 try_outgoing_connections();
468 /* Close connections to hosts that have a changed or deleted host config file */
470 for list_each(connection_t, c, connection_list) {
471 if(c->status.control)
474 snprintf(fname, sizeof fname, "%s" SLASH "hosts" SLASH "%s", confbase, c->name);
476 if(stat(fname, &s) || s.st_mtime > last_config_check) {
477 logger(DEBUG_CONNECTIONS, LOG_INFO, "Host config file of %s has been changed", c->name);
478 terminate_connection(c, c->edge);
482 last_config_check = now.tv_sec;
488 /* Reset the reconnection timers for all outgoing connections */
489 for list_each(outgoing_t, outgoing, outgoing_list) {
490 outgoing->timeout = 0;
492 timeout_set(&outgoing->ev, &(struct timeval){0, 0});
495 /* Check for outgoing connections that are in progress, and reset their ping timers */
496 for list_each(connection_t, c, connection_list) {
497 if(c->outgoing && !c->node)
498 c->last_ping_time = 0;
501 /* Kick the ping timeout handler */
502 timeout_set(&pingtimer, &(struct timeval){0, 0});
506 this is where it all happens...
508 int main_loop(void) {
509 last_periodic_run_time = now;
510 timeout_add(&pingtimer, timeout_handler, &pingtimer, &(struct timeval){pingtimeout, rand() % 100000});
511 timeout_add(&periodictimer, periodic_handler, &periodictimer, &(struct timeval){0, 0});
514 signal_t sighup = {0};
515 signal_t sigterm = {0};
516 signal_t sigquit = {0};
517 signal_t sigint = {0};
518 signal_t sigalrm = {0};
520 signal_add(&sighup, sighup_handler, &sighup, SIGHUP);
521 signal_add(&sigterm, sigterm_handler, &sigterm, SIGTERM);
522 signal_add(&sigquit, sigterm_handler, &sigquit, SIGQUIT);
523 signal_add(&sigint, sigterm_handler, &sigint, SIGINT);
524 signal_add(&sigalrm, sigalrm_handler, &sigalrm, SIGALRM);
528 logger(DEBUG_ALWAYS, LOG_ERR, "Error while waiting for input: %s", sockstrerror(sockerrno));
534 signal_del(&sigterm);
535 signal_del(&sigquit);
537 signal_del(&sigalrm);
540 timeout_del(&periodictimer);
541 timeout_del(&pingtimer);