X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fnet.c;h=ca70886ff7d41a97ef3f47e79d5f0e255e6aff1d;hp=2a072d8094474393aeac59be5f4ce3cd33509912;hb=d134c4542d4e890e1c1007f32b866742319853c5;hpb=856de4c5fe8acd779aa9277d4554e34ff3625e97 diff --git a/src/net.c b/src/net.c index 2a072d80..ca70886f 100644 --- a/src/net.c +++ b/src/net.c @@ -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.174 2002/06/21 10:11:12 guus Exp $ + $Id: net.c,v 1.35.4.175 2002/09/03 20:43:25 guus Exp $ */ #include "config.h" @@ -65,7 +65,6 @@ #include "process.h" #include "protocol.h" #include "subnet.h" -#include "graph.h" #include "process.h" #include "route.h" #include "device.h" @@ -83,13 +82,12 @@ int sigalrm = 0; time_t now = 0; -/* Purge edges and subnets of unreachable nodes. Use carefully. */ +/* Purge subnets of unreachable nodes. Use carefully. */ void purge(void) { - avl_node_t *nnode, *nnext, *enode, *enext, *snode, *snext, *cnode; + avl_node_t *nnode, *nnext, *snode, *snext, *cnode; node_t *n; - edge_t *e; subnet_t *s; connection_t *c; cp @@ -121,21 +119,6 @@ cp subnet_del(n, s); } - for(enode = n->edge_tree->head; enode; enode = enext) - { - 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); - } - - edge_del(e); - } - node_del(n); } } @@ -182,14 +165,15 @@ cp /* Terminate a connection: - Close the socket - - Remove associated edge and tell other connections about it if report = 1 + - Tell other connections about it if report = 1 - Check if we need to retry making an outgoing connection - Deactivate the host */ void terminate_connection(connection_t *c, int report) { - avl_node_t *node; + avl_node_t *node, *node2; connection_t *other; + node_t *n; cp if(c->status.remove) return; @@ -202,30 +186,31 @@ cp c->status.active = 0; if(c->node) - c->node->connection = NULL; - - if(c->socket) - close(c->socket); - - if(c->edge) { - if(report) + if(report && c->node->connection) { 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); + if(other == c) + continue; + for(node2 = node_tree->head; node2; node2 = node2->next) + { + n = (node_t *)node2->data; + if(n->nexthop == c->node) + { + send_del_node(other, n); + n->status.reachable = 0; + } + } } } - - edge_del(c->edge); - - /* Run MST and SSSP algorithms */ - - graph(); + c->node->connection = NULL; } + if(c->socket) + close(c->socket); + /* Check if this was our outgoing connection */ if(c->outgoing) @@ -246,14 +231,13 @@ cp */ void check_dead_connections(void) { - avl_node_t *node, *next; + avl_node_t *node; connection_t *c; cp - for(node = connection_tree->head; node; node = next) + for(node = connection_tree->head; node; node = node->next) { - next = node->next; c = (connection_t *)node->data; - if(c->last_ping_time + pingtimeout < now) + if(c->last_ping_time + pingtimeout < now && !c->status.remove) { if(c->status.active) {