From: Guus Sliepen Date: Sat, 21 Jul 2001 15:34:18 +0000 (+0000) Subject: Updated terminate_connection() so you can choose if DEL_HOSTs should be X-Git-Tag: release-1.0pre5~92 X-Git-Url: https://tinc-vpn.org/git/browse?a=commitdiff_plain;h=acb853205d6d582d919c59879393b301ad4f4fde;p=tinc Updated terminate_connection() so you can choose if DEL_HOSTs should be sent or not. --- diff --git a/src/connection.c b/src/connection.c index fa2f81d7..29034f5a 100644 --- a/src/connection.c +++ b/src/connection.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: connection.c,v 1.1.2.14 2001/07/20 20:25:10 guus Exp $ + $Id: connection.c,v 1.1.2.15 2001/07/21 15:34:18 guus Exp $ */ #include "config.h" @@ -172,7 +172,6 @@ cp { avl_delete(id_tree, cl); avl_delete(active_tree, cl); - cl->status.active = 0; } cp } diff --git a/src/net.c b/src/net.c index 00fbdc5a..f0e80b79 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.123 2001/07/20 20:25:10 guus Exp $ + $Id: net.c,v 1.35.4.124 2001/07/21 15:34:18 guus Exp $ */ #include "config.h" @@ -247,7 +247,7 @@ cp if((cl->options | myself->options) & OPTION_TCPONLY) { if(send_tcppacket(cl, packet)) - terminate_connection(cl); + terminate_connection(cl, 1); } else send_udppacket(cl, packet); @@ -1009,10 +1009,10 @@ cp next = node->next; p = (connection_t *)node->data; p->status.outgoing = 0; - terminate_connection(p); + terminate_connection(p, 0); } - terminate_connection(myself); + terminate_connection(myself, 0); destroy_trees(); @@ -1136,8 +1136,9 @@ cp - Remove associated hosts and subnets - Deactivate the host - Since it might still be referenced, put it on the prune list. + - If report == 1, then send DEL_HOST messages to the other tinc daemons. */ -void terminate_connection(connection_t *cl) +void terminate_connection(connection_t *cl, int report) { connection_t *p; subnet_t *subnet; @@ -1151,6 +1152,8 @@ cp if(cl->socket) close(cl->socket); + connection_del(cl); + if(cl->status.meta) { if(debug_lvl >= DEBUG_CONNECTIONS) @@ -1159,27 +1162,30 @@ cp close(cl->meta_socket); - /* Find all connections that were lost because they were behind cl - (the connection that was dropped). */ + if(cl->status.active) + { + /* Find all connections that were lost because they were behind cl + (the connection that was dropped). */ - for(node = active_tree->head; node; node = next) - { - next = node->next; - p = (connection_t *)node->data; - if(p->nexthop == cl && p != cl) - terminate_connection(p); - } + for(node = active_tree->head; node; node = next) + { + next = node->next; + p = (connection_t *)node->data; + if(p->nexthop == cl) + terminate_connection(p, report); + } + } + } - /* Inform others of termination if it was still active */ + /* Inform others of termination if needed */ - if(cl->status.active) - for(node = connection_tree->head; node; node = node->next) - { - p = (connection_t *)node->data; - if(p->status.active && p != cl) - send_del_host(p, cl); /* Sounds like recursion, but p does not have a meta connection :) */ - } - } + if(report) + for(node = connection_tree->head; node; node = node->next) + { + p = (connection_t *)node->data; + if(p->status.active) + send_del_host(p, cl); /* Sounds like recursion, but p does not have a meta connection :) */ + } /* Remove the associated subnets */ @@ -1203,7 +1209,6 @@ cp /* Schedule it for pruning */ prune_add(cl); - connection_del(cl); } /* @@ -1235,7 +1240,7 @@ cp syslog(LOG_INFO, _("%s (%s) didn't respond to PING"), cl->name, cl->hostname); cl->status.timeout = 1; - terminate_connection(cl); + terminate_connection(cl, 1); } else { @@ -1300,7 +1305,7 @@ cp if(FD_ISSET(p->meta_socket, f)) if(receive_meta(p) < 0) { - terminate_connection(p); + terminate_connection(p, 1); return; } } diff --git a/src/net.h b/src/net.h index 75d59df2..7c178416 100644 --- a/src/net.h +++ b/src/net.h @@ -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.h,v 1.9.4.33 2001/06/08 18:02:10 guus Exp $ + $Id: net.h,v 1.9.4.34 2001/07/21 15:34:18 guus Exp $ */ #ifndef __TINC_NET_H__ @@ -115,7 +115,7 @@ extern void broadcast_packet(connection_t *, vpn_packet_t *); extern int setup_network_connections(void); extern void close_network_connections(void); extern void main_loop(void); -extern void terminate_connection(connection_t *); +extern void terminate_connection(connection_t *, int); extern void flush_queue(connection_t *); #include diff --git a/src/protocol.c b/src/protocol.c index d0dd9f78..10046d17 100644 --- a/src/protocol.c +++ b/src/protocol.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: protocol.c,v 1.28.4.102 2001/07/20 20:25:10 guus Exp $ + $Id: protocol.c,v 1.28.4.103 2001/07/21 15:34:18 guus Exp $ */ #include "config.h" @@ -245,7 +245,7 @@ cp cl->status.outgoing = 1; old->status.outgoing = 0; } - terminate_connection(old); + terminate_connection(old, 0); return 0; } @@ -829,7 +829,7 @@ cp if((old = lookup_id(name))) { - if((new->address == old->address) && (new->port == old->port)) + if((new->address == old->address) && (new->port == old->port) && (cl == old->nexthop)) { if(debug_lvl >= DEBUG_CONNECTIONS) syslog(LOG_NOTICE, _("Got duplicate ADD_HOST for %s (%s) from %s (%s)"), @@ -843,7 +843,7 @@ cp syslog(LOG_NOTICE, _("Removing old entry for %s (%s) in favour of new connection"), old->name, old->hostname); - terminate_connection(old); + terminate_connection(old, 0); } } @@ -933,7 +933,7 @@ cp /* Ok, since EVERYTHING seems to check out all right, delete it */ - terminate_connection(old); + terminate_connection(old, 0); /* Tell the rest about the deleted host */ @@ -1006,7 +1006,7 @@ cp cl->name, cl->hostname, strerror(err), errorstring); } - terminate_connection(cl); + terminate_connection(cl, 1); cp return 0; } @@ -1020,7 +1020,7 @@ cp int termreq_h(connection_t *cl) { cp - terminate_connection(cl); + terminate_connection(cl, 1); cp return 0; }