diff --git a/android/src/main/java/com/tailscale/ipn/NetworkChangeCallback.kt b/android/src/main/java/com/tailscale/ipn/NetworkChangeCallback.kt index 2919e4d431..90a6cb1eaa 100644 --- a/android/src/main/java/com/tailscale/ipn/NetworkChangeCallback.kt +++ b/android/src/main/java/com/tailscale/ipn/NetworkChangeCallback.kt @@ -197,6 +197,14 @@ object NetworkChangeCallback { if (dns.updateDNSFromNetwork(sb.toString())) { TSLog.d(TAG, "$why: updated DNS config for iface=${info.linkProps.interfaceName}") + + val gatewayIP = info.linkProps.routes + .filter { it.isDefaultRoute && it.gateway != null } + .sortedBy { if (it.gateway is java.net.Inet4Address) 0 else 1 } + .firstNotNullOfOrNull { it.gateway?.hostAddress } + ?: "" + + Libtailscale.onGatewayChanged(gatewayIP) Libtailscale.onDNSConfigChanged(info.linkProps.interfaceName) } } diff --git a/libtailscale/callbacks.go b/libtailscale/callbacks.go index 9daec5c6b5..65489cccbc 100644 --- a/libtailscale/callbacks.go +++ b/libtailscale/callbacks.go @@ -5,6 +5,8 @@ package libtailscale import ( "sync" + + "tailscale.com/net/netmon" ) var ( @@ -36,6 +38,11 @@ func OnDNSConfigChanged(ifname string) { } } +// OnGatewayChanged is called when LinkProperties provides an updated default gateway IP. +func OnGatewayChanged(gatewayIP string) { + netmon.UpdateLastKnownDefaultGateway(gatewayIP) +} + var android struct { // mu protects all fields of this structure. However, once a // non-nil jvm is returned from javaVM, all the other fields may