From 71150fcb8697d936a0c5f41337d8526aed744a4f Mon Sep 17 00:00:00 2001 From: Arceliar Date: Sat, 17 Feb 2018 23:57:24 -0600 Subject: [PATCH] ignore root tstamp updates if we just updated, to throttle the rate at which updates (and new signatures) can propagate --- src/yggdrasil/switch.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/yggdrasil/switch.go b/src/yggdrasil/switch.go index e24217d..a297e89 100644 --- a/src/yggdrasil/switch.go +++ b/src/yggdrasil/switch.go @@ -11,11 +11,6 @@ package yggdrasil // TODO? use a pre-computed lookup table (python version had this) // A little annoying to do with constant changes from bandwidth estimates -// FIXME (!) throttle how often root updates are accepted -// If the root starts spaming with new timestamps, it should only affect their neighbors -// The rest of the network should see announcements at a somewhat reasonable rate -// Maybe no faster than 2x the usual update interval - import "time" import "sync" import "sync/atomic" @@ -23,6 +18,8 @@ import "sync/atomic" //import "fmt" const switch_timeout = time.Minute +const switch_updateInterval = switch_timeout / 2 +const switch_throttle = switch_updateInterval / 2 // You should be able to provide crypto signatures for this // 1 signature per coord, from the *sender* to that coord @@ -219,7 +216,7 @@ func (t *switchTable) cleanRoot() { } // Or, if we are the root, possibly update our timestamp if t.data.locator.root == t.key && - now.Sub(t.time) > switch_timeout/2 { + now.Sub(t.time) > switch_updateInterval { //fmt.Println("root is self and old, updating", t.data.locator.Root) doUpdate = true } @@ -343,9 +340,11 @@ func (t *switchTable) handleMessage(msg *switchMessage, fromPort switchPort, sig updateRoot = true case cost < pCost: updateRoot = true - case sender.port == t.parent && - (msg.locator.tstamp > t.data.locator.tstamp || - !equiv(&msg.locator, &t.data.locator)): + case sender.port != t.parent: // do nothing + case !equiv(&msg.locator, &t.data.locator): + updateRoot = true + case now.Sub(t.time) < switch_throttle: // do nothing + case msg.locator.tstamp > t.data.locator.tstamp: updateRoot = true } if updateRoot {