diff --git a/android/src/main/java/com/tailscale/ipn/App.kt b/android/src/main/java/com/tailscale/ipn/App.kt index 7a9d564..92b9b23 100644 --- a/android/src/main/java/com/tailscale/ipn/App.kt +++ b/android/src/main/java/com/tailscale/ipn/App.kt @@ -166,14 +166,14 @@ class App : Application(), libtailscale.AppContext { } if (dns.updateDNSFromNetwork(sb.toString())) { - Libtailscale.onDnsConfigChanged() + Libtailscale.onDnsConfigChanged(linkProperties?.getInterfaceName()) } } override fun onLost(network: Network) { super.onLost(network) if (dns.updateDNSFromNetwork("")) { - Libtailscale.onDnsConfigChanged() + Libtailscale.onDnsConfigChanged("") } } }) diff --git a/libtailscale/backend.go b/libtailscale/backend.go index a5610c6..bbe73c3 100644 --- a/libtailscale/backend.go +++ b/libtailscale/backend.go @@ -222,9 +222,9 @@ func (a *App) runBackend(ctx context.Context) error { netns.SetAndroidProtectFunc(nil) service = nil } - case <-onDNSConfigChanged: + case i := <-onDNSConfigChanged: if b != nil { - go b.NetworkChanged() + go b.NetworkChanged(i) } } } diff --git a/libtailscale/callbacks.go b/libtailscale/callbacks.go index bc3e489..d35a8a0 100644 --- a/libtailscale/callbacks.go +++ b/libtailscale/callbacks.go @@ -23,13 +23,14 @@ var ( // onGoogleToken receives google ID tokens. onGoogleToken = make(chan string) - // onDNSConfigChanged is notified when the network changes and the DNS config needs to be updated. - onDNSConfigChanged = make(chan struct{}, 1) + // onDNSConfigChanged is notified when the network changes and the DNS config needs to be updated. It receives the updated interface name. + onDNSConfigChanged = make(chan string, 1) ) -func OnDnsConfigChanged() { +// ifname is the interface name retrieved from LinkProperties on network change, if any. +func OnDnsConfigChanged(ifname string) { select { - case onDNSConfigChanged <- struct{}{}: + case onDNSConfigChanged <- ifname: default: } } diff --git a/libtailscale/net.go b/libtailscale/net.go index 49ced68..8d61a3d 100644 --- a/libtailscale/net.go +++ b/libtailscale/net.go @@ -227,7 +227,8 @@ func (b *backend) CloseTUNs() { b.devices.Shutdown() } -func (b *backend) NetworkChanged() { +// ifname is the interface name retrieved from LinkProperties on network change. If a network is lost, an empty string is passed in. +func (b *backend) NetworkChanged(ifname string) { defer func() { if p := recover(); p != nil { log.Printf("panic in NetworkChanged %s: %s", p, debug.Stack()) @@ -239,6 +240,7 @@ func (b *backend) NetworkChanged() { if nm, ok := b.sys.NetMon.GetOK(); ok { nm.InjectEvent() } + interfaces.UpdateLastKnownDefaultRouteInterface(ifname) } }