X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fprotocol_edge.c;h=df39bb977a6b8793307c4cdb64ad4cabf0119158;hb=f02d3ed3e135b5326003e7f69f8331ff6a3cc219;hp=4d4276abd1271c3e2352f3727001f8118f412a35;hpb=013a2e159e42c46808ea8d0b6abd57525db30a50;p=tinc diff --git a/src/protocol_edge.c b/src/protocol_edge.c index 4d4276ab..df39bb97 100644 --- a/src/protocol_edge.c +++ b/src/protocol_edge.c @@ -1,7 +1,7 @@ /* protocol_edge.c -- handle the meta-protocol, edges - Copyright (C) 1999-2003 Ivo Timmermans , - 2000-2003 Guus Sliepen + Copyright (C) 1999-2005 Ivo Timmermans, + 2000-2006 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: protocol_edge.c,v 1.4 2003/08/24 20:38:27 guus Exp $ + $Id$ */ #include "system.h" @@ -36,8 +36,7 @@ #include "utils.h" #include "xalloc.h" -bool send_add_edge(connection_t *c, const edge_t *e) -{ +bool send_add_edge(connection_t *c, const edge_t *e) { bool x; char *address, *port; @@ -54,8 +53,7 @@ bool send_add_edge(connection_t *c, const edge_t *e) return x; } -bool add_edge_h(connection_t *c) -{ +bool add_edge_h(connection_t *c) { edge_t *e; node_t *from, *to; char from_name[MAX_STRING_SIZE]; @@ -110,6 +108,9 @@ bool add_edge_h(connection_t *c) node_add(to); } + if(tunnelserver && from != myself && from != c->node && to != myself && to != c->node) + return false; + /* Convert addresses */ address = str2sockaddr(to_address, to_port); @@ -154,7 +155,8 @@ bool add_edge_h(connection_t *c) /* Tell the rest about the new edge */ - forward_request(c); + if(!tunnelserver) + forward_request(c); /* Run MST before or after we tell the rest? */ @@ -163,16 +165,14 @@ bool add_edge_h(connection_t *c) return true; } -bool send_del_edge(connection_t *c, const edge_t *e) -{ +bool send_del_edge(connection_t *c, const edge_t *e) { cp(); return send_request(c, "%d %lx %s %s", DEL_EDGE, random(), e->from->name, e->to->name); } -bool del_edge_h(connection_t *c) -{ +bool del_edge_h(connection_t *c) { edge_t *e; char from_name[MAX_STRING_SIZE]; char to_name[MAX_STRING_SIZE]; @@ -221,6 +221,9 @@ bool del_edge_h(connection_t *c) return true; } + if(tunnelserver && from != myself && from != c->node && to != myself && to != c->node) + return false; + /* Check if edge exists */ e = lookup_edge(from, to); @@ -240,7 +243,8 @@ bool del_edge_h(connection_t *c) /* Tell the rest about the deleted edge */ - forward_request(c); + if(!tunnelserver) + forward_request(c); /* Delete the edge */ @@ -250,5 +254,16 @@ bool del_edge_h(connection_t *c) graph(); + /* If the node is not reachable anymore but we remember it had an edge to us, clean it up */ + + if(!to->status.reachable) { + e = lookup_edge(to, myself); + if(e) { + if(!tunnelserver) + send_del_edge(broadcast, e); + edge_del(e); + } + } + return true; }