X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprotocol_edge.c;h=0db3e7b7d04d418f14f1a5ea68cb0b7a721ab1a7;hp=4552a528b1f91f1e1186cb93f4cea459ea76fed2;hb=7e4d57adf54ce369e4111bde0ccd3ea4b9e853ee;hpb=83263b74460656ba557fd9bb84dc27258549e9cd diff --git a/src/protocol_edge.c b/src/protocol_edge.c index 4552a528..0db3e7b7 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.1.4.20 2003/07/24 12:08:16 guus Exp $ + $Id$ */ #include "system.h" @@ -95,6 +95,17 @@ bool add_edge_h(connection_t *c) /* Lookup nodes */ from = lookup_node(from_name); + to = lookup_node(to_name); + + if(tunnelserver && + from != myself && from != c->node && + to != myself && to != c->node) { + /* ignore indirect edge registrations for tunnelserver */ + ifdebug(PROTOCOL) logger(LOG_WARNING, + _("Ignoring indirect %s from %s (%s)"), + "ADD_EDGE", c->name, c->hostname); + return true; + } if(!from) { from = new_node(); @@ -102,14 +113,13 @@ bool add_edge_h(connection_t *c) node_add(from); } - to = lookup_node(to_name); - if(!to) { to = new_node(); to->name = xstrdup(to_name); node_add(to); } + /* Convert addresses */ address = str2sockaddr(to_address, to_port); @@ -154,7 +164,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? */ @@ -206,6 +217,17 @@ bool del_edge_h(connection_t *c) /* Lookup nodes */ from = lookup_node(from_name); + to = lookup_node(to_name); + + if(tunnelserver && + from != myself && from != c->node && + to != myself && to != c->node) { + /* ignore indirect edge registrations for tunnelserver */ + ifdebug(PROTOCOL) logger(LOG_WARNING, + _("Ignoring indirect %s from %s (%s)"), + "DEL_EDGE", c->name, c->hostname); + return true; + } if(!from) { ifdebug(PROTOCOL) logger(LOG_ERR, _("Got %s from %s (%s) which does not appear in the edge tree"), @@ -213,8 +235,6 @@ bool del_edge_h(connection_t *c) return true; } - to = lookup_node(to_name); - if(!to) { ifdebug(PROTOCOL) logger(LOG_ERR, _("Got %s from %s (%s) which does not appear in the edge tree"), "DEL_EDGE", c->name, c->hostname); @@ -240,7 +260,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 +271,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; }