diff --git a/cmd/tailscaled/tailscaled.go b/cmd/tailscaled/tailscaled.go index 890ff7bf8..f9fd3347a 100644 --- a/cmd/tailscaled/tailscaled.go +++ b/cmd/tailscaled/tailscaled.go @@ -75,6 +75,9 @@ import ( // defaultTunName returns the default tun device name for the platform. func defaultTunName() string { + if runtime.GOOS == "linux" && distro.Get() == distro.ISH { + return "userspace-networking" + } switch runtime.GOOS { case "openbsd": return "tun" @@ -207,6 +210,8 @@ func main() { os.Args = []string{"tailscaled", "be-child", "plan9-netshell"} } + println("XX distro:", distro.Get()) + if len(os.Args) > 1 { sub := os.Args[1] if fp, ok := subCommands[sub]; ok { diff --git a/net/netmon/netmon.go b/net/netmon/netmon.go index b97b184d4..32d9b34a0 100644 --- a/net/netmon/netmon.go +++ b/net/netmon/netmon.go @@ -9,6 +9,7 @@ package netmon import ( "encoding/json" "errors" + "fmt" "net/netip" "runtime" "sync" @@ -18,6 +19,7 @@ import ( "tailscale.com/util/clientmetric" "tailscale.com/util/eventbus" "tailscale.com/util/set" + "tailscale.com/version/distro" ) // pollWallTimeInterval is how often we check the time to check @@ -118,6 +120,9 @@ type ChangeDelta struct { // The returned monitor is inactive until it's started by the Start method. // Use RegisterChangeCallback to get notified of network changes. func New(bus *eventbus.Bus, logf logger.Logf) (*Monitor, error) { + if distro.Get() == distro.ISH { + return NewStatic(), nil // netlink doesn't work in iSH + } logf = logger.WithPrefix(logf, "monitor: ") m := &Monitor{ logf: logf, @@ -129,7 +134,7 @@ func New(bus *eventbus.Bus, logf logger.Logf) (*Monitor, error) { m.changed = eventbus.Publish[*ChangeDelta](m.b) st, err := m.interfaceStateUncached() if err != nil { - return nil, err + return nil, fmt.Errorf("interface state: %w", err) } m.ifState = st diff --git a/net/netmon/netmon_linux.go b/net/netmon/netmon_linux.go index a1077c257..70aa50af3 100644 --- a/net/netmon/netmon_linux.go +++ b/net/netmon/netmon_linux.go @@ -17,6 +17,7 @@ import ( "tailscale.com/net/tsaddr" "tailscale.com/types/logger" "tailscale.com/util/eventbus" + "tailscale.com/version/distro" ) var debugNetlinkMessages = envknob.RegisterBool("TS_DEBUG_NETLINK") @@ -57,6 +58,10 @@ type nlConn struct { } func newOSMon(bus *eventbus.Bus, logf logger.Logf, m *Monitor) (osMon, error) { + if distro.Get() == distro.ISH { + println("XXX hi from ish") + return newPollingMon(logf, m) + } conn, err := netlink.Dial(unix.NETLINK_ROUTE, &netlink.Config{ // Routes get us most of the events of interest, but we need // address as well to cover things like DHCP deciding to give diff --git a/version/distro/distro.go b/version/distro/distro.go index 0e88bdd2f..de7c9f9a1 100644 --- a/version/distro/distro.go +++ b/version/distro/distro.go @@ -33,6 +33,7 @@ const ( Alpine = Distro("alpine") UBNT = Distro("ubnt") // Ubiquiti Networks JetKVM = Distro("jetkvm") + ISH = Distro("ish") // iOS iSH app ) var distro lazy.SyncValue[Distro] @@ -102,6 +103,11 @@ func linuxDistro() Distro { return WDMyCloud case have("/etc/unraid-version"): return Unraid + case runtime.GOARCH == "386": + v, _ := os.ReadFile("/proc/cpuinfo") + if bytes.Contains(v, []byte(": iSH")) { + return ISH + } case have("/etc/alpine-release"): return Alpine case runtime.GOARCH == "arm" && isDeviceModel("JetKVM"):