5d84741d0472aa66a99ee063f7879a719212595d
[tinc] / src / net.c
1 /*
2     net.c -- most of the network code
3     Copyright (C) 1998-2005 Ivo Timmermans,
4                   2000-2017 Guus Sliepen <guus@tinc-vpn.org>
5                   2006      Scott Lamb <slamb@slamb.org>
6                   2011      Loïc Grenié <loic.grenie@gmail.com>
7
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.
12
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.
17
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.
21 */
22
23 #include "system.h"
24
25 #include "autoconnect.h"
26 #include "conf.h"
27 #include "connection.h"
28 #include "device.h"
29 #include "graph.h"
30 #include "logger.h"
31 #include "meta.h"
32 #include "names.h"
33 #include "net.h"
34 #include "netutl.h"
35 #include "protocol.h"
36 #include "subnet.h"
37 #include "utils.h"
38 #include "xalloc.h"
39
40 int contradicting_add_edge = 0;
41 int contradicting_del_edge = 0;
42 static int sleeptime = 10;
43 time_t last_config_check = 0;
44 static timeout_t pingtimer;
45 static timeout_t periodictimer;
46 static struct timeval last_periodic_run_time;
47
48 /* Purge edges and subnets of unreachable nodes. Use carefully. */
49
50 void purge(void) {
51         logger(DEBUG_PROTOCOL, LOG_DEBUG, "Purging unreachable nodes");
52
53         /* Remove all edges and subnets owned by unreachable nodes. */
54
55         for splay_each(node_t, n, node_tree) {
56                 if(!n->status.reachable) {
57                         logger(DEBUG_SCARY_THINGS, LOG_DEBUG, "Purging node %s (%s)", n->name, n->hostname);
58
59                         for splay_each(subnet_t, s, n->subnet_tree) {
60                                 send_del_subnet(everyone, s);
61
62                                 if(!strictsubnets) {
63                                         subnet_del(n, s);
64                                 }
65                         }
66
67                         for splay_each(edge_t, e, n->edge_tree) {
68                                 if(!tunnelserver) {
69                                         send_del_edge(everyone, e);
70                                 }
71
72                                 edge_del(e);
73                         }
74                 }
75         }
76
77         /* Check if anyone else claims to have an edge to an unreachable node. If not, delete node. */
78
79         for splay_each(node_t, n, node_tree) {
80                 if(!n->status.reachable) {
81                         for splay_each(edge_t, e, edge_weight_tree)
82                                 if(e->to == n) {
83                                         return;
84                                 }
85
86                         if(!autoconnect && (!strictsubnets || !n->subnet_tree->head))
87                                 /* in strictsubnets mode do not delete nodes with subnets */
88                         {
89                                 node_del(n);
90                         }
91                 }
92         }
93 }
94
95 /*
96   Terminate a connection:
97   - Mark it as inactive
98   - Remove the edge representing this connection
99   - Kill it with fire
100   - Check if we need to retry making an outgoing connection
101 */
102 void terminate_connection(connection_t *c, bool report) {
103         logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Closing connection with %s (%s)", c->name, c->hostname);
104
105         if(c->node) {
106                 if(c->node->connection == c) {
107                         c->node->connection = NULL;
108                 }
109
110                 if(c->edge) {
111                         if(report && !tunnelserver) {
112                                 send_del_edge(everyone, c->edge);
113                         }
114
115                         edge_del(c->edge);
116                         c->edge = NULL;
117
118                         /* Run MST and SSSP algorithms */
119
120                         graph();
121
122                         /* If the node is not reachable anymore but we remember it had an edge to us, clean it up */
123
124                         if(report && !c->node->status.reachable) {
125                                 edge_t *e;
126                                 e = lookup_edge(c->node, myself);
127
128                                 if(e) {
129                                         if(!tunnelserver) {
130                                                 send_del_edge(everyone, e);
131                                         }
132
133                                         edge_del(e);
134                                 }
135                         }
136                 }
137         }
138
139         outgoing_t *outgoing = c->outgoing;
140         connection_del(c);
141
142         /* Check if this was our outgoing connection */
143
144         if(outgoing) {
145                 do_outgoing_connection(outgoing);
146         }
147
148 #ifndef HAVE_MINGW
149         /* Clean up dead proxy processes */
150
151         while(waitpid(-1, NULL, WNOHANG) > 0);
152
153 #endif
154 }
155
156 /*
157   Check if the other end is active.
158   If we have sent packets, but didn't receive any,
159   then possibly the other end is dead. We send a
160   PING request over the meta connection. If the other
161   end does not reply in time, we consider them dead
162   and close the connection.
163 */
164 static void timeout_handler(void *data) {
165
166         bool close_all_connections = false;
167
168         /*
169                  timeout_handler will start after 30 seconds from start of tincd
170                  hold information about the elapsed time since last time the handler
171                  has been run
172         */
173         long sleep_time = now.tv_sec - last_periodic_run_time.tv_sec;
174
175         /*
176                  It seems that finding sane default value is harder than expected
177                  Since we send every second a UDP packet to make holepunching work
178                  And default UDP state expire on firewalls is between 15-30 seconds
179                  we drop all connections after 60 Seconds - UDPDiscoveryTimeout=30
180                  by default
181         */
182         if(sleep_time > 2 * udp_discovery_timeout) {
183                 logger(DEBUG_ALWAYS, LOG_ERR, "Awaking from dead after %ld seconds of sleep", sleep_time);
184                 /*
185                         Do not send any packets to tinc after we wake up.
186                         The other node probably closed our connection but we still
187                         are holding context information to them. This may happen on
188                         laptops or any other hardware which can be suspended for some time.
189                         Sending any data to node that wasn't expecting it will produce
190                         annoying and misleading errors on the other side about failed signature
191                         verification and or about missing sptps context
192                 */
193                 close_all_connections = true;
194         }
195
196         last_periodic_run_time = now;
197
198         for list_each(connection_t, c, connection_list) {
199                 // control connections (eg. tinc ctl) do not have any timeout
200                 if(c->status.control) {
201                         continue;
202                 }
203
204                 if(close_all_connections) {
205                         logger(DEBUG_ALWAYS, LOG_ERR, "Forcing connection close after sleep time %s (%s)", c->name, c->hostname);
206                         terminate_connection(c, c->edge);
207                         continue;
208                 }
209
210                 // Bail out early if we haven't reached the ping timeout for this node yet
211                 if(c->last_ping_time + pingtimeout > now.tv_sec) {
212                         continue;
213                 }
214
215                 // timeout during connection establishing
216                 if(!c->edge) {
217                         if(c->status.connecting) {
218                                 logger(DEBUG_CONNECTIONS, LOG_WARNING, "Timeout while connecting to %s (%s)", c->name, c->hostname);
219                         } else {
220                                 logger(DEBUG_CONNECTIONS, LOG_WARNING, "Timeout from %s (%s) during authentication", c->name, c->hostname);
221                         }
222
223                         terminate_connection(c, c->edge);
224                         continue;
225                 }
226
227                 // helps in UDP holepunching
228                 try_tx(c->node, false);
229
230                 // timeout during ping
231                 if(c->status.pinged) {
232                         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));
233                         terminate_connection(c, c->edge);
234                         continue;
235                 }
236
237                 // check whether we need to send a new ping
238                 if(c->last_ping_time + pinginterval <= now.tv_sec) {
239                         send_ping(c);
240                 }
241         }
242
243         timeout_set(data, &(struct timeval) {
244                 1, rand() % 100000
245         });
246 }
247
248 static void periodic_handler(void *data) {
249         /* Check if there are too many contradicting ADD_EDGE and DEL_EDGE messages.
250            This usually only happens when another node has the same Name as this node.
251            If so, sleep for a short while to prevent a storm of contradicting messages.
252         */
253
254         if(contradicting_del_edge > 100 && contradicting_add_edge > 100) {
255                 logger(DEBUG_ALWAYS, LOG_WARNING, "Possible node with same Name as us! Sleeping %d seconds.", sleeptime);
256                 nanosleep(&(struct timespec) {
257                         sleeptime, 0
258                 }, NULL);
259                 sleeptime *= 2;
260
261                 if(sleeptime < 0) {
262                         sleeptime = 3600;
263                 }
264         } else {
265                 sleeptime /= 2;
266
267                 if(sleeptime < 10) {
268                         sleeptime = 10;
269                 }
270         }
271
272         contradicting_add_edge = 0;
273         contradicting_del_edge = 0;
274
275         /* If AutoConnect is set, check if we need to make or break connections. */
276
277         if(autoconnect && node_tree->count > 1) {
278                 do_autoconnect();
279         }
280
281         timeout_set(data, &(struct timeval) {
282                 5, rand() % 100000
283         });
284 }
285
286 void handle_meta_connection_data(connection_t *c) {
287         if(!receive_meta(c)) {
288                 terminate_connection(c, c->edge);
289                 return;
290         }
291 }
292
293 #ifndef HAVE_MINGW
294 static void sigterm_handler(void *data) {
295         logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s signal", strsignal(((signal_t *)data)->signum));
296         event_exit();
297 }
298
299 static void sighup_handler(void *data) {
300         logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s signal", strsignal(((signal_t *)data)->signum));
301         reopenlogger();
302
303         if(reload_configuration()) {
304                 exit(1);
305         }
306 }
307
308 static void sigalrm_handler(void *data) {
309         logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s signal", strsignal(((signal_t *)data)->signum));
310         retry();
311 }
312 #endif
313
314 int reload_configuration(void) {
315         char fname[PATH_MAX];
316
317         /* Reread our own configuration file */
318
319         exit_configuration(&config_tree);
320         init_configuration(&config_tree);
321
322         if(!read_server_config()) {
323                 logger(DEBUG_ALWAYS, LOG_ERR, "Unable to reread configuration file.");
324                 return EINVAL;
325         }
326
327         read_config_options(config_tree, NULL);
328
329         snprintf(fname, sizeof(fname), "%s" SLASH "hosts" SLASH "%s", confbase, myself->name);
330         read_config_file(config_tree, fname, true);
331
332         /* Parse some options that are allowed to be changed while tinc is running */
333
334         setup_myself_reloadable();
335
336         /* If StrictSubnet is set, expire deleted Subnets and read new ones in */
337
338         if(strictsubnets) {
339                 for splay_each(subnet_t, subnet, subnet_tree)
340                         if(subnet->owner) {
341                                 subnet->expires = 1;
342                         }
343         }
344
345         for splay_each(node_t, n, node_tree) {
346                 n->status.has_address = false;
347         }
348
349         load_all_nodes();
350
351         if(strictsubnets) {
352                 for splay_each(subnet_t, subnet, subnet_tree) {
353                         if(!subnet->owner) {
354                                 continue;
355                         }
356
357                         if(subnet->expires == 1) {
358                                 send_del_subnet(everyone, subnet);
359
360                                 if(subnet->owner->status.reachable) {
361                                         subnet_update(subnet->owner, subnet, false);
362                                 }
363
364                                 subnet_del(subnet->owner, subnet);
365                         } else if(subnet->expires == -1) {
366                                 subnet->expires = 0;
367                         } else {
368                                 send_add_subnet(everyone, subnet);
369
370                                 if(subnet->owner->status.reachable) {
371                                         subnet_update(subnet->owner, subnet, true);
372                                 }
373                         }
374                 }
375         } else { /* Only read our own subnets back in */
376                 for splay_each(subnet_t, subnet, myself->subnet_tree)
377                         if(!subnet->expires) {
378                                 subnet->expires = 1;
379                         }
380
381                 config_t *cfg = lookup_config(config_tree, "Subnet");
382
383                 while(cfg) {
384                         subnet_t *subnet, *s2;
385
386                         if(!get_config_subnet(cfg, &subnet)) {
387                                 continue;
388                         }
389
390                         if((s2 = lookup_subnet(myself, subnet))) {
391                                 if(s2->expires == 1) {
392                                         s2->expires = 0;
393                                 }
394
395                                 free_subnet(subnet);
396                         } else {
397                                 subnet_add(myself, subnet);
398                                 send_add_subnet(everyone, subnet);
399                                 subnet_update(myself, subnet, true);
400                         }
401
402                         cfg = lookup_config_next(config_tree, cfg);
403                 }
404
405                 for splay_each(subnet_t, subnet, myself->subnet_tree) {
406                         if(subnet->expires == 1) {
407                                 send_del_subnet(everyone, subnet);
408                                 subnet_update(myself, subnet, false);
409                                 subnet_del(myself, subnet);
410                         }
411                 }
412         }
413
414         /* Try to make outgoing connections */
415
416         try_outgoing_connections();
417
418         /* Close connections to hosts that have a changed or deleted host config file */
419
420         for list_each(connection_t, c, connection_list) {
421                 if(c->status.control) {
422                         continue;
423                 }
424
425                 snprintf(fname, sizeof(fname), "%s" SLASH "hosts" SLASH "%s", confbase, c->name);
426                 struct stat s;
427
428                 if(stat(fname, &s) || s.st_mtime > last_config_check) {
429                         logger(DEBUG_CONNECTIONS, LOG_INFO, "Host config file of %s has been changed", c->name);
430                         terminate_connection(c, c->edge);
431                 }
432         }
433
434         last_config_check = now.tv_sec;
435
436         return 0;
437 }
438
439 void retry(void) {
440         /* Reset the reconnection timers for all outgoing connections */
441         for list_each(outgoing_t, outgoing, outgoing_list) {
442                 outgoing->timeout = 0;
443
444                 if(outgoing->ev.cb)
445                         timeout_set(&outgoing->ev, &(struct timeval) {
446                         0, 0
447                 });
448         }
449
450         /* Check for outgoing connections that are in progress, and reset their ping timers */
451         for list_each(connection_t, c, connection_list) {
452                 if(c->outgoing && !c->node) {
453                         c->last_ping_time = 0;
454                 }
455         }
456
457         /* Kick the ping timeout handler */
458         timeout_set(&pingtimer, &(struct timeval) {
459                 0, 0
460         });
461 }
462
463 /*
464   this is where it all happens...
465 */
466 int main_loop(void) {
467         last_periodic_run_time = now;
468         timeout_add(&pingtimer, timeout_handler, &pingtimer, &(struct timeval) {
469                 pingtimeout, rand() % 100000
470         });
471         timeout_add(&periodictimer, periodic_handler, &periodictimer, &(struct timeval) {
472                 0, 0
473         });
474
475 #ifndef HAVE_MINGW
476         signal_t sighup = {0};
477         signal_t sigterm = {0};
478         signal_t sigquit = {0};
479         signal_t sigint = {0};
480         signal_t sigalrm = {0};
481
482         signal_add(&sighup, sighup_handler, &sighup, SIGHUP);
483         signal_add(&sigterm, sigterm_handler, &sigterm, SIGTERM);
484         signal_add(&sigquit, sigterm_handler, &sigquit, SIGQUIT);
485         signal_add(&sigint, sigterm_handler, &sigint, SIGINT);
486         signal_add(&sigalrm, sigalrm_handler, &sigalrm, SIGALRM);
487 #endif
488
489         if(!event_loop()) {
490                 logger(DEBUG_ALWAYS, LOG_ERR, "Error while waiting for input: %s", sockstrerror(sockerrno));
491                 return 1;
492         }
493
494 #ifndef HAVE_MINGW
495         signal_del(&sighup);
496         signal_del(&sigterm);
497         signal_del(&sigquit);
498         signal_del(&sigint);
499         signal_del(&sigalrm);
500 #endif
501
502         timeout_del(&periodictimer);
503         timeout_del(&pingtimer);
504
505         return 0;
506 }