From 2f8719741e6de14539e31173f1acd9efae0b8a2e Mon Sep 17 00:00:00 2001 From: David Crawshaw Date: Thu, 2 Apr 2020 11:18:39 +1100 Subject: [PATCH] controlclient: do not send duplicate hostinfo/netinfo This should never happen, so log when it does so we can fix it. Signed-off-by: David Crawshaw --- control/controlclient/auto.go | 14 ++++++++++++-- control/controlclient/direct.go | 21 ++++++++++++++------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/control/controlclient/auto.go b/control/controlclient/auto.go index ce49ad0ec..831b736cb 100644 --- a/control/controlclient/auto.go +++ b/control/controlclient/auto.go @@ -496,7 +496,12 @@ func (c *Client) SetHostinfo(hi *tailcfg.Hostinfo) { if hi == nil { panic("nil Hostinfo") } - c.direct.SetHostinfo(hi) + if !c.direct.SetHostinfo(hi) { + c.logf("[unexpected] duplicate Hostinfo: %v", hi) + return + } + c.logf("Hostinfo: %v", hi) + // Send new Hostinfo to server c.cancelMapSafely() } @@ -505,7 +510,12 @@ func (c *Client) SetNetInfo(ni *tailcfg.NetInfo) { if ni == nil { panic("nil NetInfo") } - c.direct.SetNetInfo(ni) + if !c.direct.SetNetInfo(ni) { + c.logf("[unexpected] duplicate NetInfo: %v", ni) + return + } + c.logf("NetInfo: %v", ni) + // Send new Hostinfo (which includes NetInfo) to server c.cancelMapSafely() } diff --git a/control/controlclient/direct.go b/control/controlclient/direct.go index a8c8b460f..56a8f30c0 100644 --- a/control/controlclient/direct.go +++ b/control/controlclient/direct.go @@ -17,6 +17,7 @@ import ( "log" "net/http" "os" + "reflect" "strconv" "strings" "sync" @@ -149,21 +150,24 @@ func NewHostinfo() *tailcfg.Hostinfo { } // SetHostinfo clones the provided Hostinfo and remembers it for the -// next update. -func (c *Direct) SetHostinfo(hi *tailcfg.Hostinfo) { +// next update. It reports whether the Hostinfo has changed. +func (c *Direct) SetHostinfo(hi *tailcfg.Hostinfo) bool { if hi == nil { panic("nil Hostinfo") } c.mu.Lock() defer c.mu.Unlock() - c.logf("Hostinfo: %v\n", hi) + if hi.Equal(c.hostinfo) { + return false + } c.hostinfo = hi.Clone() + return true } // SetNetInfo clones the provided NetInfo and remembers it for the -// next update. -func (c *Direct) SetNetInfo(ni *tailcfg.NetInfo) { +// next update. It reports whether the NetInfo has changed. +func (c *Direct) SetNetInfo(ni *tailcfg.NetInfo) bool { if ni == nil { panic("nil NetInfo") } @@ -172,10 +176,13 @@ func (c *Direct) SetNetInfo(ni *tailcfg.NetInfo) { if c.hostinfo == nil { c.logf("[unexpected] SetNetInfo called with no HostInfo; ignoring NetInfo update: %+v", ni) - return + return false + } + if reflect.DeepEqual(ni, c.hostinfo.NetInfo) { + return false } - c.logf("NetInfo: %v\n", ni) c.hostinfo.NetInfo = ni.Clone() + return true } func (c *Direct) GetPersist() Persist {