X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fnet.c;h=0b617bd08ac3bffaf420c570eb56de7563607f26;hp=81a0d894daaf8f818a8139c72404be5f40a7ea5f;hb=5dde6461a321ee47b06e33f8203f2acf00a31a51;hpb=0200d3cd5d773d9b101c33264532d2a301c2af32 diff --git a/src/net.c b/src/net.c index 81a0d894..0b617bd0 100644 --- a/src/net.c +++ b/src/net.c @@ -1,7 +1,7 @@ /* net.c -- most of the network code Copyright (C) 1998-2005 Ivo Timmermans, - 2000-2006 Guus Sliepen + 2000-2009 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -13,11 +13,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - $Id$ + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "system.h" @@ -48,8 +46,7 @@ time_t now = 0; /* Purge edges and subnets of unreachable nodes. Use carefully. */ -static void purge(void) -{ +static void purge(void) { avl_node_t *nnode, *nnext, *enode, *enext, *snode, *snext; node_t *n; edge_t *e; @@ -112,8 +109,7 @@ static void purge(void) put all file descriptors in an fd_set array While we're at it, purge stuff that needs to be removed. */ -static int build_fdset(fd_set *readset, fd_set *writeset) -{ +static int build_fdset(fd_set *readset, fd_set *writeset) { avl_node_t *node, *next; connection_t *c; int i, max = 0; @@ -149,7 +145,8 @@ static int build_fdset(fd_set *readset, fd_set *writeset) max = listen_socket[i].udp; } - FD_SET(device_fd, readset); + if(device_fd >= 0) + FD_SET(device_fd, readset); if(device_fd > max) max = device_fd; @@ -163,8 +160,7 @@ static int build_fdset(fd_set *readset, fd_set *writeset) - Check if we need to retry making an outgoing connection - Deactivate the host */ -void terminate_connection(connection_t *c, bool report) -{ +void terminate_connection(connection_t *c, bool report) { cp(); if(c->status.remove) @@ -227,8 +223,7 @@ void terminate_connection(connection_t *c, bool report) end does not reply in time, we consider them dead and close the connection. */ -static void check_dead_connections(void) -{ +static void check_dead_connections(void) { avl_node_t *node, *next; connection_t *c; @@ -251,7 +246,7 @@ static void check_dead_connections(void) } else { if(c->status.remove) { logger(LOG_WARNING, _("Old connection_t for %s (%s) status %04x still lingering, deleting..."), - c->name, c->hostname, c->status.value); + c->name, c->hostname, bitfield_to_int(&c->status, sizeof c->status)); connection_del(c); continue; } @@ -283,8 +278,7 @@ static void check_dead_connections(void) check all connections to see if anything happened on their sockets */ -static void check_network_activity(fd_set * readset, fd_set * writeset) -{ +static void check_network_activity(fd_set * readset, fd_set * writeset) { connection_t *c; avl_node_t *node; int result, i; @@ -294,9 +288,11 @@ static void check_network_activity(fd_set * readset, fd_set * writeset) cp(); /* check input from kernel */ - if(FD_ISSET(device_fd, readset)) { - if(read_packet(&packet)) + if(device_fd >= 0 && FD_ISSET(device_fd, readset)) { + if(read_packet(&packet)) { + packet.priority = 0; route(myself, &packet); + } } /* check meta connections */ @@ -349,8 +345,7 @@ static void check_network_activity(fd_set * readset, fd_set * writeset) /* this is where it all happens... */ -int main_loop(void) -{ +int main_loop(void) { fd_set readset, writeset; struct timeval tv; int r, maxfd; @@ -376,7 +371,13 @@ int main_loop(void) maxfd = build_fdset(&readset, &writeset); +#ifdef HAVE_MINGW + LeaveCriticalSection(&mutex); +#endif r = select(maxfd + 1, &readset, &writeset, NULL, &tv); +#ifdef HAVE_MINGW + EnterCriticalSection(&mutex); +#endif if(r < 0) { if(errno != EINTR && errno != EAGAIN) { @@ -411,33 +412,35 @@ int main_loop(void) /* Should we regenerate our key? */ if(keyexpires < now) { - ifdebug(STATUS) logger(LOG_INFO, _("Regenerating symmetric key")); + avl_node_t *node; + node_t *n; + + ifdebug(STATUS) logger(LOG_INFO, _("Expiring symmetric keys")); + + for(node = node_tree->head; node; node = node->next) { + n = node->data; + if(n->inkey) { + free(n->inkey); + n->inkey = NULL; + } + } - RAND_pseudo_bytes((unsigned char *)myself->key, myself->keylength); - if(myself->cipher) - EVP_DecryptInit_ex(&packet_ctx, myself->cipher, NULL, (unsigned char *)myself->key, (unsigned char *)myself->key + myself->cipher->key_len); send_key_changed(broadcast, myself); keyexpires = now + keylifetime; } } - - while((event = get_expired_event())) { - event->handler(event->data); - free(event); - } - if(sigalrm) { logger(LOG_INFO, _("Flushing event queue")); - - while(event_tree->head) { - event = event_tree->head->data; - event->handler(event->data); - event_del(event); - } + expire_events(); sigalrm = false; } + while((event = get_expired_event())) { + event->handler(event->data); + free_event(event); + } + if(sighup) { connection_t *c; avl_node_t *node; @@ -461,14 +464,7 @@ int main_loop(void) for(node = connection_tree->head; node; node = node->next) { c = node->data; - if(c->outgoing) { - free(c->outgoing->name); - freeaddrinfo(c->outgoing->ai); - free(c->outgoing); - c->outgoing = NULL; - } - - asprintf(&fname, "%s/hosts/%s", confbase, c->name); + xasprintf(&fname, "%s/hosts/%s", confbase, c->name); if(stat(fname, &s) || s.st_mtime > last_config_check) terminate_connection(c, c->status.active); free(fname);