Skip to content

Mirroring negotiates and 'initializes' but client never opens data connection (iOS 27, combinedGetInfoWithControlSetup) #535

Description

@jaslrobinson

Summary

Mirroring session connects and negotiates successfully (control connection stays open, /feedback heartbeats keep flowing, server logs "Mirroring initialized successfully" / opens the data port and confirms Accepted IPv6 client on socket...), but the client never opens the actual video/audio data connection. No mirroring window ever appears, since no frame data ever arrives.

Reproduced consistently across four different configurations:

  1. -p (fixed legacy ports 7000/7001/7100 TCP, 6000/6001/7011 UDP)
  2. -p -avdec (forced software h264 decode, ruling out a GPU/VAAPI sink issue)
  3. Default (no -p, random ports)
  4. Default, second clean run after restarting avahi to rule out stale mDNS state

In every case: the control RTSP connection (whatever port it's on) shows ESTABLISHED and stays alive with periodic /feedback POSTs, a data port is opened and logged as ready, but ss -tnp never shows a second ESTABLISHED connection to that data port — the client simply never dials it.

Environment

  • UxPlay 1.73.6 (latest release, built from AUR)
  • Linux (Arch-based), Hyprland (wlroots/Wayland compositor)
  • -vs waylandsink and also tried default autovideosink
  • Client: iPhone16,2, iOS/iPhone OS 27.0 (osBuildVersion in the 24A53xx range), AirPlay client sourceVersion 980.67.2

Relevant detail

The client's SETUP request plist includes:

<key>combinedGetInfoWithControlSetup</key>
<true/>

This key isn't referenced anywhere in the UxPlay source as far as I can tell from the debug log's request handling — suspect the client is negotiating a different data-connection mode than the traditional separate dataPort/SETUP-per-stream flow, and since the server doesn't acknowledge/handle that request, the client never follows through with the classic dataPort connection UxPlay is waiting on.

Debug log excerpt (-d), redacted

Control connection + first SETUP (audio/timing):

SETUP <rtsp-url> RTSP/1.0
X-Apple-ProtocolVersion: 1
Content-Type: application/x-apple-binary-plist

<dict>
	<key>osVersion</key><string>27.0</string>
	<key>combinedGetInfoWithControlSetup</key><true/>
	<key>name</key><string>iPhone</string>
	<key>timingProtocol</key><string>NTP</string>
	<key>sourceVersion</key><string>980.67.2</string>
	<key>isScreenMirroringSession</key><true/>
	<key>model</key><string>iPhone16,2</string>
	<key>osName</key><string>iPhone OS</string>
</dict>

fairplay_decrypt ret = 0
Client identified as User-Agent: AirPlay/980.67.2
RTSP/1.0 200 OK

Second SETUP (video stream negotiation) — server responds with a dataPort and considers mirroring initialized:

SETUP <rtsp-url> RTSP/1.0
<dict>
  <key>streams</key>
  <array>
    <dict>
      <key>latencyMs</key><integer>100</integer>
      <key>type</key><integer>110</integer>
      <key>streamConnectionID</key><integer>...</integer>
    </dict>
  </array>
</dict>

type = 110
raop_rtp_mirror starting mirroring
raop_rtp_mirror local data port socket 28 port TCP 7100
Mirroring initialized successfully
RTSP/1.0 200 OK

<dict>
  <key>streams</key>
  <array>
    <dict>
      <key>dataPort</key><integer>7100</integer>
      <key>type</key><integer>110</integer>
    </dict>
  </array>
</dict>

After this point, only /feedback heartbeat POSTs continue on the original control connection every ~3s. ss -tnp at any point after this never shows a connection to port 7100 (or whatever data port was negotiated in other test runs). No video pipeline ever receives a buffer, so waylandsink/autovideosink never creates a window (pipeline stays at PAUSED, never reaches PLAYING).

Question

Is combinedGetInfoWithControlSetup a known negotiation mode from newer iOS AirPlay clients that UxPlay doesn't currently implement? Happy to test any patch/branch or provide further packet captures if useful.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions