summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@tailscale.com>2025-09-12 14:23:12 -0700
committerBrad Fitzpatrick <bradfitz@tailscale.com>2025-09-12 14:23:12 -0700
commit032d425a413fa92028705c3ce8314ff3a61ca168 (patch)
tree51b55dff963677bc5f5bda5899081e1c3b9088b2
parent0cc1b2ff76560ee4675909272fa37ba6b397744c (diff)
downloadtailscale-bradfitz/ios_ish.tar.xz
tailscale-bradfitz/ios_ish.zip
Change-Id: I242111289aeb0c9a0ff843d698bc26168e336165 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
-rw-r--r--cmd/tailscaled/tailscaled.go5
-rw-r--r--net/netmon/netmon.go7
-rw-r--r--net/netmon/netmon_linux.go5
-rw-r--r--version/distro/distro.go6
4 files changed, 22 insertions, 1 deletions
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"):