X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;ds=sidebyside;f=src%2Fnet.c;h=b0bfaca3a0c1489222075ded4d8e574981188f93;hb=5fc1ed17f41f0c535cf57a4b7e00cd6d45759503;hp=30c73d90a647e5df15f589b3304a441391768aa9;hpb=97d492d9e23f43fe4c8a5ca8c95747088cf32f98;p=tinc diff --git a/src/net.c b/src/net.c index 30c73d90..b0bfaca3 100644 --- a/src/net.c +++ b/src/net.c @@ -1,7 +1,7 @@ /* net.c -- most of the network code - Copyright (C) 1998-2002 Ivo Timmermans , - 2000-2002 Guus Sliepen + Copyright (C) 1998-2002 Ivo Timmermans , + 2000-2002 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 @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: net.c,v 1.35.4.170 2002/04/18 20:09:05 zarq Exp $ + $Id: net.c,v 1.35.4.179 2002/09/09 19:39:58 guus Exp $ */ #include "config.h" @@ -26,8 +26,13 @@ #include #include #include -#ifdef HAVE_LINUX +#ifdef HAVE_NETINET_IN_SYSTM_H + #include +#endif +#ifdef HAVE_NETINET_IP_H #include +#endif +#ifdef HAVE_NETINET_TCP_H #include #endif #include @@ -82,12 +87,11 @@ time_t now = 0; void purge(void) { - avl_node_t *nnode, *nnext, *enode, *enext, *snode, *snext, *cnode; + avl_node_t *nnode, *nnext, *enode, *enext, *snode, *snext; node_t *n; edge_t *e; subnet_t *s; - connection_t *c; -cp + cp(); if(debug_lvl >= DEBUG_PROTOCOL) syslog(LOG_DEBUG, _("Purging unreachable nodes")); @@ -105,14 +109,7 @@ cp { snext = snode->next; s = (subnet_t *)snode->data; - - for(cnode = connection_tree->head; cnode; cnode = cnode->next) - { - c = (connection_t *)cnode->data; - if(c->status.active) - send_del_subnet(c, s); - } - + send_del_subnet(broadcast, s); subnet_del(n, s); } @@ -120,21 +117,14 @@ cp { enext = enode->next; e = (edge_t *)enode->data; - - for(cnode = connection_tree->head; cnode; cnode = cnode->next) - { - c = (connection_t *)cnode->data; - if(c->status.active) - send_del_edge(c, e); - } - + send_del_edge(broadcast, e); edge_del(e); } node_del(n); } } -cp + cp(); } /* @@ -146,7 +136,7 @@ void build_fdset(fd_set *fs) avl_node_t *node, *next; connection_t *c; int i; -cp + cp(); FD_ZERO(fs); for(node = connection_tree->head; node; node = next) @@ -155,14 +145,15 @@ cp c = (connection_t *)node->data; if(c->status.remove) - connection_del(c); + { + connection_del(c); + if(!connection_tree->head) + purge(); + } else FD_SET(c->socket, fs); } - if(!connection_tree->head) - purge(); - for(i = 0; i < listen_sockets; i++) { FD_SET(listen_socket[i].tcp, fs); @@ -170,7 +161,7 @@ cp } FD_SET(device_fd, fs); -cp + cp(); } /* @@ -182,9 +173,7 @@ cp */ void terminate_connection(connection_t *c, int report) { - avl_node_t *node; - connection_t *other; -cp + cp(); if(c->status.remove) return; @@ -204,14 +193,7 @@ cp if(c->edge) { if(report) - { - for(node = connection_tree->head; node; node = node->next) - { - other = (connection_t *)node->data; - if(other->status.active && other != c) - send_del_edge(other, c->edge); - } - } + send_del_edge(broadcast, c->edge); edge_del(c->edge); @@ -227,7 +209,7 @@ cp retry_outgoing(c->outgoing); c->outgoing = NULL; } -cp + cp(); } /* @@ -242,7 +224,7 @@ void check_dead_connections(void) { avl_node_t *node, *next; connection_t *c; -cp + cp(); for(node = connection_tree->head; node; node = next) { next = node->next; @@ -266,6 +248,12 @@ cp } else { + if(c->status.remove) + { + syslog(LOG_WARNING, _("Old connection_t for %s (%s) status %04x still lingering, deleting..."), c->name, c->hostname, c->status); + connection_del(c); + continue; + } if(debug_lvl >= DEBUG_CONNECTIONS) syslog(LOG_WARNING, _("Timeout from %s (%s) during authentication"), c->name, c->hostname); @@ -273,7 +261,7 @@ cp } } } -cp + cp(); } /* @@ -287,7 +275,7 @@ void check_network_activity(fd_set *f) int result, i; int len = sizeof(result); vpn_packet_t packet; -cp + cp(); if(FD_ISSET(device_fd, f)) { if(!read_packet(&packet)) @@ -333,7 +321,7 @@ cp if(FD_ISSET(listen_socket[i].tcp, f)) handle_new_meta_connection(listen_socket[i].tcp); } -cp + cp(); } /* @@ -346,7 +334,7 @@ void main_loop(void) int r; time_t last_ping_check; event_t *event; -cp + cp(); last_ping_check = now; srand(now); @@ -360,7 +348,9 @@ cp build_fdset(&fset); - if((r = select(FD_SETSIZE, &fset, NULL, NULL, &tv)) < 0) + r = select(FD_SETSIZE, &fset, NULL, NULL, &tv); + + if(r < 0) { if(errno != EINTR && errno != EAGAIN) { @@ -401,7 +391,7 @@ cp syslog(LOG_INFO, _("Regenerating symmetric key")); RAND_pseudo_bytes(myself->key, myself->keylength); - send_key_changed(myself->connection, myself); + send_key_changed(broadcast, myself); keyexpires = now + keylifetime; } } @@ -449,5 +439,5 @@ cp continue; } } -cp + cp(); }