Skip to content

RDP: follow GNOME Remote Desktop server-redirection PDU (EGFX negotiates; GRD black-screens on redirect) #117

Description

@GlassOnTin

Context

GNOME Remote Desktop's RDP backend (gnome-remote-desktop-daemon, FreeRDP-server-side) requires the client to advertise EGFX (MS-RDPEGFX, the Graphics Pipeline Extension) in its confirmActive capabilities. Reported on #109 by @agevlakh — server-side journalctl shows:

[RDP] Client did not advertise support for the Graphics Pipeline, closing connection
[ERROR] freerdp_peer::Capabilities() callback failed
[ERROR] [rdp_peer_handle_state_demand_active]: 
  [CONNECTION_STATE_CAPABILITIES_EXCHANGE_DEMAND_ACTIVE] failed

Without EGFX, GRD bails during caps validation, before sending ServerDemandActive. Haven sees the channel close as "unexpected Share Control PDU" because the expected PDU never arrives.

xrdp and Microsoft Windows hosts still ship bitmap updates via the legacy path even when the client lacks EGFX. GRD is the strict outlier here, and increasingly the default RDP server on modern Linux desktops (Fedora 41+, Ubuntu 24.04 GNOME, etc.).

Scope

IronRDP has the building blocks but not the integration:

  • ironrdp-pdu defines dvc::gfx::ServerPdu / ClientPdu and the EGFX message types
  • ironrdp-dvc implements DRDYNVC (Dynamic Virtual Channel) framing
  • ironrdp-graphics exists with codec primitives
  • ironrdp-replay-client example consumes EGFX from a recorded stream
  • ironrdp-session does not currently negotiate EGFX as a client in-session
  • ❌ No glue connecting decoded EGFX surfaces to Haven's RdpScreen display path

Work breakdown

  1. Negotiation: advertise EGFX in confirmActive capabilities; open the Microsoft::Windows::RDS::Graphics dynamic VC over DRDYNVC after capability exchange.
  2. Protocol handling: handle RDPGFX_CAPS_ADVERTISE_PDU / RDPGFX_CAPS_CONFIRM_PDU, frame ACKs, surface create/delete, surface-to-output, cache import/export.
  3. Decoders: at minimum RemoteFX (RFX) and NSCodec for Linux servers; AVC420/AVC444 (H.264) for Windows hosts already on EGFX. May be possible to advertise only what we can decode and let the server pick.
  4. Display integration: route decoded surface tiles into the existing RdpScreen Bitmap + Compose canvas path that legacy bitmap updates already use.
  5. Frame-ack timing: GRD requires timely frame ACKs or it stops sending updates.

Affected users

Anyone using:

  • Fedora 41+ default GNOME (RDP enabled in Sharing panel)
  • Ubuntu 24.04+ GNOME with RDP sharing
  • Any system that picked up GRD's RDP backend (which Wayland-first distros increasingly default to)

Currently shows as "unexpected Share Control PDU" with NLA on, or "HYBRID_REQUIRED_BY_SERVER" with NLA off (since GRD doesn't fall back to TLS-only).

References

  • RDP error #109 — original report (agevlakh, GRD on Fedora)
  • IronRDP#1232 — asked Devolutions to surface PDU type in the error string
  • IronRDP roadmap discussion would be the right place to flag this externally — they're likely to take an EGFX implementation upstream

Workaround until implemented

For users on GRD: switch to xrdp on the same host. apt install xrdp / dnf install xrdp then systemctl enable --now xrdp and disable RDP in GNOME Settings → Sharing. Less polished but works with bitmap updates.

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