2 net.c -- most of the network code
3 Copyright (C) 1998,1999,2000 Ivo Timmermans <itimmermans@bigfoot.com>,
4 2000 Guus Sliepen <guus@sliepen.warande.net>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 $Id: net.c,v 1.35.4.38 2000/10/15 20:30:39 guus Exp $
25 #include <arpa/inet.h>
29 #include <netinet/in.h>
33 #include <sys/signal.h>
34 #include <sys/socket.h>
36 #include <sys/types.h>
42 #include LINUX_IF_TUN_H
60 int total_tap_out = 0;
61 int total_socket_in = 0;
62 int total_socket_out = 0;
64 int upstreamindex = 0;
65 static int seconds_till_retry;
70 strip off the MAC adresses of an ethernet frame
72 void strip_mac_addresses(vpn_packet_t *p)
75 memmove(p->data, p->data + 12, p->len -= 12);
80 reassemble MAC addresses
82 void add_mac_addresses(vpn_packet_t *p)
85 memcpy(p->data + 12, p->data, p->len);
87 p->data[0] = p->data[6] = 0xfe;
88 p->data[1] = p->data[7] = 0xfd;
89 /* Really evil pointer stuff just below! */
90 *((ip_t*)(&p->data[2])) = (ip_t)(htonl(myself->address));
91 *((ip_t*)(&p->data[8])) = *((ip_t*)(&p->data[26]));
95 int xsend(conn_list_t *cl, vpn_packet_t *inpkt)
100 outpkt.len = inpkt->len;
101 EVP_EncryptInit(cl->cipher_pktctx, cl->cipher_pkttype, cl->cipher_pktkey, NULL);
102 EVP_EncryptUpdate(cl->cipher_pktctx, outpkt.data, &outlen, inpkt->data, inpkt->len);
103 EVP_EncryptFinal(cl->cipher_pktctx, outpkt.data + outlen, &outpad);
107 syslog(LOG_ERR, _("Sending packet of %d bytes to %s (%s)"),
108 outlen, cl->name, cl->hostname);
110 total_socket_out += outlen;
114 if((send(cl->socket, (char *) &(outpkt.len), outlen + 2, 0)) < 0)
116 syslog(LOG_ERR, _("Error sending packet to %s (%s): %m"),
117 cl->name, cl->hostname);
124 int xrecv(vpn_packet_t *inpkt)
130 syslog(LOG_ERR, _("Receiving packet of %d bytes"),
133 outpkt.len = inpkt->len;
134 EVP_DecryptInit(myself->cipher_pktctx, myself->cipher_pkttype, myself->cipher_pktkey, NULL);
135 EVP_DecryptUpdate(myself->cipher_pktctx, outpkt.data, &outlen, inpkt->data, inpkt->len);
136 /* FIXME: grok DecryptFinal
137 EVP_DecryptFinal(myself->cipher_pktctx, outpkt.data + outlen, &outpad);
140 add_mac_addresses(&outpkt);
142 if(write(tap_fd, outpkt.data, outpkt.len) < 0)
143 syslog(LOG_ERR, _("Can't write to tap device: %m"));
145 total_tap_out += outpkt.len;
151 add the given packet of size s to the
152 queue q, be it the send or receive queue
154 void add_queue(packet_queue_t **q, void *packet, size_t s)
158 e = xmalloc(sizeof(*e));
159 e->packet = xmalloc(s);
160 memcpy(e->packet, packet, s);
164 *q = xmalloc(sizeof(**q));
165 (*q)->head = (*q)->tail = NULL;
168 e->next = NULL; /* We insert at the tail */
170 if((*q)->tail) /* Do we have a tail? */
172 (*q)->tail->next = e;
173 e->prev = (*q)->tail;
175 else /* No tail -> no head too */
185 /* Remove a queue element */
186 void del_queue(packet_queue_t **q, queue_element_t *e)
191 if(e->next) /* There is a successor, so we are not tail */
193 if(e->prev) /* There is a predecessor, so we are not head */
195 e->next->prev = e->prev;
196 e->prev->next = e->next;
198 else /* We are head */
200 e->next->prev = NULL;
201 (*q)->head = e->next;
204 else /* We are tail (or all alone!) */
206 if(e->prev) /* We are not alone :) */
208 e->prev->next = NULL;
209 (*q)->tail = e->prev;
223 flush a queue by calling function for
224 each packet, and removing it when that
225 returned a zero exit code
227 void flush_queue(conn_list_t *cl, packet_queue_t **pq,
228 int (*function)(conn_list_t*,void*))
230 queue_element_t *p, *next = NULL;
232 for(p = (*pq)->head; p != NULL; )
236 if(!function(cl, p->packet))
243 syslog(LOG_DEBUG, _("Queue flushed"));
248 flush the send&recv queues
249 void because nothing goes wrong here, packets
250 remain in the queue if something goes wrong
252 void flush_queues(conn_list_t *cl)
258 syslog(LOG_DEBUG, _("Flushing send queue for %s (%s)"),
259 cl->name, cl->hostname);
260 flush_queue(cl, &(cl->sq), xsend);
266 syslog(LOG_DEBUG, _("Flushing receive queue for %s (%s)"),
267 cl->name, cl->hostname);
268 flush_queue(cl, &(cl->rq), xrecv);
274 send a packet to the given vpn ip.
276 int send_packet(ip_t to, vpn_packet_t *packet)
280 if((cl = lookup_conn_list_ipv4(to)) == NULL)
284 syslog(LOG_NOTICE, _("Trying to look up %d.%d.%d.%d in connection list failed!"),
291 /* If we ourselves have indirectdata flag set, we should send only to our uplink! */
293 /* FIXME - check for indirection and reprogram it The Right Way(tm) this time. */
295 if(!cl->status.dataopen)
296 if(setup_vpn_connection(cl) < 0)
298 syslog(LOG_ERR, _("Could not open UDP connection to %s (%s)"),
299 cl->name, cl->hostname);
303 if(!cl->status.validkey)
306 syslog(LOG_INFO, _("No valid key known yet for %s (%s), queueing packet"),
307 cl->name, cl->hostname);
308 add_queue(&(cl->sq), packet, packet->len + 2);
309 if(!cl->status.waitingforkey)
310 send_req_key(myself, cl); /* Keys should be sent to the host running the tincd */
314 if(!cl->status.active)
317 syslog(LOG_INFO, _("%s (%s) is not ready, queueing packet"),
318 cl->name, cl->hostname);
319 add_queue(&(cl->sq), packet, packet->len + 2);
320 return 0; /* We don't want to mess up, do we? */
323 /* can we send it? can we? can we? huh? */
325 return xsend(cl, packet);
329 open the local ethertap device
331 int setup_tap_fd(void)
334 const char *tapfname;
341 if((cfg = get_config_val(config, tapdevice)))
342 tapfname = cfg->data.ptr;
345 tapfname = "/dev/misc/net/tun";
347 tapfname = "/dev/tap0";
350 if((nfd = open(tapfname, O_RDWR | O_NONBLOCK)) < 0)
352 syslog(LOG_ERR, _("Could not open %s: %m"), tapfname);
359 /* Ok now check if this is an old ethertap or a new tun/tap thingie */
360 memset(&ifr, 0, sizeof(ifr));
362 ifr.ifr_flags = IFF_TAP;
364 strncpy(ifr.ifr_name, netname, IFNAMSIZ);
366 if (!ioctl(tap_fd, TUNSETIFF, (void *) &ifr))
368 syslog(LOG_INFO, _("%s is a new style tun/tap device"), tapfname);
369 if((cfg = get_config_val(config, tapsubnet)) == NULL)
370 syslog(LOG_INFO, _("tun/tap device will be left unconfigured"));
372 /* Setup inetaddr/netmask etc */;
381 set up the socket that we listen on for incoming
384 int setup_listen_meta_socket(int port)
387 struct sockaddr_in a;
391 if((nfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
393 syslog(LOG_ERR, _("Creating metasocket failed: %m"));
397 if(setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)))
399 syslog(LOG_ERR, _("setsockopt: %m"));
403 if(setsockopt(nfd, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof(one)))
405 syslog(LOG_ERR, _("setsockopt: %m"));
409 flags = fcntl(nfd, F_GETFL);
410 if(fcntl(nfd, F_SETFL, flags | O_NONBLOCK) < 0)
412 syslog(LOG_ERR, _("fcntl: %m"));
416 if((cfg = get_config_val(config, interface)))
418 if(setsockopt(nfd, SOL_SOCKET, SO_KEEPALIVE, cfg->data.ptr, strlen(cfg->data.ptr)))
420 syslog(LOG_ERR, _("Unable to bind listen socket to interface %s: %m"), cfg->data.ptr);
425 memset(&a, 0, sizeof(a));
426 a.sin_family = AF_INET;
427 a.sin_port = htons(port);
429 if((cfg = get_config_val(config, interfaceip)))
430 a.sin_addr.s_addr = htonl(cfg->data.ip->ip);
432 a.sin_addr.s_addr = htonl(INADDR_ANY);
434 if(bind(nfd, (struct sockaddr *)&a, sizeof(struct sockaddr)))
436 syslog(LOG_ERR, _("Can't bind to port %hd/tcp: %m"), port);
442 syslog(LOG_ERR, _("listen: %m"));
450 setup the socket for incoming encrypted
453 int setup_vpn_in_socket(int port)
456 struct sockaddr_in a;
459 if((nfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
461 syslog(LOG_ERR, _("Creating socket failed: %m"));
465 if(setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)))
467 syslog(LOG_ERR, _("setsockopt: %m"));
471 flags = fcntl(nfd, F_GETFL);
472 if(fcntl(nfd, F_SETFL, flags | O_NONBLOCK) < 0)
474 syslog(LOG_ERR, _("fcntl: %m"));
478 memset(&a, 0, sizeof(a));
479 a.sin_family = AF_INET;
480 a.sin_port = htons(port);
481 a.sin_addr.s_addr = htonl(INADDR_ANY);
483 if(bind(nfd, (struct sockaddr *)&a, sizeof(struct sockaddr)))
485 syslog(LOG_ERR, _("Can't bind to port %hd/udp: %m"), port);
493 setup an outgoing meta (tcp) socket
495 int setup_outgoing_meta_socket(conn_list_t *cl)
498 struct sockaddr_in a;
502 syslog(LOG_INFO, _("Trying to connect to %s"), cl->hostname);
504 if((cfg = get_config_val(cl->config, port)) == NULL)
507 cl->port = cfg->data.val;
509 cl->meta_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
510 if(cl->meta_socket == -1)
512 syslog(LOG_ERR, _("Creating socket for %s port %d failed: %m"),
513 cl->hostname, cl->port);
517 a.sin_family = AF_INET;
518 a.sin_port = htons(cl->port);
519 a.sin_addr.s_addr = htonl(cl->address);
521 if(connect(cl->meta_socket, (struct sockaddr *)&a, sizeof(a)) == -1)
523 syslog(LOG_ERR, _("%s port %hd: %m"), cl->hostname, cl->port);
527 flags = fcntl(cl->meta_socket, F_GETFL);
528 if(fcntl(cl->meta_socket, F_SETFL, flags | O_NONBLOCK) < 0)
530 syslog(LOG_ERR, _("fcntl for %s port %d: %m"),
531 cl->hostname, cl->port);
536 syslog(LOG_INFO, _("Connected to %s port %hd"),
537 cl->hostname, cl->port);
543 setup an outgoing connection. It's not
544 necessary to also open an udp socket as
545 well, because the other host will initiate
546 an authentication sequence during which
547 we will do just that.
549 int setup_outgoing_connection(char *hostname)
554 if(!(h = gethostbyname(hostname)))
556 syslog(LOG_ERR, _("Error looking up `%s': %m"), hostname);
560 ncn = new_conn_list();
561 ncn->address = ntohl(*((ip_t*)(h->h_addr_list[0])));
562 ncn->hostname = hostlookup(htonl(ncn->address));
564 if(setup_outgoing_meta_socket(ncn) < 0)
566 syslog(LOG_ERR, _("Could not set up a meta connection to %s"),
572 ncn->status.meta = 1;
573 ncn->status.outgoing = 1;
574 ncn->next = conn_list;
581 set up the local sockets (listen only)
583 int setup_myself(void)
587 myself = new_conn_list();
589 asprintf(&myself->hostname, "MYSELF"); /* FIXME? Do hostlookup on ourselves? */
591 myself->protocol_version = PROT_CURRENT;
593 if(!(cfg = get_config_val(config, tincname))) /* Not acceptable */
595 syslog(LOG_ERR, _("Name for tinc daemon required!"));
599 myself->name = (char*)cfg->data.val;
601 if(check_id(myself->name))
603 syslog(LOG_ERR, _("Invalid name for myself!"));
607 if(read_host_config(myself))
609 syslog(LOG_ERR, _("Cannot open host configuration file for myself!"));
613 if(!(cfg = get_config_val(myself->config, port)))
616 myself->port = cfg->data.val;
618 if((cfg = get_config_val(myself->config, indirectdata)))
619 if(cfg->data.val == stupid_true)
620 myself->flags |= EXPORTINDIRECTDATA;
622 if((cfg = get_config_val(myself->config, tcponly)))
623 if(cfg->data.val == stupid_true)
624 myself->flags |= TCPONLY;
626 if((myself->meta_socket = setup_listen_meta_socket(myself->port)) < 0)
628 syslog(LOG_ERR, _("Unable to set up a listening socket!"));
632 if((myself->socket = setup_vpn_in_socket(myself->port)) < 0)
634 syslog(LOG_ERR, _("Unable to set up an incoming vpn data socket!"));
635 close(myself->meta_socket);
639 myself->status.active = 1;
641 syslog(LOG_NOTICE, _("Ready: listening on port %hd"), myself->port);
647 sigalrm_handler(int a)
651 /* FIXME! Use name instead of upstreamip.
652 cfg = get_next_config_val(config, upstreamip, upstreamindex++);
656 if(!setup_outgoing_connection(cfg->data.ptr)) /* function returns 0 when there are no problems */
658 signal(SIGALRM, SIG_IGN);
661 // cfg = get_next_config_val(config, upstreamip, upstreamindex++); /* Or else we try the next ConnectTo line */
664 signal(SIGALRM, sigalrm_handler);
666 seconds_till_retry += 5;
667 if(seconds_till_retry > MAXTIMEOUT) /* Don't wait more than MAXTIMEOUT seconds. */
668 seconds_till_retry = MAXTIMEOUT;
669 syslog(LOG_ERR, _("Still failed to connect to other, will retry in %d seconds"),
671 alarm(seconds_till_retry);
676 setup all initial network connections
678 int setup_network_connections(void)
682 if((cfg = get_config_val(config, pingtimeout)) == NULL)
685 timeout = cfg->data.val;
687 if(setup_tap_fd() < 0)
690 if(setup_myself() < 0)
693 // if((cfg = get_next_config_val(config, upstreamip, upstreamindex++)) == NULL)
694 /* No upstream IP given, we're listen only. */
699 if(!setup_outgoing_connection(cfg->data.ptr)) /* function returns 0 when there are no problems */
701 // cfg = get_next_config_val(config, upstreamip, upstreamindex++); /* Or else we try the next ConnectTo line */
704 signal(SIGALRM, sigalrm_handler);
706 seconds_till_retry = MAXTIMEOUT;
707 syslog(LOG_NOTICE, _("Trying to re-establish outgoing connection in %d seconds"), seconds_till_retry);
708 alarm(seconds_till_retry);
714 close all open network connections
716 void close_network_connections(void)
720 for(p = conn_list; p != NULL; p = p->next)
722 if(p->status.dataopen)
724 shutdown(p->socket, 0); /* No more receptions */
730 shutdown(p->meta_socket, 0); /* No more receptions */
731 close(p->meta_socket);
736 if(myself->status.active)
738 close(myself->meta_socket);
739 close(myself->socket);
745 syslog(LOG_NOTICE, _("Terminating"));
751 create a data (udp) socket
753 int setup_vpn_connection(conn_list_t *cl)
756 struct sockaddr_in a;
759 syslog(LOG_DEBUG, _("Opening UDP socket to %s"), cl->hostname);
761 nfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
764 syslog(LOG_ERR, _("Creating UDP socket failed: %m"));
768 a.sin_family = AF_INET;
769 a.sin_port = htons(cl->port);
770 a.sin_addr.s_addr = htonl(cl->address);
772 if(connect(nfd, (struct sockaddr *)&a, sizeof(a)) == -1)
774 syslog(LOG_ERR, _("Connecting to %s port %d failed: %m"),
775 cl->hostname, cl->port);
779 flags = fcntl(nfd, F_GETFL);
780 if(fcntl(nfd, F_SETFL, flags | O_NONBLOCK) < 0)
782 syslog(LOG_ERR, _("This is a bug: %s:%d: %d:%m %s (%s)"), __FILE__, __LINE__, nfd,
783 cl->name, cl->hostname);
788 cl->status.dataopen = 1;
794 handle an incoming tcp connect call and open
797 conn_list_t *create_new_connection(int sfd)
800 struct sockaddr_in ci;
801 int len = sizeof(ci);
805 if(getpeername(sfd, &ci, &len) < 0)
807 syslog(LOG_ERR, _("Error: getpeername: %m"));
812 p->address = ntohl(ci.sin_addr.s_addr);
813 p->hostname = hostlookup(ci.sin_addr.s_addr);
814 p->meta_socket = sfd;
816 p->buffer = xmalloc(MAXBUFSIZE);
818 p->last_ping_time = time(NULL);
822 syslog(LOG_NOTICE, _("Connection from %s port %d"),
823 p->hostname, htons(ci.sin_port));
835 put all file descriptors in an fd_set array
837 void build_fdset(fd_set *fs)
843 for(p = conn_list; p != NULL; p = p->next)
846 FD_SET(p->meta_socket, fs);
847 if(p->status.dataopen)
848 FD_SET(p->socket, fs);
851 FD_SET(myself->meta_socket, fs);
852 FD_SET(myself->socket, fs);
858 receive incoming data from the listening
859 udp socket and write it to the ethertap
860 device after being decrypted
862 int handle_incoming_vpn_data()
866 int x, l = sizeof(x);
868 if(getsockopt(myself->socket, SOL_SOCKET, SO_ERROR, &x, &l) < 0)
870 syslog(LOG_ERR, _("This is a bug: %s:%d: %d:%m"),
871 __FILE__, __LINE__, myself->socket);
876 syslog(LOG_ERR, _("Incoming data socket error: %s"), strerror(x));
880 if(recvfrom(myself->socket, (char *) &(pkt.len), MTU, 0, NULL, NULL) <= 0)
882 syslog(LOG_ERR, _("Receiving packet failed: %m"));
891 terminate a connection and notify the other
892 end before closing the sockets
894 void terminate_connection(conn_list_t *cl)
899 if(cl->status.remove)
903 syslog(LOG_NOTICE, _("Closing connection with %s (%s)"),
904 cl->name, cl->hostname);
909 close(cl->meta_socket);
911 cl->status.remove = 1;
913 /* If this cl isn't active, don't send any DEL_HOSTs. */
915 /* FIXME: reprogram this.
916 if(cl->status.active)
917 notify_others(cl,NULL,send_del_host);
921 /* Find all connections that were lost because they were behind cl
922 (the connection that was dropped). */
924 for(p = conn_list; p != NULL; p = p->next)
926 if((p->nexthop == cl) && (p != cl))
928 if(cl->status.active && p->status.active)
929 /* FIXME: reprogram this
930 notify_others(p,cl,send_del_host);
934 p->status.active = 0;
935 p->status.remove = 1;
939 cl->status.active = 0;
941 if(cl->status.outgoing)
943 signal(SIGALRM, sigalrm_handler);
944 seconds_till_retry = 5;
945 alarm(seconds_till_retry);
946 syslog(LOG_NOTICE, _("Trying to re-establish outgoing connection in 5 seconds"));
952 Check if the other end is active.
953 If we have sent packets, but didn't receive any,
954 then possibly the other end is dead. We send a
955 PING request over the meta connection. If the other
956 end does not reply in time, we consider them dead
957 and close the connection.
959 int check_dead_connections(void)
965 for(p = conn_list; p != NULL; p = p->next)
969 if(p->status.active && p->status.meta)
971 if(p->last_ping_time + timeout < now)
973 if(p->status.pinged && !p->status.got_pong)
976 syslog(LOG_INFO, _("%s (%s) didn't respond to PING"),
977 p->name, p->hostname);
978 p->status.timeout = 1;
979 terminate_connection(p);
981 else if(p->want_ping)
984 p->last_ping_time = now;
985 p->status.pinged = 1;
986 p->status.got_pong = 0;
996 accept a new tcp connect and create a
999 int handle_new_meta_connection()
1002 struct sockaddr client;
1003 int nfd, len = sizeof(client);
1005 if((nfd = accept(myself->meta_socket, &client, &len)) < 0)
1007 syslog(LOG_ERR, _("Accepting a new connection failed: %m"));
1011 if(!(ncn = create_new_connection(nfd)))
1015 syslog(LOG_NOTICE, _("Closed attempted connection"));
1019 ncn->status.meta = 1;
1020 ncn->next = conn_list;
1027 check all connections to see if anything
1028 happened on their sockets
1030 void check_network_activity(fd_set *f)
1033 int x, l = sizeof(x);
1035 for(p = conn_list; p != NULL; p = p->next)
1037 if(p->status.remove)
1040 if(p->status.dataopen)
1041 if(FD_ISSET(p->socket, f))
1044 The only thing that can happen to get us here is apparently an
1045 error on this outgoing(!) UDP socket that isn't immediate (i.e.
1046 something that will not trigger an error directly on send()).
1047 I've once got here when it said `No route to host'.
1049 getsockopt(p->socket, SOL_SOCKET, SO_ERROR, &x, &l);
1050 syslog(LOG_ERR, _("Outgoing data socket error for %s (%s): %s"),
1051 p->name, p->hostname, strerror(x));
1052 terminate_connection(p);
1057 if(FD_ISSET(p->meta_socket, f))
1058 if(receive_meta(p) < 0)
1060 terminate_connection(p);
1065 if(FD_ISSET(myself->socket, f))
1066 handle_incoming_vpn_data();
1068 if(FD_ISSET(myself->meta_socket, f))
1069 handle_new_meta_connection();
1074 read, encrypt and send data that is
1075 available through the ethertap device
1077 void handle_tap_input(void)
1081 int ether_type, lenin;
1083 memset(&vp, 0, sizeof(vp));
1084 if((lenin = read(tap_fd, &vp, MTU)) <= 0)
1086 syslog(LOG_ERR, _("Error while reading from tapdevice: %m"));
1090 total_tap_in += lenin;
1092 ether_type = ntohs(*((unsigned short*)(&vp.data[12])));
1093 if(ether_type != 0x0800)
1096 syslog(LOG_INFO, _("Non-IP ethernet frame %04x from %02x:%02x:%02x:%02x:%02x:%02x"), ether_type, MAC_ADDR_V(vp.data[6]));
1103 syslog(LOG_INFO, _("Dropping short packet from %02x:%02x:%02x:%02x:%02x:%02x"), MAC_ADDR_V(vp.data[6]));
1107 from = ntohl(*((unsigned long*)(&vp.data[26])));
1108 to = ntohl(*((unsigned long*)(&vp.data[30])));
1110 vp.len = (length_t)lenin - 2;
1112 strip_mac_addresses(&vp);
1114 send_packet(to, &vp);
1119 this is where it all happens...
1121 void main_loop(void)
1126 time_t last_ping_check;
1128 last_ping_check = time(NULL);
1132 tv.tv_sec = timeout;
1138 if((r = select(FD_SETSIZE, &fset, NULL, NULL, &tv)) < 0)
1140 if(errno != EINTR) /* because of alarm */
1142 syslog(LOG_ERR, _("Error while waiting for input: %m"));
1150 /* FIXME: reprogram this.
1152 syslog(LOG_INFO, _("Rereading configuration file"));
1153 close_network_connections();
1155 if(read_config_file(&config, configfilename))
1157 syslog(LOG_ERR, _("Unable to reread configuration file, exiting"));
1161 setup_network_connections();
1166 if(last_ping_check + timeout < time(NULL))
1167 /* Let's check if everybody is still alive */
1169 check_dead_connections();
1170 last_ping_check = time(NULL);
1175 check_network_activity(&fset);
1177 /* local tap data */
1178 if(FD_ISSET(tap_fd, &fset))