Skip to content

Comments

Add ECHO virtual channel support across IronRDP#1109

Merged
Benoît Cortier (CBenoit) merged 1 commit intomasterfrom
echo-virtual-channel
Feb 18, 2026
Merged

Add ECHO virtual channel support across IronRDP#1109
Benoît Cortier (CBenoit) merged 1 commit intomasterfrom
echo-virtual-channel

Conversation

@mamoreau-devolutions

Summary

  • add new ironrdp-echo crate with MS-RDPEECO PDUs and DVC client/server processors
  • wire feature-gated �cho support through ironrdp, ironrdp-client, and ironrdp-server
  • add server-side runtime ECHO handle/bridge for request dispatch and RTT measurement tracking
  • add end-to-end Echo virtual channel test in ironrdp-testsuite-extra
  • update server docs and fix fmt/clippy/doctest issues for CI parity

Validation

  • cargo xtask check fmt -v
  • cargo xtask check lints -v
  • cargo xtask check tests -v
  • cargo test -p ironrdp-server --doc --locked

Implement spec-minimal MS-RDPEECO support with feature-gated client/server integration and runtime RTT probing.

- add new ironrdp-echo crate with ECHO PDUs and client/server DVC processors

- wire echo feature through ironrdp meta crate, client, and server

- add server-side echo handle/bridge and dynamic channel lookup helper

- add end-to-end echo virtual channel test in testsuite-extra

- update server docs and fix fmt/clippy/doctest issues for CI parity
@github-actions
Copy link

Coverage Report 🤖 ⚙️

Past:
Total lines: 36238
Covered lines: 23041 (63.58%)

New:
Total lines: 36445
Covered lines: 23675 (64.96%)

Diff: +1.38%

[this comment will be updated automatically]

Copy link
Member

@CBenoit Benoît Cortier (CBenoit) left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@CBenoit Benoît Cortier (CBenoit) merged commit 6f6496a into master Feb 18, 2026
10 checks passed
@CBenoit Benoît Cortier (CBenoit) deleted the echo-virtual-channel branch February 18, 2026 12:01
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds comprehensive ECHO virtual channel support across IronRDP, implementing the MS-RDPEECO protocol for round-trip time (RTT) measurement between RDP client and server.

Changes:

  • Introduces new ironrdp-echo crate with PDU encoding/decoding for ECHO request and response messages
  • Adds feature-gated ECHO support to ironrdp, ironrdp-client, and ironrdp-server crates
  • Implements server-side RTT tracking via EchoServerHandle with thread-safe measurement collection
  • Provides end-to-end integration test demonstrating ECHO channel functionality

Reviewed changes

Copilot reviewed 20 out of 21 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
crates/ironrdp-echo/src/pdu.rs PDU structures for ECHO_REQUEST_PDU and ECHO_RESPONSE_PDU per MS-RDPEECO spec
crates/ironrdp-echo/src/client.rs Client-side DVC processor that echoes requests back as responses
crates/ironrdp-echo/src/server.rs Server-side DVC processor for sending requests and receiving responses
crates/ironrdp-echo/src/lib.rs Library entry point with module exports and channel name constant
crates/ironrdp-echo/tests/echo.rs Integration tests for PDU encoding, client/server behavior
crates/ironrdp-echo/Cargo.toml Package configuration for the new crate
crates/ironrdp-echo/README.md Documentation describing the ECHO extension implementation
crates/ironrdp-echo/CHANGELOG.md Changelog file for version tracking
crates/ironrdp-server/src/echo.rs Server-side ECHO handle with RTT measurement tracking and DVC bridge
crates/ironrdp-server/src/server.rs Integration of ECHO channel into server event loop and DVC setup
crates/ironrdp-server/src/lib.rs Export of ECHO-related types when feature is enabled
crates/ironrdp-server/README.md Documentation for using ECHO RTT probes in server applications
crates/ironrdp-server/Cargo.toml Added ironrdp-echo dependency with echo feature flag
crates/ironrdp-client/src/rdp.rs Registration of EchoClient in both TCP and WebSocket connection paths
crates/ironrdp-client/Cargo.toml Added echo feature flag that propagates to ironrdp crate
crates/ironrdp/src/lib.rs Re-export of ironrdp-echo crate when echo feature is enabled
crates/ironrdp/Cargo.toml Added echo feature and ironrdp-echo dependency
crates/ironrdp-dvc/src/server.rs New method to get DVC channel ID by processor type
crates/ironrdp-testsuite-extra/tests/mod.rs End-to-end test for ECHO virtual channel with RTT measurement
crates/ironrdp-testsuite-extra/Cargo.toml Enabled dvc and echo features for integration testing
Cargo.lock Updated with ironrdp-echo package entry

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

native-tls = ["ironrdp-tls/native-tls", "tokio-tungstenite/native-tls", "ironrdp-mstsgu/native-tls"]
qoi = ["ironrdp/qoi"]
qoiz = ["ironrdp/qoiz"]
echo = ["ironrdp/echo"]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: Do we really want to put that behind a feature flag?

Comment on lines +82 to +86
if channel.state != ChannelState::Opened || !channel.processor.as_any().is::<T>() {
return None;
}

id.try_into().ok()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

note: This does not follow any existing pattern and can be confusing. I’ll send a follow up.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue: Tests should go into a testsuite crate.

Comment on lines +19 to +21
ironrdp-core = { path = "../ironrdp-core", version = "0.1" } # public
ironrdp-dvc = { path = "../ironrdp-dvc", version = "0.5" } # public
ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.7" } # public

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

note: I didn’t check, but # public should be used only for dependencies whose types are used in the public API

Comment on lines +13 to +14
#[cfg(feature = "echo")]
mod echo;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thought: I think there is a better way to keep the crate modularized that is not using feature flags. We should look into this before adding too much of these.

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.

2 participants