Skip to content

feat(acceptor): expose client multitransport flags on AcceptorResult#1453

Open
clintcan wants to merge 1 commit into
Devolutions:masterfrom
clintcan:feat/acceptor-expose-multitransport-flags
Open

feat(acceptor): expose client multitransport flags on AcceptorResult#1453
clintcan wants to merge 1 commit into
Devolutions:masterfrom
clintcan:feat/acceptor-expose-multitransport-flags

Conversation

@clintcan

Copy link
Copy Markdown
Contributor

What

The acceptor already parses the client's GCC MultiTransportChannelData block (MS-RDPBCGR §2.2.1.3.8) into ClientGccBlocks during BasicSettingsWaitInitial and then discards it, keeping only the early-capability flags, core desktop size, and keyboard layout. This surfaces the client's multitransport (MS-RDPEMT) capability flags on AcceptorResult.

Why

A server implementing UDP multitransport needs to know whether the client advertised support (SOFT_SYNC_TCP_TO_UDP, TRANSPORT_TYPE_UDP_FEC{R,L}) before deciding whether to send a Server Initiate Multitransport Request. Today that information is parsed and thrown away, so there's no way for a downstream server to see it.

Shape

Purely additive, mirroring the existing keyboard_layout (#1397) and desktop-size (#1373) surfacing of GCC client data the acceptor already parses:

  • new private multitransport_flags: gcc::MultiTransportFlags field on Acceptor, captured from gcc_blocks.multi_transport_channel;
  • new pub multitransport_flags: gcc::MultiTransportFlags field on AcceptorResult;
  • empty when the client sends no multitransport block;
  • carried across a deactivation-reactivation like the sibling fields.

No behavior change — the acceptor just stops discarding a block it already decodes.

cargo clippy -p ironrdp-acceptor --all-targets and cargo fmt --check are clean.

The acceptor already parses the client's GCC MultiTransportChannelData
block (section 2.2.1.3.8) into ClientGccBlocks and then discards it,
keeping only the early-capability flags, core desktop size, and keyboard
layout. Surface the client's multitransport (MS-RDPEMT) capability flags
on AcceptorResult so a server implementing UDP multitransport can decide
whether to send a Server Initiate Multitransport Request.

Purely additive, mirroring the existing keyboard_layout (Devolutions#1397) and
desktop-size (Devolutions#1373) surfacing: a new AcceptorResult field, empty when
the client sent no multitransport block, carried across a
deactivation-reactivation. No behavior change.
clintcan added a commit to clintcan/macrdp that referenced this pull request Jul 16, 2026
Log the read-side of vendored ironrdp-acceptor divergence (3) as
upstreamed in Devolutions/IronRDP#1453 (opened 2026-07-17) — an additive
twin of the merged #1397/#1373 GCC-surfacing. The M3c advertise/emit/offer
half stays vendored (macrdp UDP-offer policy), so #1453 does not de-vendor
the acceptor. TODO.md open-PR list + the vendored divergence (3) note
updated to match.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant