X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprotocol_edge.c;h=c6a6a2a8165321fecb876d46b227aa62c44dcaf5;hp=300333b6b42b9567bbc21f4d21c903267982616d;hb=0770cad1fb4d648a2626b0f943714134fe669e5a;hpb=5cbddc68bade0d1f8ded1b784bb27bb44c5dc5dc diff --git a/src/protocol_edge.c b/src/protocol_edge.c index 300333b6..c6a6a2a8 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-2005 Ivo Timmermans, - 2000-2009 Guus Sliepen + 2000-2012 Guus Sliepen 2009 Michael Tokarev This program is free software; you can redistribute it and/or modify @@ -125,14 +125,25 @@ bool add_edge_h(connection_t *c) { } else { ifdebug(PROTOCOL) logger(LOG_WARNING, "Got %s from %s (%s) which does not match existing entry", "ADD_EDGE", c->name, c->hostname); - edge_del(e); - graph(); + e->options = options; + if(sockaddrcmp(&e->address, &address)) { + sockaddrfree(&e->address); + e->address = address; + } + if(e->weight != weight) { + avl_node_t *node = avl_unlink(edge_weight_tree, e); + e->weight = weight; + avl_insert_node(edge_weight_tree, node); + } + + goto done; } } else return true; } else if(from == myself) { ifdebug(PROTOCOL) logger(LOG_WARNING, "Got %s from %s (%s) for ourself which does not exist", "ADD_EDGE", c->name, c->hostname); + contradicting_add_edge++; e = new_edge(); e->from = from; e->to = to; @@ -149,6 +160,7 @@ bool add_edge_h(connection_t *c) { e->weight = weight; edge_add(e); +done: /* Tell the rest about the new edge */ if(!tunnelserver) @@ -229,6 +241,7 @@ bool del_edge_h(connection_t *c) { if(e->from == myself) { ifdebug(PROTOCOL) logger(LOG_WARNING, "Got %s from %s (%s) for ourself", "DEL_EDGE", c->name, c->hostname); + contradicting_del_edge++; send_add_edge(c, e); /* Send back a correction */ return true; } @@ -252,7 +265,7 @@ bool del_edge_h(connection_t *c) { e = lookup_edge(to, myself); if(e) { if(!tunnelserver) - send_del_edge(broadcast, e); + send_del_edge(everyone, e); edge_del(e); } }