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"
if((cl->options | myself->options) & OPTION_TCPONLY)
{
if(send_tcppacket(cl, packet))
- terminate_connection(cl);
+ terminate_connection(cl, 1);
}
else
send_udppacket(cl, packet);
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();
- 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;
if(cl->socket)
close(cl->socket);
+ connection_del(cl);
+
if(cl->status.meta)
{
if(debug_lvl >= DEBUG_CONNECTIONS)
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 */
/* Schedule it for pruning */
prune_add(cl);
- connection_del(cl);
}
/*
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
{
if(FD_ISSET(p->meta_socket, f))
if(receive_meta(p) < 0)
{
- terminate_connection(p);
+ terminate_connection(p, 1);
return;
}
}
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__
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 <config.h>
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"
cl->status.outgoing = 1;
old->status.outgoing = 0;
}
- terminate_connection(old);
+ terminate_connection(old, 0);
return 0;
}
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)"),
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);
}
}
/* 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 */
cl->name, cl->hostname, strerror(err), errorstring);
}
- terminate_connection(cl);
+ terminate_connection(cl, 1);
cp
return 0;
}
int termreq_h(connection_t *cl)
{
cp
- terminate_connection(cl);
+ terminate_connection(cl, 1);
cp
return 0;
}