/*
protocol_edge.c -- handle the meta-protocol, edges
- Copyright (C) 1999-2003 Ivo Timmermans <ivo@o2w.nl>,
- 2000-2003 Guus Sliepen <guus@sliepen.eu.org>
+ Copyright (C) 1999-2005 Ivo Timmermans,
+ 2000-2006 Guus Sliepen <guus@tinc-vpn.org>
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
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.21 2003/08/28 15:27:12 guus Exp $
+ $Id$
*/
#include "system.h"
sockaddr2str(&e->address, &address, &port);
- x = send_request(c, "%d %lx %s %s %s %s %lx %d", ADD_EDGE, random(),
+ x = send_request(c, "%d %x %s %s %s %s %lx %d", ADD_EDGE, rand(),
e->from->name, e->to->name, address, port,
e->options, e->weight);
free(address);
/* 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();
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);
/* Tell the rest about the new edge */
- forward_request(c);
+ if(!tunnelserver)
+ forward_request(c);
/* Run MST before or after we tell the rest? */
{
cp();
- return send_request(c, "%d %lx %s %s", DEL_EDGE, random(),
+ return send_request(c, "%d %x %s %s", DEL_EDGE, rand(),
e->from->name, e->to->name);
}
/* 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"),
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);
/* Tell the rest about the deleted edge */
- forward_request(c);
+ if(!tunnelserver)
+ forward_request(c);
/* Delete the edge */
if(!to->status.reachable) {
e = lookup_edge(to, myself);
if(e) {
- send_del_edge(broadcast, e);
+ if(!tunnelserver)
+ send_del_edge(broadcast, e);
edge_del(e);
}
}