Skip to content

iOS: a remote dial's failure names both ends when either one's VPN may be off (#309) - #320

Open
addhumal wants to merge 1 commit into
Saffsanity:mainfrom
addhumal:tailscale-both-ends
Open

addhumal wants to merge 1 commit into
Saffsanity:mainfrom
addhumal:tailscale-both-ends

Conversation

@addhumal

@addhumal addhumal commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

Closes #309 (@grub-basket's finding and wording).

What it does

When a dial through Tailscale (or another VPN) fails in a way the device can't pin on one end, the status line now names both ends instead of only this device:

  • .vpnOff: "Tailscale looks off on this iPhone or on ‹Mac›. Turn it on on both, then tap ‹Mac›." ("Your VPN" when the address has no service name). Was "Tailscale looks off on this iPhone. Turn it on, then tap ‹Mac›."
  • .nameNotFound for a .ts.net name: "This iPhone can’t look up ‹name›. Is Tailscale on, here and on ‹Mac›?" Was "… Is Tailscale on?". Other names are unchanged.
  • .noAnswer is unchanged: it already names the Mac ("…or Tailscale may be off on the Mac").

RemoteCopy (the status line's words) moves unchanged from StreamClient+Remote.swift to the end of RemoteDialPolicy.swift, which Tests/checks/remote-rules already compiles, so the words are checked for the first time. RemoteDialPolicy.classify is untouched. No wire change; device only.

Docs: docs/remote-access-plan.md's status-line table and DEVELOPMENT.md's troubleshooting line quote the new words.

Checks

  • Tests/checks/remote-rules: 179 checks (7 new: both VPN kinds, both devices, no candidate, the lookup, and the two unchanged cases), 90 of 90 mutants (2 new: each new sentence back to this device alone).
  • run-all.sh: all 63.
  • The iOS app: Debug and Release for the simulator, Debug for a device.

What I tried

  • On a 14-inch MacBook Pro (M4 Pro, macOS 27.0.1), Xcode 27.2: the checks and builds above. Not on an iPhone with Tailscale off on either end.

Not checked

  • Whether the timeout case (usedTunnel == false on a VPN address, which does point at this device's own tunnel) should keep this device's words. I gave it both ends too, as the reporter asked, since a word about the Mac costs nothing there.

…PN may be off (Saffsanity#309)

'Tailscale looks off on this iPhone' sent people to fix the iPhone when Tailscale was off on the Mac: the
device can't tell which end is off. Now 'Tailscale looks off on this iPhone or on ‹Mac›. Turn it on on
both, then tap ‹Mac›.' ('Your VPN' with no service name), and a .ts.net name not found asks 'Is
Tailscale on, here and on ‹Mac›?'. RemoteCopy moves unchanged from StreamClient+Remote.swift to
RemoteDialPolicy.swift, which remote-rules compiles, so its words are checked: 179 checks (7 new), 90 of
90 mutants (2 new); run-all.sh all 63; the three iOS builds. The plan's table and DEVELOPMENT.md quote
the new words.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

iPhone blames its own Tailscale when Tailscale may be off on the Mac

1 participant