From be2fc8b0458b1e2ced3b5de410356d8d8639acff Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Sat, 16 Jul 2011 10:47:35 +0200 Subject: [PATCH] Make code to detect two nodes with the same Name less triggerhappy. First of all, if there really are two nodes with the same name, much more than 10 contradicting ADD_EDGE and DEL_EDGE messages will be sent. Also, we forgot to reset the counters when nothing happened. In case there is a ADD_EDGE/DEL_EDGE storm, we do not shut down, but sleep an increasing amount of time, allowing tinc to recover gracefully from temporary failures. --- src/net.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/net.c b/src/net.c index c5193c5d..b3f924ad 100644 --- a/src/net.c +++ b/src/net.c @@ -50,6 +50,7 @@ bool graph_dump = false; time_t now = 0; int contradicting_add_edge = 0; int contradicting_del_edge = 0; +static int sleeptime = 10; /* Purge edges and subnets of unreachable nodes. Use carefully. */ @@ -464,18 +465,25 @@ int main_loop(void) { keyexpires = now + keylifetime; } - if(contradicting_del_edge > 10 && contradicting_add_edge > 10) { - logger(LOG_WARNING, "Possible node with same Name as us!"); + /* Detect ADD_EDGE/DEL_EDGE storms that are caused when + * two tinc daemons with the same name are on the VPN. + * If so, sleep a while. If this happens multiple times + * in a row, sleep longer. */ - if(rand() % 3 == 0) { - logger(LOG_ERR, "Shutting down, check configuration of all nodes for duplicate Names!"); - running = false; - break; - } - - contradicting_add_edge = 0; - contradicting_del_edge = 0; + if(contradicting_del_edge > 100 && contradicting_add_edge > 100) { + logger(LOG_WARNING, "Possible node with same Name as us! Sleeping %d seconds.", sleeptime); + sleep(sleeptime); + sleeptime *= 2; + if(sleeptime < 0) + sleeptime = 3600; + } else { + sleeptime /= 2; + if(sleeptime < 10) + sleeptime = 10; } + + contradicting_add_edge = 0; + contradicting_del_edge = 0; } if(sigalrm) {