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.39 2000/10/16 16:33:29 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);
545 setup an outgoing connection. It's not
546 necessary to also open an udp socket as
547 well, because the other host will initiate
548 an authentication sequence during which
549 we will do just that.
551 int setup_outgoing_connection(char *name)
559 syslog(LOG_ERR, _("Invalid name for outgoing connection"));
563 ncn = new_conn_list();
564 asprintf(&ncn->name, "%s", name);
566 if(read_host_config(ncn))
568 syslog(LOG_ERR, _("Error reading host configuration file for %s"));
573 if(!(cfg = get_config_val(ncn->config, address)))
575 syslog(LOG_ERR, _("No address specified for %s"));
580 if(!(h = gethostbyname(cfg->data.ptr)))
582 syslog(LOG_ERR, _("Error looking up `%s': %m"), cfg->data.ptr);
587 ncn->address = ntohl(*((ip_t*)(h->h_addr_list[0])));
588 ncn->hostname = hostlookup(htonl(ncn->address));
590 if(setup_outgoing_meta_socket(ncn) < 0)
592 syslog(LOG_ERR, _("Could not set up a meta connection to %s"),
598 ncn->status.outgoing = 1;
599 ncn->buffer = xmalloc(MAXBUFSIZE);
601 ncn->last_ping_time = time(NULL);
612 set up the local sockets (listen only)
614 int setup_myself(void)
618 myself = new_conn_list();
620 asprintf(&myself->hostname, "MYSELF"); /* FIXME? Do hostlookup on ourselves? */
622 myself->protocol_version = PROT_CURRENT;
624 if(!(cfg = get_config_val(config, tincname))) /* Not acceptable */
626 syslog(LOG_ERR, _("Name for tinc daemon required!"));
630 asprintf(&myself->name, "%s", (char*)cfg->data.val);
632 if(check_id(myself->name))
634 syslog(LOG_ERR, _("Invalid name for myself!"));
638 if(read_host_config(myself))
640 syslog(LOG_ERR, _("Cannot open host configuration file for myself!"));
644 if(!(cfg = get_config_val(myself->config, port)))
647 myself->port = cfg->data.val;
649 if((cfg = get_config_val(myself->config, indirectdata)))
650 if(cfg->data.val == stupid_true)
651 myself->flags |= EXPORTINDIRECTDATA;
653 if((cfg = get_config_val(myself->config, tcponly)))
654 if(cfg->data.val == stupid_true)
655 myself->flags |= TCPONLY;
657 if((myself->meta_socket = setup_listen_meta_socket(myself->port)) < 0)
659 syslog(LOG_ERR, _("Unable to set up a listening socket!"));
663 if((myself->socket = setup_vpn_in_socket(myself->port)) < 0)
665 syslog(LOG_ERR, _("Unable to set up an incoming vpn data socket!"));
666 close(myself->meta_socket);
670 myself->status.active = 1;
672 syslog(LOG_NOTICE, _("Ready: listening on port %hd"), myself->port);
678 sigalrm_handler(int a)
682 cfg = get_next_config_val(config, connectto, upstreamindex++);
684 if(!upstreamindex && !cfg)
685 /* No upstream IP given, we're listen only. */
690 if(!setup_outgoing_connection(cfg->data.ptr)) /* function returns 0 when there are no problems */
692 signal(SIGALRM, SIG_IGN);
695 cfg = get_next_config_val(config, connectto, upstreamindex++); /* Or else we try the next ConnectTo line */
698 signal(SIGALRM, sigalrm_handler);
700 seconds_till_retry += 5;
701 if(seconds_till_retry > MAXTIMEOUT) /* Don't wait more than MAXTIMEOUT seconds. */
702 seconds_till_retry = MAXTIMEOUT;
703 syslog(LOG_ERR, _("Still failed to connect to other, will retry in %d seconds"),
705 alarm(seconds_till_retry);
710 setup all initial network connections
712 int setup_network_connections(void)
716 if((cfg = get_config_val(config, pingtimeout)) == NULL)
719 timeout = cfg->data.val;
721 if(setup_tap_fd() < 0)
724 if(setup_myself() < 0)
727 if((cfg = get_next_config_val(config, connectto, upstreamindex++)) == NULL)
728 /* No upstream IP given, we're listen only. */
733 if(!setup_outgoing_connection(cfg->data.ptr)) /* function returns 0 when there are no problems */
735 cfg = get_next_config_val(config, connectto, upstreamindex++); /* Or else we try the next ConnectTo line */
738 signal(SIGALRM, sigalrm_handler);
740 seconds_till_retry = MAXTIMEOUT;
741 syslog(LOG_NOTICE, _("Trying to re-establish outgoing connection in %d seconds"), seconds_till_retry);
742 alarm(seconds_till_retry);
748 close all open network connections
750 void close_network_connections(void)
754 for(p = conn_list; p != NULL; p = p->next)
756 if(p->status.dataopen)
758 shutdown(p->socket, 0); /* No more receptions */
764 shutdown(p->meta_socket, 0); /* No more receptions */
765 close(p->meta_socket);
770 if(myself->status.active)
772 close(myself->meta_socket);
773 close(myself->socket);
779 syslog(LOG_NOTICE, _("Terminating"));
785 create a data (udp) socket
787 int setup_vpn_connection(conn_list_t *cl)
790 struct sockaddr_in a;
793 syslog(LOG_DEBUG, _("Opening UDP socket to %s"), cl->hostname);
795 nfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
798 syslog(LOG_ERR, _("Creating UDP socket failed: %m"));
802 a.sin_family = AF_INET;
803 a.sin_port = htons(cl->port);
804 a.sin_addr.s_addr = htonl(cl->address);
806 if(connect(nfd, (struct sockaddr *)&a, sizeof(a)) == -1)
808 syslog(LOG_ERR, _("Connecting to %s port %d failed: %m"),
809 cl->hostname, cl->port);
813 flags = fcntl(nfd, F_GETFL);
814 if(fcntl(nfd, F_SETFL, flags | O_NONBLOCK) < 0)
816 syslog(LOG_ERR, _("This is a bug: %s:%d: %d:%m %s (%s)"), __FILE__, __LINE__, nfd,
817 cl->name, cl->hostname);
822 cl->status.dataopen = 1;
828 handle an incoming tcp connect call and open
831 conn_list_t *create_new_connection(int sfd)
834 struct sockaddr_in ci;
835 int len = sizeof(ci);
839 if(getpeername(sfd, &ci, &len) < 0)
841 syslog(LOG_ERR, _("Error: getpeername: %m"));
846 p->address = ntohl(ci.sin_addr.s_addr);
847 p->hostname = hostlookup(ci.sin_addr.s_addr);
848 p->meta_socket = sfd;
850 p->buffer = xmalloc(MAXBUFSIZE);
852 p->last_ping_time = time(NULL);
856 syslog(LOG_NOTICE, _("Connection from %s port %d"),
857 p->hostname, htons(ci.sin_port));
859 p->allow_request = ID;
865 put all file descriptors in an fd_set array
867 void build_fdset(fd_set *fs)
873 for(p = conn_list; p != NULL; p = p->next)
876 FD_SET(p->meta_socket, fs);
877 if(p->status.dataopen)
878 FD_SET(p->socket, fs);
881 FD_SET(myself->meta_socket, fs);
882 FD_SET(myself->socket, fs);
888 receive incoming data from the listening
889 udp socket and write it to the ethertap
890 device after being decrypted
892 int handle_incoming_vpn_data()
896 int x, l = sizeof(x);
898 if(getsockopt(myself->socket, SOL_SOCKET, SO_ERROR, &x, &l) < 0)
900 syslog(LOG_ERR, _("This is a bug: %s:%d: %d:%m"),
901 __FILE__, __LINE__, myself->socket);
906 syslog(LOG_ERR, _("Incoming data socket error: %s"), strerror(x));
910 if(recvfrom(myself->socket, (char *) &(pkt.len), MTU, 0, NULL, NULL) <= 0)
912 syslog(LOG_ERR, _("Receiving packet failed: %m"));
921 terminate a connection and notify the other
922 end before closing the sockets
924 void terminate_connection(conn_list_t *cl)
929 if(cl->status.remove)
933 syslog(LOG_NOTICE, _("Closing connection with %s (%s)"),
934 cl->name, cl->hostname);
939 close(cl->meta_socket);
941 cl->status.remove = 1;
943 /* If this cl isn't active, don't send any DEL_HOSTs. */
945 /* FIXME: reprogram this.
946 if(cl->status.active)
947 notify_others(cl,NULL,send_del_host);
951 /* Find all connections that were lost because they were behind cl
952 (the connection that was dropped). */
954 for(p = conn_list; p != NULL; p = p->next)
956 if((p->nexthop == cl) && (p != cl))
958 if(cl->status.active && p->status.active)
959 /* FIXME: reprogram this
960 notify_others(p,cl,send_del_host);
964 p->status.active = 0;
965 p->status.remove = 1;
969 cl->status.active = 0;
971 if(cl->status.outgoing)
973 signal(SIGALRM, sigalrm_handler);
974 seconds_till_retry = 5;
975 alarm(seconds_till_retry);
976 syslog(LOG_NOTICE, _("Trying to re-establish outgoing connection in 5 seconds"));
982 Check if the other end is active.
983 If we have sent packets, but didn't receive any,
984 then possibly the other end is dead. We send a
985 PING request over the meta connection. If the other
986 end does not reply in time, we consider them dead
987 and close the connection.
989 int check_dead_connections(void)
995 for(p = conn_list; p != NULL; p = p->next)
999 if(p->status.active && p->status.meta)
1001 if(p->last_ping_time + timeout < now)
1003 if(p->status.pinged && !p->status.got_pong)
1006 syslog(LOG_INFO, _("%s (%s) didn't respond to PING"),
1007 p->name, p->hostname);
1008 p->status.timeout = 1;
1009 terminate_connection(p);
1011 else if(p->want_ping)
1014 p->last_ping_time = now;
1015 p->status.pinged = 1;
1016 p->status.got_pong = 0;
1026 accept a new tcp connect and create a
1029 int handle_new_meta_connection()
1032 struct sockaddr client;
1033 int nfd, len = sizeof(client);
1035 if((nfd = accept(myself->meta_socket, &client, &len)) < 0)
1037 syslog(LOG_ERR, _("Accepting a new connection failed: %m"));
1041 if(!(ncn = create_new_connection(nfd)))
1045 syslog(LOG_NOTICE, _("Closed attempted connection"));
1049 ncn->status.meta = 1;
1050 ncn->next = conn_list;
1057 check all connections to see if anything
1058 happened on their sockets
1060 void check_network_activity(fd_set *f)
1063 int x, l = sizeof(x);
1065 for(p = conn_list; p != NULL; p = p->next)
1067 if(p->status.remove)
1070 if(p->status.dataopen)
1071 if(FD_ISSET(p->socket, f))
1074 The only thing that can happen to get us here is apparently an
1075 error on this outgoing(!) UDP socket that isn't immediate (i.e.
1076 something that will not trigger an error directly on send()).
1077 I've once got here when it said `No route to host'.
1079 getsockopt(p->socket, SOL_SOCKET, SO_ERROR, &x, &l);
1080 syslog(LOG_ERR, _("Outgoing data socket error for %s (%s): %s"),
1081 p->name, p->hostname, strerror(x));
1082 terminate_connection(p);
1087 if(FD_ISSET(p->meta_socket, f))
1088 if(receive_meta(p) < 0)
1090 terminate_connection(p);
1095 if(FD_ISSET(myself->socket, f))
1096 handle_incoming_vpn_data();
1098 if(FD_ISSET(myself->meta_socket, f))
1099 handle_new_meta_connection();
1104 read, encrypt and send data that is
1105 available through the ethertap device
1107 void handle_tap_input(void)
1111 int ether_type, lenin;
1113 memset(&vp, 0, sizeof(vp));
1114 if((lenin = read(tap_fd, &vp, MTU)) <= 0)
1116 syslog(LOG_ERR, _("Error while reading from tapdevice: %m"));
1120 total_tap_in += lenin;
1122 ether_type = ntohs(*((unsigned short*)(&vp.data[12])));
1123 if(ether_type != 0x0800)
1126 syslog(LOG_INFO, _("Non-IP ethernet frame %04x from %02x:%02x:%02x:%02x:%02x:%02x"), ether_type, MAC_ADDR_V(vp.data[6]));
1133 syslog(LOG_INFO, _("Dropping short packet from %02x:%02x:%02x:%02x:%02x:%02x"), MAC_ADDR_V(vp.data[6]));
1137 from = ntohl(*((unsigned long*)(&vp.data[26])));
1138 to = ntohl(*((unsigned long*)(&vp.data[30])));
1140 vp.len = (length_t)lenin - 2;
1142 strip_mac_addresses(&vp);
1144 send_packet(to, &vp);
1149 this is where it all happens...
1151 void main_loop(void)
1156 time_t last_ping_check;
1158 last_ping_check = time(NULL);
1162 tv.tv_sec = timeout;
1168 if((r = select(FD_SETSIZE, &fset, NULL, NULL, &tv)) < 0)
1170 if(errno != EINTR) /* because of alarm */
1172 syslog(LOG_ERR, _("Error while waiting for input: %m"));
1180 /* FIXME: reprogram this.
1182 syslog(LOG_INFO, _("Rereading configuration file"));
1183 close_network_connections();
1185 if(read_config_file(&config, configfilename))
1187 syslog(LOG_ERR, _("Unable to reread configuration file, exiting"));
1191 setup_network_connections();
1196 if(last_ping_check + timeout < time(NULL))
1197 /* Let's check if everybody is still alive */
1199 check_dead_connections();
1200 last_ping_check = time(NULL);
1205 check_network_activity(&fset);
1207 /* local tap data */
1208 if(FD_ISSET(tap_fd, &fset))