net/captivedetection: call SetHealthy once connectivity restored (#12974)

Fixes tailscale/tailscale#12973
Updates tailscale/tailscale#1634

There was a logic issue in the captive detection code we shipped in https://github.com/tailscale/tailscale/pull/12707.

Assume a captive portal has been detected, and the user notified. Upon switching to another Wi-Fi that does *not* have a captive portal, we were issuing a signal to interrupt any pending captive detection attempt. However, we were not also setting the `captive-portal-detected` warnable to healthy. The result was that any "captive portal detected" alert would not be cleared from the UI.

Also fixes a broken log statement value.

Signed-off-by: Andrea Gottardo <andrea@gottardo.me>
pull/12035/head
Andrea Gottardo 3 months ago committed by GitHub
parent 8a8ecac6a7
commit 949b15d858
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -780,6 +780,9 @@ func (b *LocalBackend) onHealthChange(w *health.Warnable, us *health.UnhealthySt
case <-ctx.Done(): case <-ctx.Done():
} }
} else { } else {
// If connectivity is not impacted, we know for sure we're not behind a captive portal,
// so drop any warning, and signal that we don't need captive portal detection.
b.health.SetHealthy(captivePortalWarnable)
select { select {
case b.needsCaptiveDetection <- false: case b.needsCaptiveDetection <- false:
case <-ctx.Done(): case <-ctx.Done():

@ -97,7 +97,7 @@ func (d *Detector) detectCaptivePortalWithGOOS(ctx context.Context, netMon *netm
d.logf("[v2] attempting to do captive portal detection on interface %s", ifName) d.logf("[v2] attempting to do captive portal detection on interface %s", ifName)
res := d.detectOnInterface(ctx, i.Index, endpoints) res := d.detectOnInterface(ctx, i.Index, endpoints)
if res { if res {
d.logf("DetectCaptivePortal(found=true,ifName=%s)", found, ifName) d.logf("DetectCaptivePortal(found=true,ifName=%s)", ifName)
return true return true
} }
} }

Loading…
Cancel
Save