From 75154ff80cead3872c3bba44b8075a5fab8321f6 Mon Sep 17 00:00:00 2001 From: majorlinux Date: Sun, 14 Jun 2026 19:10:06 -0400 Subject: [PATCH] iPhone Mirroring: correct transport finding (video on llw0 not awdl0), it works on ch44, what-changed + MajorMac open test (2026-06-14 evening) --- ...rroring-connecting-hang-awdl-stall-beta.md | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/05-troubleshooting/iphone-mirroring-connecting-hang-awdl-stall-beta.md b/05-troubleshooting/iphone-mirroring-connecting-hang-awdl-stall-beta.md index df08aa5..8ca8454 100644 --- a/05-troubleshooting/iphone-mirroring-connecting-hang-awdl-stall-beta.md +++ b/05-troubleshooting/iphone-mirroring-connecting-hang-awdl-stall-beta.md @@ -10,23 +10,22 @@ updated: 2026-06-14 # iPhone Mirroring Hangs on 'Connecting…' — AWDL Data Stall (27.0 Beta) -## Update 2026‑06‑14 — root cause refined (and what is *not* the cause) +## Update 2026‑06‑14 (evening) — it WORKS; the "AWDL starvation" finding was the wrong interface -> Re‑investigated end‑to‑end on the **same OS seed** (build `26A5353q`, unchanged). The original "AWDL data stall / nothing local was wrong" call was close but mis‑attributed the secondary causes. Corrected understanding below — **practical outcome is unchanged: no user‑side fix, wait for a new seed.** +> iPhone Mirroring is now **working** on MajorAir — stable session, clean video, no missing icons — on **ch44/80** with Tailscale `accept-routes=false`. An earlier pass the same day blamed an "AWDL bulk‑path starving at ~90 B/s"; that was **measuring the wrong interface** and is corrected here. -**Refined root cause — the AWDL _bulk‑data_ path can't hold a 5 GHz channel.** -Pulled the iPhone's own logs over USB (`sudo log collect --device --last 8m --output ~/Desktop/x.logarchive`). The kernel Wi‑Fi driver (`AppleBCMWLAN`, `wlan0:com.apple.p2p.awdl0`) shows, over 8 min on infra channel 36: -- `isValidChannel … not match … channel 36 band 0x10` — **238×** (vs 32 passes): AWDL rejects the channel for the P2P group. -- `Disable Steering on Timeout` — **159×**: can't steer to a better channel. -- `isInfraRealtimePacketThresholdAllowed allowed:0` — **169/451**: bulk realtime packets blocked ~37 % of the time. +**The video transport is `llw0` (low‑latency WLAN), not `awdl0`.** +Measured during an active session: **`llw0` ≈ 800 KB/s** (≈6 Mbps of real video), `en0` ~60 KB/s, **`awdl0` ~1 KB/s**. `awdl0` only ever carries AWDL *discovery/control* (~90 B/s) — whether mirroring works or not. So "90 B/s on `awdl0` = starved bulk path" was a **red herring**: the A/V stream rides `llw0`, which the earlier pass never measured. -Net: the Mac's `awdl0` carries **~90 B/s** (control keepalive only; real video is hundreds of KB/s–MB/s). The feed is **starved, not corrupted** — "missing icons" = frame data that never arrived (zero decode/`kVT` errors logged). +**What was actually broken was session *stability*.** The `XPC_ERROR_CONNECTION_INTERRUPTED` / `MediaContinuityKit.TaskTimeoutError` teardown loop kept the `llw0` stream from ever sustaining (→ glitchy / missing icons). When the session holds, `llw0` streams clean. -**What is NOT the cause (each tested and ruled out):** -- **Tailscale is not a hard RF blocker.** With accept‑routes on but **no exit node**, mirroring connects. Tailscale only *intermittently* breaks the **control plane** (QUIC endpoint binding → "Connection Interrupted"); with Tailscale **off** the session establishes but the **bulk video still starves**. So the old "disable Tailscale" step lets you *connect* but does **not** fix the video. (Mechanism is control‑plane endpoint flapping, not the RF‑layer block the original note implied.) -- **Not congestion.** Router `chanim_stats` on ch36 = **90 % idle, 86 % txop, 3 % obss**; Mac link −39 dBm / −94 dBm noise. Pristine. -- **Not the channel number — the whole UNII‑1 block is AWDL‑hostile on this seed.** ch36 → starved feed (~90 B/s, glitchy). **ch44** (same 36–48 block) → **worse**: times out before media starts (`Failed to find endpoint`, `MediaContinuityKit.TaskTimeoutError`, 0 B/s). Both fail → the validator rejects the entire UNII‑1 block, not just primary 36. -- **ch149 (UNII‑3) untested.** It's the iPhone's preferred AWDL anchor and a *different* block, so it's the one channel that might work — but it's busier and the AiMesh controller resists pinning it (see infra notes). Deferred as not worth the disruption for a beta bug. +**What changed (not cleanly isolated):** three things differed between the broken and working states — (1) the network fully **settled on ch44** over ~15 h (the failing ch44 test was minutes after a chaotic AiMesh re‑sync + reconnect scramble), (2) Tailscale **`accept-routes` was turned off** (it had been polluting IPv4 routing + the Continuity control plane), and (3) both devices slept/woke. Which one mattered is not yet proven. + +**Open test — isolates Tailscale's role:** repro on **MajorMac** with *unaltered* Tailscale (`accept-routes` still **ON**). If mirroring breaks there but works on MajorAir (accept‑routes OFF), that pins Tailscale's accepted routes as the trigger. See [[MajorAir#Known Issues]] for the `accept-routes=false` fix. + +**Still valid from earlier today:** congestion ruled out (router `chanim_stats` ch36 = 90 % idle, 86 % txop); the AiMesh / router infra notes below; and iPhone Mirroring is **wireless‑only — no USB transport** (for a wired screen view, use QuickTime, below). + +> ⚠️ The iPhone‑radio `isValidChannel`/`awdl0` evidence cited in the original 2026‑06‑09 write‑up below describes AWDL *discovery* health, **not** the video path — read it in light of this correction. **Wired workaround (works today, no AWDL):** iPhone Mirroring is **wireless‑only — there is no USB transport** (confirmed: cable connected throughout, every attempt still used `awdl0`). For a wired view of the screen: @@ -38,13 +37,13 @@ iPhone Mirroring is **wireless‑only — there is no USB transport** (confirmed - Any channel change triggers a **mesh re‑sync (~1 min) that drops all Wi‑Fi**; during it MajorAir falls back to the iPhone's **USB Personal Hotspot** (`en7` / `172.20.10.x`) and won't auto‑rejoin home Wi‑Fi while the hotspot feeds it internet (manual Wi‑Fi‑menu join needed). - **Current state: 5 GHz on ch44/80** (same clean UNII‑1 spectrum as 36; left here to avoid another re‑sync — the Deck streams identically on 44). -**Revisit checklist — when a new iOS/macOS seed ships:** -1. Confirm the seed changed: `sw_vers` BuildVersion ≠ `26A5353q` (both Mac and iPhone). -2. Tailscale **off**; iPhone on home Wi‑Fi, near the Mac, **Personal Hotspot off**. -3. Open iPhone Mirroring. -4. Measure `awdl0` RX over a few seconds — **target hundreds of KB/s** (real video), not ~90 B/s. -5. Pull the iPhone log (`log collect --device`) and check `isValidChannel` now **passes** for the infra channel. -6. If still starved → no user fix; re‑file Feedback Assistant and keep waiting. +**If it breaks again — troubleshooting checklist:** +1. **It's session stability, not bandwidth.** Look for teardown loops: `log show --last 3m --predicate 'process == "iPhone Mirroring"' | grep -iE "interrupt|timeout|endpoint"`. +2. **Measure the right interface** — video rides **`llw0`** (hundreds of KB/s when the screen is active), *not* `awdl0` (~90 B/s control is normal): `netstat -ib | awk '/