protonscr

[BUG] vrlink drops video packets: "FAULT: Packet too big!!! Can't send!!! Dropping" causes periodic hitches (SteamOS 3.8.16 / RADV / Quest 3S)

steamvropen
ValveSoftware/SteamVR-for-Linux#929 · opened 2026-08-09 by codegax · updated 2026-08-12 · 2 comments · github
Ccodegax 2026-08-09 github

Description

During wireless VR streaming to a Quest 3S via Steam Link, vrlink periodically fails to
send video packets, logging FAULT: Packet too big!!! Can't send!!! Dropping followed in
many cases by HandleUnrecoverableError( -22 ) (-EINVAL). Each occurrence is perceived
in-headset as a brief hitch.

This is not GPU-bound: over the same session the compositor reported 0 reprojected
frames
and only 0.37% dropped presents.

Frequency

Over a single 2h49m Half-Life: Alyx session (20:48:3523:37:40):

  • FAULT: Packet too big!!! Can't send!!! Dropping47 occurrences
  • HandleUnrecoverableError(...)43 occurrences
  • Compositor: Timed out. 1617 total

Roughly one fault every 3.6 minutes, sometimes in bursts.

Log excerpts (vrserver.txt)

21:46:58.016156 [Info] - vrlink: FAULT: Packet too big!!! Can't send!!! Dropping
21:47:26.816261 [Info] - vrlink: FAULT: Packet too big!!! Can't send!!! Dropping
21:48:06.955338 [Info] - vrlink: HandleUnrecoverableError( 19 )
21:49:26.250685 [Info] - vrlink: FAULT: Packet too big!!! Can't send!!! Dropping
21:49:26.250728 [Info] - vrlink: HandleUnrecoverableError( -22 )
21:50:45.206871 [Info] - vrlink: HandleUnrecoverableError( 21 )
21:50:45.623188 [Info] - vrlink: HandleUnrecoverableError( 22 )
21:50:46.039822 [Info] - vrlink: HandleUnrecoverableError( 23 )
21:50:46.673596 [Info] - vrlink: HandleUnrecoverableError( 24 )
21:51:29.277365 [Info] - vrlink: FAULT: Packet too big!!! Can't send!!! Dropping
22:18:51.843291 [Info] - vrlink: FAULT: Packet too big!!! Can't send!!! Dropping
22:26:33.838873 [Info] - vrlink: FAULT: Packet too big!!! Can't send!!! Dropping
22:39:35.612888 [Info] - vrlink: FAULT: Packet too big!!! Can't send!!! Dropping
22:48:47.972482 [Info] - vrlink: FAULT: Packet too big!!! Can't send!!! Dropping

Compositor frame stats for the same session:

Total..................639583 presents. 2368 dropped.    0 reprojected
Loading... 13 total.... 88342 presents.  205 dropped.    0 reprojected
Timed out.1617 total....  1154 presents.    6 dropped.    0 reprojected

Observations

  • The oversized packet appears to be discarded outright rather than fragmented or
    re-encoded at a smaller size, so a frame chunk is simply lost.
  • -22 / EINVAL suggests the datagram exceeds what the socket will accept.
  • Host NIC MTU is the standard 1500, wired; the headset is on 5 GHz Wi-Fi (–28 dBm,
    ~2400 Mbit link rate). No MTU customisation anywhere on the path.
  • vrserver.txt does not log the negotiated bitrate or encoder configuration, which makes
    it hard to tell whether an over-aggressive bitrate is being selected on a fast link.

System

OS SteamOS 3.8.16 (BUILD_ID 20260716.1)
Kernel 6.16.12-valve24.5-1-neptune-616
SteamVR 2.17.6 (beta branch)
GPU AMD Radeon RX 6700 XT (RADV NAVI22), 12 GB
Mesa 26.0.0-devel (git-9cc9241790), package mesa 25.3.0.213835.radeonsi
Headset Meta Quest 3S via Steam Link (vrlink)
Network Host wired 1 GbE; headset 5 GHz Wi-Fi 6, same subnet, no AP isolation

Expected

Oversized encoder output should be fragmented or the encoder asked for a smaller payload,
rather than the packet being dropped and a frame chunk lost.

Ccodegax 2026-08-10 github

Follow-up: capping Steam Link "Bandwidth" eliminates the fault entirely

Setting a manual Bandwidth limit of 100 Mbps in the Steam Link app (previously left on
automatic) removed the Packet too big faults completely, and dropped frames fell by more
than two orders of magnitude. Same host, same headset, same network, only that setting changed.

Before (automatic bandwidth) After (100 Mbps cap)
Session Half-Life: Alyx, 169 min VRChat, 28 min
FAULT: Packet too big 47 (0.28/min) 0
HandleUnrecoverableError 43 (0.25/min) 3 — all during connection setup, none in-session
Dropped presents 2368 / 639583 (0.37%) 1 / 66322 (0.0015%)
Reprojected 0 0

At the previous rate, ~8 faults would have been expected in a 28-minute session.

The 3 remaining HandleUnrecoverableError calls all occurred within a 2-second window
before the game launched, and are preceded by:

21:26:56.565920 vrlink: Timed out waiting for another accepted video packet, trying to force the stream reset
21:26:56.565989 vrlink: HandleUnrecoverableError( 1 )
21:26:56.566016 vrlink: SVLFEC::ReportStreamReset() (m_iLastAcknowledgeFrameNumber = 5383)

which looks like ordinary stream negotiation rather than the reported fault.

Suggested reading

On a fast link (~2400 Mbit negotiated, -28 dBm) the automatic bandwidth selection appears
to choose an encoder configuration whose output exceeds what the send path accepts, and the
oversized packet is then dropped rather than fragmented or re-encoded smaller. A manual cap
sidesteps it.

This also reinforces the earlier point that vrserver.txt never logs the negotiated
bitrate — with it logged, this would have been diagnosable directly instead of by
experiment.

PPacketdancer 2026-08-12 github

I suspect this has been fixed as a side-effect of a different (but related) fix. When we push the next version of the Quest app, I'd love to see whether you still have the issue when not capping the bandwidth.

Nothing extracted yet.