tailscale/net/interfaces
Mihai Parparita 6842c3c194 net/interfaces: redo how we get the default interface on macOS and iOS
With #6566 we added an external mechanism for getting the default
interface, and used it on macOS and iOS (see tailscale/corp#8201).
The goal was to be able to get the default physical interface even when
using an exit node (in which case the routing table would say that the
Tailscale utun* interface is the default).

However, the external mechanism turns out to be unreliable in some
cases, e.g. when multiple cellular interfaces are present/toggled (I
have occasionally gotten my phone into a state where it reports the pdp_ip1
interface as the default, even though it can't actually route traffic).

It was observed that `ifconfig -v` on macOS reports an "effective interface"
for the Tailscale utn* interface, which seems promising. By examining
the ifconfig source code, it turns out that this is done via a
SIOCGIFDELEGATE ioctl syscall. Though this is a private API, it appears
to have been around for a long time (e.g. it's in the 10.13 xnu release
at https://opensource.apple.com/source/xnu/xnu-4570.41.2/bsd/net/if_types.h.auto.html)
and thus is unlikely to go away.

We can thus use this ioctl if the routing table says that a utun*
interface is the default, and go back to the simpler mechanism that
we had before #6566.

Updates #7184
Updates #7188

Signed-off-by: Mihai Parparita <mihai@tailscale.com>
(cherry picked from commit fa932fefe7)
2023-02-15 10:44:05 -07:00
..
interfaces.go net/interfaces: redo how we get the default interface on macOS and iOS 2023-02-15 10:44:05 -07:00
interfaces_bsd.go net/interfaces: redo how we get the default interface on macOS and iOS 2023-02-15 10:44:05 -07:00
interfaces_darwin.go net/interfaces: redo how we get the default interface on macOS and iOS 2023-02-15 10:44:05 -07:00
interfaces_darwin_test.go net/interfaces: improve default route detection 2022-10-19 11:10:19 +01:00
interfaces_default_route_test.go all: remove old +build tags 2022-11-04 07:25:42 -07:00
interfaces_defaultrouteif_todo.go all: remove old +build tags 2022-11-04 07:25:42 -07:00
interfaces_freebsd.go net/interfaces: redo how we get the default interface on macOS and iOS 2023-02-15 10:44:05 -07:00
interfaces_linux.go syncs, all: move to using Go's new atomic types instead of ours 2022-08-04 07:47:59 -07:00
interfaces_linux_test.go refactor: move from io/ioutil to io and os packages 2022-09-15 21:45:53 -07:00
interfaces_test.go all: convert more code to use net/netip directly 2022-07-25 21:53:49 -07:00
interfaces_windows.go go.mod: bump wireguard/windows, which moves to using net/netip 2022-08-31 08:36:56 -07:00
interfaces_windows_test.go net/interfaces: quiet PAC detection logging in no-PAC case, add benchmark 2020-10-01 22:02:39 -07:00