Fix listen_sockets overflow in close_network_connections()
[tinc] / src / net_setup.c
1 /*
2     net_setup.c -- Setup.
3     Copyright (C) 1998-2005 Ivo Timmermans,
4                   2000-2021 Guus Sliepen <guus@tinc-vpn.org>
5                   2006      Scott Lamb <slamb@slamb.org>
6                   2010      Brandon Black <blblack@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 "cipher.h"
26 #include "conf_net.h"
27 #include "conf.h"
28 #include "connection.h"
29 #include "compression.h"
30 #include "control.h"
31 #include "crypto.h"
32 #include "device.h"
33 #include "digest.h"
34 #include "ecdsa.h"
35 #include "graph.h"
36 #include "logger.h"
37 #include "names.h"
38 #include "net.h"
39 #include "netutl.h"
40 #include "process.h"
41 #include "protocol.h"
42 #include "route.h"
43 #include "script.h"
44 #include "subnet.h"
45 #include "utils.h"
46 #include "xalloc.h"
47 #include "keys.h"
48 #include "sandbox.h"
49
50 #ifdef HAVE_MINIUPNPC
51 #include "upnp.h"
52 #endif
53
54 ports_t myport;
55 static io_t device_io;
56 devops_t devops;
57 bool device_standby = false;
58
59 char *proxyhost = NULL;
60 char *proxyport = NULL;
61 char *proxyuser = NULL;
62 char *proxypass = NULL;
63
64 proxytype_t proxytype;
65 bool autoconnect;
66 bool disablebuggypeers;
67
68 char *scriptinterpreter;
69 char *scriptextension;
70
71 bool node_read_ecdsa_public_key(node_t *n) {
72         if(ecdsa_active(n->ecdsa)) {
73                 return true;
74         }
75
76         FILE *fp;
77         char *pubname = NULL;
78         char *p;
79
80         splay_tree_t config;
81         init_configuration(&config);
82
83         if(!read_host_config(&config, n->name, true)) {
84                 goto exit;
85         }
86
87         /* First, check for simple Ed25519PublicKey statement */
88
89         if(get_config_string(lookup_config(&config, "Ed25519PublicKey"), &p)) {
90                 n->ecdsa = ecdsa_set_base64_public_key(p);
91                 free(p);
92                 goto exit;
93         }
94
95         /* Else, check for Ed25519PublicKeyFile statement and read it */
96
97         if(!get_config_string(lookup_config(&config, "Ed25519PublicKeyFile"), &pubname)) {
98                 xasprintf(&pubname, "%s" SLASH "hosts" SLASH "%s", confbase, n->name);
99         }
100
101         fp = fopen(pubname, "r");
102
103         if(!fp) {
104                 goto exit;
105         }
106
107         n->ecdsa = ecdsa_read_pem_public_key(fp);
108         fclose(fp);
109
110 exit:
111         splay_empty_tree(&config);
112         free(pubname);
113         return n->ecdsa;
114 }
115
116 static bool read_invitation_key(void) {
117         FILE *fp;
118         char fname[PATH_MAX];
119
120         if(invitation_key) {
121                 ecdsa_free(invitation_key);
122                 invitation_key = NULL;
123         }
124
125         snprintf(fname, sizeof(fname), "%s" SLASH "invitations" SLASH "ed25519_key.priv", confbase);
126
127         fp = fopen(fname, "r");
128
129         if(fp) {
130                 invitation_key = ecdsa_read_pem_private_key(fp);
131                 fclose(fp);
132
133                 if(!invitation_key) {
134                         logger(DEBUG_ALWAYS, LOG_ERR, "Reading Ed25519 private key file `%s' failed", fname);
135                 }
136         }
137
138         return invitation_key;
139 }
140
141 #ifndef DISABLE_LEGACY
142 static timeout_t keyexpire_timeout;
143
144 static void keyexpire_handler(void *data) {
145         regenerate_key();
146         timeout_set(data, &(struct timeval) {
147                 keylifetime, jitter()
148         });
149 }
150 #endif
151
152 void regenerate_key(void) {
153         logger(DEBUG_STATUS, LOG_INFO, "Expiring symmetric keys");
154         send_key_changed();
155
156         for splay_each(node_t, n, &node_tree) {
157                 n->status.validkey_in = false;
158         }
159 }
160
161 void load_all_nodes(void) {
162         DIR *dir;
163         struct dirent *ent;
164         char dname[PATH_MAX];
165
166         snprintf(dname, sizeof(dname), "%s" SLASH "hosts", confbase);
167         dir = opendir(dname);
168
169         if(!dir) {
170                 logger(DEBUG_ALWAYS, LOG_ERR, "Could not open %s: %s", dname, strerror(errno));
171                 return;
172         }
173
174         while((ent = readdir(dir))) {
175                 if(!check_id(ent->d_name)) {
176                         continue;
177                 }
178
179                 node_t *n = lookup_node(ent->d_name);
180
181                 splay_tree_t config;
182                 init_configuration(&config);
183                 read_config_options(&config, ent->d_name);
184                 read_host_config(&config, ent->d_name, true);
185
186                 if(!n) {
187                         n = new_node(ent->d_name);
188                         node_add(n);
189                 }
190
191                 if(strictsubnets) {
192                         for(config_t *cfg = lookup_config(&config, "Subnet"); cfg; cfg = lookup_config_next(&config, cfg)) {
193                                 subnet_t *s, *s2;
194
195                                 if(!get_config_subnet(cfg, &s)) {
196                                         continue;
197                                 }
198
199                                 if((s2 = lookup_subnet(n, s))) {
200                                         s2->expires = -1;
201                                         free(s);
202                                 } else {
203                                         subnet_add(n, s);
204                                 }
205                         }
206                 }
207
208                 if(lookup_config(&config, "Address")) {
209                         n->status.has_address = true;
210                 }
211
212                 splay_empty_tree(&config);
213         }
214
215         closedir(dir);
216 }
217
218 char *get_name(void) {
219         char *name = NULL;
220         char *returned_name;
221
222         get_config_string(lookup_config(&config_tree, "Name"), &name);
223
224         if(!name) {
225                 return NULL;
226         }
227
228         returned_name = replace_name(name);
229         free(name);
230         return returned_name;
231 }
232
233 static void read_interpreter(void) {
234         char *interpreter = NULL;
235         get_config_string(lookup_config(&config_tree, "ScriptsInterpreter"), &interpreter);
236
237         if(!interpreter || (sandbox_can(START_PROCESSES, AFTER_SANDBOX) && sandbox_can(USE_NEW_PATHS, AFTER_SANDBOX))) {
238                 free(scriptinterpreter);
239                 scriptinterpreter = interpreter;
240                 return;
241         }
242
243         if(!string_eq(interpreter, scriptinterpreter)) {
244                 logger(DEBUG_ALWAYS, LOG_NOTICE, "Not changing ScriptsInterpreter because of sandbox.");
245         }
246
247         free(interpreter);
248 }
249
250 bool setup_myself_reloadable(void) {
251         read_interpreter();
252
253         free(scriptextension);
254
255         if(!get_config_string(lookup_config(&config_tree, "ScriptsExtension"), &scriptextension)) {
256                 scriptextension = xstrdup("");
257         }
258
259         char *proxy = NULL;
260
261         get_config_string(lookup_config(&config_tree, "Proxy"), &proxy);
262
263         if(proxy) {
264                 char *space;
265
266                 if((space = strchr(proxy, ' '))) {
267                         *space++ = 0;
268                 }
269
270                 if(!strcasecmp(proxy, "none")) {
271                         proxytype = PROXY_NONE;
272                 } else if(!strcasecmp(proxy, "socks4")) {
273                         proxytype = PROXY_SOCKS4;
274                 } else if(!strcasecmp(proxy, "socks4a")) {
275                         proxytype = PROXY_SOCKS4A;
276                 } else if(!strcasecmp(proxy, "socks5")) {
277                         proxytype = PROXY_SOCKS5;
278                 } else if(!strcasecmp(proxy, "http")) {
279                         proxytype = PROXY_HTTP;
280                 } else if(!strcasecmp(proxy, "exec")) {
281                         if(sandbox_can(START_PROCESSES, AFTER_SANDBOX)) {
282                                 proxytype = PROXY_EXEC;
283                         } else {
284                                 logger(DEBUG_ALWAYS, LOG_ERR, "Cannot use exec proxies with current sandbox level.");
285                                 return false;
286                         }
287                 } else {
288                         logger(DEBUG_ALWAYS, LOG_ERR, "Unknown proxy type %s!", proxy);
289                         free_string(proxy);
290                         return false;
291                 }
292
293                 free(proxyhost);
294                 proxyhost = NULL;
295
296                 free(proxyport);
297                 proxyport = NULL;
298
299                 free_string(proxyuser);
300                 proxyuser = NULL;
301
302                 free_string(proxypass);
303                 proxypass = NULL;
304
305                 switch(proxytype) {
306                 case PROXY_NONE:
307                 default:
308                         break;
309
310                 case PROXY_EXEC:
311                         if(!space || !*space) {
312                                 logger(DEBUG_ALWAYS, LOG_ERR, "Argument expected for proxy type exec!");
313                                 free_string(proxy);
314                                 return false;
315                         }
316
317                         if(!sandbox_can(USE_NEW_PATHS, AFTER_SANDBOX)) {
318                                 logger(DEBUG_ALWAYS, LOG_NOTICE, "Changed exec proxy may fail to work because of sandbox.");
319                         }
320
321                         proxyhost = xstrdup(space);
322                         break;
323
324                 case PROXY_SOCKS4:
325                 case PROXY_SOCKS4A:
326                 case PROXY_SOCKS5:
327                 case PROXY_HTTP:
328                         proxyhost = space;
329
330                         if(space && (space = strchr(space, ' '))) {
331                                 *space++ = 0, proxyport = space;
332                         }
333
334                         if(!proxyhost || !*proxyhost || !proxyport || !*proxyport) {
335                                 logger(DEBUG_ALWAYS, LOG_ERR, "Host and port argument expected for proxy!");
336                                 proxyport = NULL;
337                                 proxyhost = NULL;
338                                 free_string(proxy);
339                                 return false;
340                         }
341
342                         if(space && (space = strchr(space, ' '))) {
343                                 *space++ = 0, proxyuser = space;
344                         }
345
346                         if(space && (space = strchr(space, ' '))) {
347                                 *space++ = 0, proxypass = space;
348                         }
349
350                         proxyhost = xstrdup(proxyhost);
351                         proxyport = xstrdup(proxyport);
352
353                         if(proxyuser && *proxyuser) {
354                                 proxyuser = xstrdup(proxyuser);
355                         }
356
357                         if(proxypass && *proxypass) {
358                                 proxypass = xstrdup(proxypass);
359                         }
360
361                         break;
362                 }
363
364                 free_string(proxy);
365         }
366
367         bool choice;
368
369         if(get_config_bool(lookup_config(&config_tree, "IndirectData"), &choice) && choice) {
370                 myself->options |= OPTION_INDIRECT;
371         }
372
373         if(get_config_bool(lookup_config(&config_tree, "TCPOnly"), &choice) && choice) {
374                 myself->options |= OPTION_TCPONLY;
375         }
376
377         if(myself->options & OPTION_TCPONLY) {
378                 myself->options |= OPTION_INDIRECT;
379         }
380
381         get_config_bool(lookup_config(&config_tree, "UDPDiscovery"), &udp_discovery);
382         get_config_int(lookup_config(&config_tree, "UDPDiscoveryKeepaliveInterval"), &udp_discovery_keepalive_interval);
383         get_config_int(lookup_config(&config_tree, "UDPDiscoveryInterval"), &udp_discovery_interval);
384         get_config_int(lookup_config(&config_tree, "UDPDiscoveryTimeout"), &udp_discovery_timeout);
385
386         get_config_int(lookup_config(&config_tree, "MTUInfoInterval"), &mtu_info_interval);
387         get_config_int(lookup_config(&config_tree, "UDPInfoInterval"), &udp_info_interval);
388
389         get_config_bool(lookup_config(&config_tree, "DirectOnly"), &directonly);
390         get_config_bool(lookup_config(&config_tree, "LocalDiscovery"), &localdiscovery);
391
392         char *rmode = NULL;
393
394         if(get_config_string(lookup_config(&config_tree, "Mode"), &rmode)) {
395                 if(!strcasecmp(rmode, "router")) {
396                         routing_mode = RMODE_ROUTER;
397                 } else if(!strcasecmp(rmode, "switch")) {
398                         routing_mode = RMODE_SWITCH;
399                 } else if(!strcasecmp(rmode, "hub")) {
400                         routing_mode = RMODE_HUB;
401                 } else {
402                         logger(DEBUG_ALWAYS, LOG_ERR, "Invalid routing mode!");
403                         free(rmode);
404                         return false;
405                 }
406
407                 free(rmode);
408         }
409
410         char *fmode = NULL;
411
412         if(get_config_string(lookup_config(&config_tree, "Forwarding"), &fmode)) {
413                 if(!strcasecmp(fmode, "off")) {
414                         forwarding_mode = FMODE_OFF;
415                 } else if(!strcasecmp(fmode, "internal")) {
416                         forwarding_mode = FMODE_INTERNAL;
417                 } else if(!strcasecmp(fmode, "kernel")) {
418                         forwarding_mode = FMODE_KERNEL;
419                 } else {
420                         logger(DEBUG_ALWAYS, LOG_ERR, "Invalid forwarding mode!");
421                         free(fmode);
422                         return false;
423                 }
424
425                 free(fmode);
426         }
427
428         choice = !(myself->options & OPTION_TCPONLY);
429         get_config_bool(lookup_config(&config_tree, "PMTUDiscovery"), &choice);
430
431         if(choice) {
432                 myself->options |= OPTION_PMTU_DISCOVERY;
433         }
434
435         choice = true;
436         get_config_bool(lookup_config(&config_tree, "ClampMSS"), &choice);
437
438         if(choice) {
439                 myself->options |= OPTION_CLAMP_MSS;
440         }
441
442         get_config_bool(lookup_config(&config_tree, "PriorityInheritance"), &priorityinheritance);
443         get_config_bool(lookup_config(&config_tree, "DecrementTTL"), &decrement_ttl);
444
445         char *bmode = NULL;
446
447         if(get_config_string(lookup_config(&config_tree, "Broadcast"), &bmode)) {
448                 if(!strcasecmp(bmode, "no")) {
449                         broadcast_mode = BMODE_NONE;
450                 } else if(!strcasecmp(bmode, "yes") || !strcasecmp(bmode, "mst")) {
451                         broadcast_mode = BMODE_MST;
452                 } else if(!strcasecmp(bmode, "direct")) {
453                         broadcast_mode = BMODE_DIRECT;
454                 } else {
455                         logger(DEBUG_ALWAYS, LOG_ERR, "Invalid broadcast mode!");
456                         free(bmode);
457                         return false;
458                 }
459
460                 free(bmode);
461         }
462
463         /* Delete all broadcast subnets before re-adding them */
464
465         for splay_each(subnet_t, s, &subnet_tree) {
466                 if(!s->owner) {
467                         splay_delete_node(&subnet_tree, node);
468                 }
469         }
470
471         const char *const DEFAULT_BROADCAST_SUBNETS[] = { "ff:ff:ff:ff:ff:ff", "255.255.255.255", "224.0.0.0/4", "ff00::/8" };
472
473         for(size_t i = 0; i < sizeof(DEFAULT_BROADCAST_SUBNETS) / sizeof(*DEFAULT_BROADCAST_SUBNETS); i++) {
474                 subnet_t *s = new_subnet();
475
476                 if(!str2net(s, DEFAULT_BROADCAST_SUBNETS[i])) {
477                         abort();
478                 }
479
480                 subnet_add(NULL, s);
481         }
482
483         for(config_t *cfg = lookup_config(&config_tree, "BroadcastSubnet"); cfg; cfg = lookup_config_next(&config_tree, cfg)) {
484                 subnet_t *s;
485
486                 if(!get_config_subnet(cfg, &s)) {
487                         continue;
488                 }
489
490                 subnet_add(NULL, s);
491         }
492
493 #if !defined(IP_TOS)
494
495         if(priorityinheritance) {
496                 logger(DEBUG_ALWAYS, LOG_WARNING, "%s not supported on this platform for IPv4 connections", "PriorityInheritance");
497         }
498
499 #endif
500
501 #if !defined(IPV6_TCLASS)
502
503         if(priorityinheritance) {
504                 logger(DEBUG_ALWAYS, LOG_WARNING, "%s not supported on this platform for IPv6 connections", "PriorityInheritance");
505         }
506
507 #endif
508
509         if(!get_config_int(lookup_config(&config_tree, "MACExpire"), &macexpire)) {
510                 macexpire = 600;
511         }
512
513         if(get_config_int(lookup_config(&config_tree, "MaxTimeout"), &maxtimeout)) {
514                 if(maxtimeout <= 0) {
515                         logger(DEBUG_ALWAYS, LOG_ERR, "Bogus maximum timeout!");
516                         return false;
517                 }
518         } else {
519                 maxtimeout = 900;
520         }
521
522         char *afname = NULL;
523
524         if(get_config_string(lookup_config(&config_tree, "AddressFamily"), &afname)) {
525                 if(!strcasecmp(afname, "IPv4")) {
526                         addressfamily = AF_INET;
527                 } else if(!strcasecmp(afname, "IPv6")) {
528                         addressfamily = AF_INET6;
529                 } else if(!strcasecmp(afname, "any")) {
530                         addressfamily = AF_UNSPEC;
531                 } else {
532                         logger(DEBUG_ALWAYS, LOG_ERR, "Invalid address family!");
533                         free(afname);
534                         return false;
535                 }
536
537                 free(afname);
538         }
539
540         get_config_bool(lookup_config(&config_tree, "Hostnames"), &hostnames);
541
542         if(!get_config_int(lookup_config(&config_tree, "KeyExpire"), &keylifetime)) {
543                 keylifetime = 3600;
544         }
545
546         if(!get_config_bool(lookup_config(&config_tree, "AutoConnect"), &autoconnect)) {
547                 autoconnect = true;
548         }
549
550         get_config_bool(lookup_config(&config_tree, "DisableBuggyPeers"), &disablebuggypeers);
551
552         if(!get_config_int(lookup_config(&config_tree, "InvitationExpire"), &invitation_lifetime)) {
553                 invitation_lifetime = 604800;        // 1 week
554         }
555
556         read_invitation_key();
557
558         return true;
559 }
560
561 // Get the port that `from_fd` is listening on, and assign it to
562 // `sa` if `sa` has a dynamically allocated (zero) port.
563 static bool assign_static_port(sockaddr_t *sa, int from_fd) {
564         // We cannot get a port from a bad FD. Bail out.
565         if(from_fd <= 0) {
566                 return false;
567         }
568
569         int port = get_bound_port(from_fd);
570
571         if(!port) {
572                 return false;
573         }
574
575         // If the port is non-zero, don't reassign it as it's already static.
576         switch(sa->sa.sa_family) {
577         case AF_INET:
578                 if(!sa->in.sin_port) {
579                         sa->in.sin_port = htons(port);
580                 }
581
582                 return true;
583
584         case AF_INET6:
585                 if(!sa->in6.sin6_port) {
586                         sa->in6.sin6_port = htons(port);
587                 }
588
589                 return true;
590
591         default:
592                 logger(DEBUG_ALWAYS, LOG_ERR, "Unknown address family 0x%x", sa->sa.sa_family);
593                 return false;
594         }
595 }
596
597 typedef int (*bind_fn_t)(const sockaddr_t *);
598
599 static int bind_reusing_port(const sockaddr_t *sa, int from_fd, bind_fn_t setup) {
600         sockaddr_t reuse_sa;
601         memcpy(&reuse_sa, sa, SALEN(sa->sa));
602
603         int fd = -1;
604
605         // Check if the address we've been passed here is using port 0.
606         // If it is, try to get an actual port from an already bound socket, and reuse it here.
607         if(assign_static_port(&reuse_sa, from_fd)) {
608                 fd = setup(&reuse_sa);
609         }
610
611         // If we're binding to a hardcoded non-zero port, or no socket is listening yet,
612         // or binding failed, try the original address.
613         if(fd < 0) {
614                 fd = setup(sa);
615         }
616
617         return fd;
618 }
619
620 /*
621   Add listening sockets.
622 */
623 static bool add_listen_address(char *address, bool bindto) {
624         char *port = myport.tcp;
625
626         if(address) {
627                 char *space = strchr(address, ' ');
628
629                 if(space) {
630                         *space++ = 0;
631                         port = space;
632                 }
633
634                 if(!strcmp(address, "*")) {
635                         *address = 0;
636                 }
637         }
638
639         struct addrinfo *ai, hint = {0};
640
641         hint.ai_family = addressfamily;
642
643         hint.ai_socktype = SOCK_STREAM;
644
645         hint.ai_protocol = IPPROTO_TCP;
646
647         hint.ai_flags = AI_PASSIVE;
648
649 #if HAVE_DECL_RES_INIT
650         res_init();
651
652 #endif
653         int err = getaddrinfo(address && *address ? address : NULL, port, &hint, &ai);
654
655         free(address);
656
657         if(err || !ai) {
658                 logger(DEBUG_ALWAYS, LOG_ERR, "System call `%s' failed: %s", "getaddrinfo", err == EAI_SYSTEM ? strerror(err) : gai_strerror(err));
659                 return false;
660         }
661
662         for(struct addrinfo *aip = ai; aip; aip = aip->ai_next) {
663                 // Ignore duplicate addresses
664                 bool found = false;
665
666                 for(int i = 0; i < listen_sockets; i++)
667                         if(!memcmp(&listen_socket[i].sa, aip->ai_addr, aip->ai_addrlen)) {
668                                 found = true;
669                                 break;
670                         }
671
672                 if(found) {
673                         continue;
674                 }
675
676                 if(listen_sockets >= MAXSOCKETS) {
677                         listen_sockets = MAXSOCKETS;
678                         logger(DEBUG_ALWAYS, LOG_ERR, "Too many listening sockets");
679                         freeaddrinfo(ai);
680                         return false;
681                 }
682
683                 const sockaddr_t *sa = (sockaddr_t *) aip->ai_addr;
684                 int from_fd = listen_socket[0].tcp.fd;
685
686                 // If we're binding to a dynamically allocated (zero) port, try to get the actual
687                 // port of the first TCP socket, and use it for this one. If that succeeds, our
688                 // tincd instance will use the same port for all addresses it listens on.
689                 int tcp_fd = bind_reusing_port(sa, from_fd, setup_listen_socket);
690
691                 if(tcp_fd < 0) {
692                         continue;
693                 }
694
695                 // If we just successfully bound the first socket, use it for the UDP procedure below.
696                 // Otherwise, keep using the socket we've obtained from listen_socket[0].
697                 if(!from_fd) {
698                         from_fd = tcp_fd;
699                 }
700
701                 int udp_fd = bind_reusing_port(sa, from_fd, setup_vpn_in_socket);
702
703                 if(udp_fd < 0) {
704                         closesocket(tcp_fd);
705                         continue;
706                 }
707
708                 listen_socket_t *sock = &listen_socket[listen_sockets];
709                 io_add(&sock->tcp, handle_new_meta_connection, sock, tcp_fd, IO_READ);
710                 io_add(&sock->udp, handle_incoming_vpn_data, sock, udp_fd, IO_READ);
711
712                 if(debug_level >= DEBUG_CONNECTIONS) {
713                         int tcp_port = get_bound_port(tcp_fd);
714                         char *hostname = NULL;
715                         sockaddr2str(sa, &hostname, NULL);
716                         logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Listening on %s port %d", hostname, tcp_port);
717                         free(hostname);
718                 }
719
720                 sock->bindto = bindto;
721                 memcpy(&sock->sa, aip->ai_addr, aip->ai_addrlen);
722                 listen_sockets++;
723         }
724
725         freeaddrinfo(ai);
726         return true;
727 }
728
729 void device_enable(void) {
730         if(devops.enable) {
731                 devops.enable();
732         }
733
734         /* Run tinc-up script to further initialize the tap interface */
735
736         environment_t env;
737         environment_init(&env);
738         execute_script("tinc-up", &env);
739         environment_exit(&env);
740 }
741
742 void device_disable(void) {
743         environment_t env;
744         environment_init(&env);
745         execute_script("tinc-down", &env);
746         environment_exit(&env);
747
748         if(devops.disable) {
749                 devops.disable();
750         }
751 }
752
753 /*
754   Configure node_t myself and set up the local sockets (listen only)
755 */
756 static bool setup_myself(void) {
757         char *name, *type;
758         char *address = NULL;
759         bool port_specified = false;
760
761         if(!(name = get_name())) {
762                 logger(DEBUG_ALWAYS, LOG_ERR, "Name for tinc daemon required!");
763                 return false;
764         }
765
766         myname = xstrdup(name);
767         myself = new_node(name);
768         myself->connection = new_connection();
769         myself->connection->name = name;
770         read_host_config(&config_tree, name, true);
771
772         if(!get_config_string(lookup_config(&config_tree, "Port"), &myport.tcp)) {
773                 myport.tcp = xstrdup("655");
774         } else {
775                 port_specified = true;
776         }
777
778         myport.udp = xstrdup(myport.tcp);
779
780         myself->connection->options = 0;
781         myself->connection->protocol_major = PROT_MAJOR;
782         myself->connection->protocol_minor = PROT_MINOR;
783
784         myself->options |= PROT_MINOR << 24;
785
786 #ifdef DISABLE_LEGACY
787         myself->connection->ecdsa = read_ecdsa_private_key(&config_tree, NULL);
788         experimental = myself->connection->ecdsa != NULL;
789
790         if(!experimental) {
791                 logger(DEBUG_ALWAYS, LOG_ERR, "No private key available, cannot start tinc!");
792                 return false;
793         }
794
795 #else
796
797         if(!get_config_bool(lookup_config(&config_tree, "ExperimentalProtocol"), &experimental)) {
798                 myself->connection->ecdsa = read_ecdsa_private_key(&config_tree, NULL);
799                 experimental = myself->connection->ecdsa != NULL;
800
801                 if(!experimental) {
802                         logger(DEBUG_ALWAYS, LOG_WARNING, "Support for SPTPS disabled.");
803                 }
804         } else {
805                 if(experimental) {
806                         myself->connection->ecdsa = read_ecdsa_private_key(&config_tree, NULL);
807
808                         if(!myself->connection->ecdsa) {
809                                 return false;
810                         }
811                 }
812         }
813
814         rsa_t *rsa = read_rsa_private_key(&config_tree, NULL);
815
816         if(rsa) {
817                 myself->connection->legacy = new_legacy_ctx(rsa);
818         } else {
819                 if(experimental) {
820                         logger(DEBUG_ALWAYS, LOG_WARNING, "Support for legacy protocol disabled.");
821                 } else {
822                         logger(DEBUG_ALWAYS, LOG_ERR, "No private keys available, cannot start tinc!");
823                         return false;
824                 }
825         }
826
827 #endif
828
829         /* Ensure myport is numeric */
830         if(!is_decimal(myport.tcp)) {
831                 uint16_t port = service_to_port(myport.tcp);
832
833                 if(!port) {
834                         return false;
835                 }
836
837                 free(myport.tcp);
838                 myport.tcp = int_to_str(port);
839
840                 free(myport.udp);
841                 myport.udp = xstrdup(myport.tcp);
842         }
843
844         /* Read in all the subnets specified in the host configuration file */
845
846         for(config_t *cfg = lookup_config(&config_tree, "Subnet"); cfg; cfg = lookup_config_next(&config_tree, cfg)) {
847                 subnet_t *subnet;
848
849                 if(!get_config_subnet(cfg, &subnet)) {
850                         return false;
851                 }
852
853                 subnet_add(myself, subnet);
854         }
855
856         /* Check some options */
857
858         if(!setup_myself_reloadable()) {
859                 return false;
860         }
861
862         get_config_bool(lookup_config(&config_tree, "StrictSubnets"), &strictsubnets);
863         get_config_bool(lookup_config(&config_tree, "TunnelServer"), &tunnelserver);
864         strictsubnets |= tunnelserver;
865
866         if(get_config_int(lookup_config(&config_tree, "MaxConnectionBurst"), &max_connection_burst)) {
867                 if(max_connection_burst <= 0) {
868                         logger(DEBUG_ALWAYS, LOG_ERR, "MaxConnectionBurst cannot be negative!");
869                         return false;
870                 }
871         }
872
873         if(get_config_int(lookup_config(&config_tree, "UDPRcvBuf"), &udp_rcvbuf)) {
874                 if(udp_rcvbuf < 0) {
875                         logger(DEBUG_ALWAYS, LOG_ERR, "UDPRcvBuf cannot be negative!");
876                         return false;
877                 }
878
879                 udp_rcvbuf_warnings = true;
880         }
881
882         if(get_config_int(lookup_config(&config_tree, "UDPSndBuf"), &udp_sndbuf)) {
883                 if(udp_sndbuf < 0) {
884                         logger(DEBUG_ALWAYS, LOG_ERR, "UDPSndBuf cannot be negative!");
885                         return false;
886                 }
887
888                 udp_sndbuf_warnings = true;
889         }
890
891         get_config_int(lookup_config(&config_tree, "FWMark"), &fwmark);
892 #ifndef SO_MARK
893
894         if(fwmark) {
895                 logger(DEBUG_ALWAYS, LOG_ERR, "FWMark not supported on this platform!");
896                 return false;
897         }
898
899 #endif
900
901         int replaywin_int;
902
903         if(get_config_int(lookup_config(&config_tree, "ReplayWindow"), &replaywin_int)) {
904                 if(replaywin_int < 0) {
905                         logger(DEBUG_ALWAYS, LOG_ERR, "ReplayWindow cannot be negative!");
906                         return false;
907                 }
908
909                 replaywin = (unsigned)replaywin_int;
910                 sptps_replaywin = replaywin;
911         }
912
913 #ifndef DISABLE_LEGACY
914         /* Generate packet encryption key */
915
916         char *cipher;
917
918         if(!get_config_string(lookup_config(&config_tree, "Cipher"), &cipher)) {
919                 cipher = xstrdup("aes-256-cbc");
920         }
921
922         if(!strcasecmp(cipher, "none")) {
923                 myself->incipher = NULL;
924         } else {
925                 myself->incipher = cipher_alloc();
926
927                 if(!cipher_open_by_name(myself->incipher, cipher)) {
928                         logger(DEBUG_ALWAYS, LOG_ERR, "Unrecognized cipher type!");
929                         cipher_free(myself->incipher);
930                         myself->incipher = NULL;
931                         free(cipher);
932                         return false;
933                 }
934         }
935
936         free(cipher);
937
938         timeout_add(&keyexpire_timeout, keyexpire_handler, &keyexpire_timeout, &(struct timeval) {
939                 keylifetime, jitter()
940         });
941
942         /* Check if we want to use message authentication codes... */
943
944         int maclength = 4;
945         get_config_int(lookup_config(&config_tree, "MACLength"), &maclength);
946
947         if(maclength < 0) {
948                 logger(DEBUG_ALWAYS, LOG_ERR, "Bogus MAC length!");
949                 return false;
950         }
951
952         char *digest;
953
954         if(!get_config_string(lookup_config(&config_tree, "Digest"), &digest)) {
955                 digest = xstrdup("sha256");
956         }
957
958         if(!strcasecmp(digest, "none")) {
959                 myself->indigest = NULL;
960         } else {
961                 myself->indigest = digest_alloc();
962
963                 if(!digest_open_by_name(myself->indigest, digest, maclength)) {
964                         logger(DEBUG_ALWAYS, LOG_ERR, "Unrecognized digest type!");
965                         digest_free(myself->indigest);
966                         myself->indigest = NULL;
967                         free(digest);
968                         return false;
969                 }
970         }
971
972         free(digest);
973 #endif
974
975         /* Compression */
976         int incompression = 0;
977
978         if(get_config_int(lookup_config(&config_tree, "Compression"), &incompression)) {
979                 myself->incompression = incompression;
980
981                 switch(myself->incompression) {
982                 case COMPRESS_LZ4:
983 #ifdef HAVE_LZ4
984                         break;
985 #else
986                         logger(DEBUG_ALWAYS, LOG_ERR, "Bogus compression level!");
987                         logger(DEBUG_ALWAYS, LOG_ERR, "LZ4 compression is unavailable on this node.");
988                         return false;
989 #endif
990
991                 case COMPRESS_LZO_HI:
992                 case COMPRESS_LZO_LO:
993 #ifdef HAVE_LZO
994                         break;
995 #else
996                         logger(DEBUG_ALWAYS, LOG_ERR, "Bogus compression level!");
997                         logger(DEBUG_ALWAYS, LOG_ERR, "LZO compression is unavailable on this node.");
998                         return false;
999 #endif
1000
1001                 case COMPRESS_ZLIB_9:
1002                 case COMPRESS_ZLIB_8:
1003                 case COMPRESS_ZLIB_7:
1004                 case COMPRESS_ZLIB_6:
1005                 case COMPRESS_ZLIB_5:
1006                 case COMPRESS_ZLIB_4:
1007                 case COMPRESS_ZLIB_3:
1008                 case COMPRESS_ZLIB_2:
1009                 case COMPRESS_ZLIB_1:
1010 #ifdef HAVE_ZLIB
1011                         break;
1012 #else
1013                         logger(DEBUG_ALWAYS, LOG_ERR, "Bogus compression level!");
1014                         logger(DEBUG_ALWAYS, LOG_ERR, "ZLIB compression is unavailable on this node.");
1015                         return false;
1016 #endif
1017
1018                 case COMPRESS_NONE:
1019                         break;
1020
1021                 default:
1022                         logger(DEBUG_ALWAYS, LOG_ERR, "Bogus compression level!");
1023                         logger(DEBUG_ALWAYS, LOG_ERR, "Compression level %i is unrecognized by this node.", myself->incompression);
1024                         return false;
1025                 }
1026         } else {
1027                 myself->incompression = COMPRESS_NONE;
1028         }
1029
1030         /* Done */
1031
1032         myself->nexthop = myself;
1033         myself->via = myself;
1034         myself->status.reachable = true;
1035         myself->last_state_change = now.tv_sec;
1036         myself->status.sptps = experimental;
1037         node_add(myself);
1038
1039         graph();
1040
1041         load_all_nodes();
1042
1043         /* Open device */
1044
1045         devops = os_devops;
1046
1047         if(get_config_string(lookup_config(&config_tree, "DeviceType"), &type)) {
1048                 if(!strcasecmp(type, DEVICE_DUMMY)) {
1049                         devops = dummy_devops;
1050                 } else if(!strcasecmp(type, "raw_socket")) {
1051                         devops = raw_socket_devops;
1052                 } else if(!strcasecmp(type, "multicast")) {
1053                         devops = multicast_devops;
1054                 }
1055
1056 #ifdef HAVE_SYS_UN_H
1057                 else if(!strcasecmp(type, "fd")) {
1058                         devops = fd_devops;
1059                 }
1060
1061 #endif
1062 #ifdef ENABLE_UML
1063                 else if(!strcasecmp(type, "uml")) {
1064                         devops = uml_devops;
1065                 }
1066
1067 #endif
1068 #ifdef ENABLE_VDE
1069                 else if(!strcasecmp(type, "vde")) {
1070                         devops = vde_devops;
1071                 }
1072
1073 #endif
1074                 free(type);
1075         }
1076
1077         get_config_bool(lookup_config(&config_tree, "DeviceStandby"), &device_standby);
1078
1079         if(!devops.setup()) {
1080                 return false;
1081         }
1082
1083         if(device_fd >= 0) {
1084                 io_add(&device_io, handle_device_data, NULL, device_fd, IO_READ);
1085         }
1086
1087         /* Open sockets */
1088
1089         if(!do_detach && getenv("LISTEN_FDS")) {
1090                 sockaddr_t sa;
1091                 socklen_t salen;
1092
1093                 listen_sockets = atoi(getenv("LISTEN_FDS"));
1094 #ifdef HAVE_UNSETENV
1095                 unsetenv("LISTEN_FDS");
1096 #endif
1097
1098                 if(listen_sockets > MAXSOCKETS) {
1099                         listen_sockets = MAXSOCKETS;
1100                         logger(DEBUG_ALWAYS, LOG_ERR, "Too many listening sockets");
1101                         return false;
1102                 }
1103
1104                 for(int i = 0; i < listen_sockets; i++) {
1105                         const int tcp_fd = i + 3;
1106                         salen = sizeof(sa);
1107
1108                         if(getsockname(tcp_fd, &sa.sa, &salen) < 0) {
1109                                 logger(DEBUG_ALWAYS, LOG_ERR, "Could not get address of listen fd %d: %s", tcp_fd, sockstrerror(sockerrno));
1110                                 return false;
1111                         }
1112
1113 #ifdef FD_CLOEXEC
1114                         fcntl(tcp_fd, F_SETFD, FD_CLOEXEC);
1115 #endif
1116
1117                         int udp_fd = setup_vpn_in_socket(&sa);
1118
1119                         if(udp_fd < 0) {
1120                                 return false;
1121                         }
1122
1123                         io_add(&listen_socket[i].tcp, (io_cb_t)handle_new_meta_connection, &listen_socket[i], tcp_fd, IO_READ);
1124                         io_add(&listen_socket[i].udp, (io_cb_t)handle_incoming_vpn_data, &listen_socket[i], udp_fd, IO_READ);
1125
1126                         if(debug_level >= DEBUG_CONNECTIONS) {
1127                                 char *hostname = sockaddr2hostname(&sa);
1128                                 logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Listening on %s", hostname);
1129                                 free(hostname);
1130                         }
1131
1132                         memcpy(&listen_socket[i].sa, &sa, salen);
1133                 }
1134         } else {
1135                 listen_sockets = 0;
1136                 int cfgs = 0;
1137
1138                 for(config_t *cfg = lookup_config(&config_tree, "BindToAddress"); cfg; cfg = lookup_config_next(&config_tree, cfg)) {
1139                         cfgs++;
1140                         get_config_string(cfg, &address);
1141
1142                         if(!add_listen_address(address, true)) {
1143                                 return false;
1144                         }
1145                 }
1146
1147                 for(config_t *cfg = lookup_config(&config_tree, "ListenAddress"); cfg; cfg = lookup_config_next(&config_tree, cfg)) {
1148                         cfgs++;
1149                         get_config_string(cfg, &address);
1150
1151                         if(!add_listen_address(address, false)) {
1152                                 return false;
1153                         }
1154                 }
1155
1156                 if(!cfgs)
1157                         if(!add_listen_address(address, NULL)) {
1158                                 return false;
1159                         }
1160         }
1161
1162         if(!listen_sockets) {
1163                 logger(DEBUG_ALWAYS, LOG_ERR, "Unable to create any listening socket!");
1164                 return false;
1165         }
1166
1167         /* If no Port option was specified, set myport to the port used by the first listening socket. */
1168
1169         if(!port_specified || atoi(myport.tcp) == 0) {
1170                 listen_socket_t *sock = &listen_socket[0];
1171
1172                 uint16_t tcp = get_bound_port(sock->tcp.fd);
1173                 free(myport.tcp);
1174                 myport.tcp = int_to_str(tcp);
1175
1176                 uint16_t udp = get_bound_port(sock->udp.fd);
1177                 free(myport.udp);
1178                 myport.udp = int_to_str(udp);
1179         }
1180
1181         xasprintf(&myself->hostname, "MYSELF port %s", myport.tcp);
1182         myself->connection->hostname = xstrdup(myself->hostname);
1183
1184         char *upnp = NULL;
1185         get_config_string(lookup_config(&config_tree, "UPnP"), &upnp);
1186         bool upnp_tcp = false;
1187         bool upnp_udp = false;
1188
1189         if(upnp) {
1190                 if(!strcasecmp(upnp, "yes")) {
1191                         upnp_tcp = upnp_udp = true;
1192                 } else if(!strcasecmp(upnp, "udponly")) {
1193                         upnp_udp = true;
1194                 }
1195
1196                 free(upnp);
1197         }
1198
1199         if(upnp_tcp || upnp_udp) {
1200 #ifdef HAVE_MINIUPNPC
1201                 upnp_init(upnp_tcp, upnp_udp);
1202 #else
1203                 logger(DEBUG_ALWAYS, LOG_WARNING, "UPnP was requested, but tinc isn't built with miniupnpc support!");
1204 #endif
1205         }
1206
1207         /* Done. */
1208
1209         last_config_check = now.tv_sec;
1210
1211         return true;
1212 }
1213
1214 /*
1215   initialize network
1216 */
1217 bool setup_network(void) {
1218         init_connections();
1219         init_subnets();
1220
1221         if(get_config_int(lookup_config(&config_tree, "PingInterval"), &pinginterval)) {
1222                 if(pinginterval < 1) {
1223                         pinginterval = 86400;
1224                 }
1225         } else {
1226                 pinginterval = 60;
1227         }
1228
1229         if(!get_config_int(lookup_config(&config_tree, "PingTimeout"), &pingtimeout)) {
1230                 pingtimeout = 5;
1231         }
1232
1233         if(pingtimeout < 1 || pingtimeout > pinginterval) {
1234                 pingtimeout = pinginterval;
1235         }
1236
1237         if(!get_config_int(lookup_config(&config_tree, "MaxOutputBufferSize"), &maxoutbufsize)) {
1238                 maxoutbufsize = 10 * MTU;
1239         }
1240
1241         if(!setup_myself()) {
1242                 return false;
1243         }
1244
1245         if(!init_control()) {
1246                 return false;
1247         }
1248
1249         if(!device_standby) {
1250                 device_enable();
1251         }
1252
1253         /* Run subnet-up scripts for our own subnets */
1254
1255         subnet_update(myself, NULL, true);
1256
1257         return true;
1258 }
1259
1260 /*
1261   close all open network connections
1262 */
1263 void close_network_connections(void) {
1264         for(list_node_t *node = connection_list.head, *next; node; node = next) {
1265                 next = node->next;
1266                 connection_t *c = node->data;
1267
1268                 /* Keep control connections open until the end, so they know when we really terminated */
1269                 if(c->status.control) {
1270                         c->socket = -1;
1271                 }
1272
1273                 c->outgoing = NULL;
1274                 terminate_connection(c, false);
1275         }
1276
1277         list_empty_list(&outgoing_list);
1278
1279         if(myself && myself->connection) {
1280                 subnet_update(myself, NULL, false);
1281                 free_connection(myself->connection);
1282         }
1283
1284         for(int i = 0; i < listen_sockets; i++) {
1285                 io_del(&listen_socket[i].tcp);
1286                 io_del(&listen_socket[i].udp);
1287                 closesocket(listen_socket[i].tcp.fd);
1288                 closesocket(listen_socket[i].udp.fd);
1289         }
1290
1291         exit_requests();
1292         exit_edges();
1293         exit_subnets();
1294         exit_nodes();
1295         exit_connections();
1296
1297         if(!device_standby) {
1298                 device_disable();
1299         }
1300
1301         free(myport.tcp);
1302         free(myport.udp);
1303
1304         if(device_fd >= 0) {
1305                 io_del(&device_io);
1306         }
1307
1308         if(devops.close) {
1309                 devops.close();
1310         }
1311
1312         exit_control();
1313
1314         free(scriptextension);
1315         free(scriptinterpreter);
1316
1317         return;
1318 }