diff --git a/control/controlclient/auto.go b/control/controlclient/auto.go index b087e1444..452d24c26 100644 --- a/control/controlclient/auto.go +++ b/control/controlclient/auto.go @@ -302,6 +302,12 @@ func (c *Auto) restartMap() { c.updateControl() } +// RestartMap cancels the existing map poll and starts a fresh streaming one, +// forcing the control server to send a new full netmap response. +func (c *Auto) RestartMap() { + c.restartMap() +} + func (c *Auto) authRoutine() { defer close(c.authDone) bo := backoff.NewBackoff("authRoutine", c.logf, 30*time.Second) diff --git a/ipn/ipnlocal/local.go b/ipn/ipnlocal/local.go index 4bffbea3b..d8797f21d 100644 --- a/ipn/ipnlocal/local.go +++ b/ipn/ipnlocal/local.go @@ -4980,9 +4980,16 @@ func (b *LocalBackend) SetExplicitServices(sl []tailcfg.Service) { } b.hostinfo.Services = sl b.explicitServices = sl + ccAuto := b.ccAuto b.mu.Unlock() b.doSetHostinfoFilterServices() + // Restart the streaming map poll so the control server sends back a fresh + // netmap that includes our updated services in SelfNode, and so peers + // receive the update promptly via the control server's push. + if ccAuto != nil { + ccAuto.RestartMap() + } } // doSetHostinfoFilterServices calls SetHostinfo on the controlclient,