From: Guus Sliepen Date: Sat, 16 Jul 2011 08:47:35 +0000 (+0200) Subject: Make code to detect two nodes with the same Name less triggerhappy. X-Git-Tag: release-1.0.16~3 X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=commitdiff_plain;h=be2fc8b0458b1e2ced3b5de410356d8d8639acff;hp=05260f941c2a24eb3f09070a2550cf15e431266a 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. --- 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!"); - - 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; + /* 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(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) {