What's New (includes v0.9.0 + v0.9.1)
v0.9.0 was tagged but never released due to CI issues. This release includes all v0.9.0 features plus v0.9.1 fixes.
Added
- MPTCP support (
--mptcp) — Multi-Path TCP on Linux 5.6+ (issue #24). UsesIPPROTO_MPTCPat socket creation via socket2. All TCP features work transparently. Server automatically creates MPTCP listeners when available (no flag needed) — accepts both MPTCP and regular TCP clients with silent fallback. - Kernel TCP pacing via
SO_MAX_PACING_RATE(issue #30) — On Linux,-bnow uses the kernel's FQ scheduler with EDT for precise per-packet timing, eliminating burst behavior from userspace sleep/wake cycles. Falls back to userspace pacing on non-Linux, MPTCP sockets, or if the setsockopt fails. Note:-bsets a global bitrate shared across all parallel streams (unlike iperf3 where-bis per-stream).
Changed
- Library API —
create_tcp_listener(),connect_tcp(), andconnect_tcp_with_bind()now take amptcp: boolparameter. Passfalseto preserve existing behavior.
Fixed
- High stream-count teardown hardening (issue #32) — client now stops local data streams at local duration expiry instead of waiting for server
Result, scales stream join timeout with stream count (max(2s, streams*50ms)), and TCP receivers drain briefly after cancel to reduce reset-on-close bursts at high-P. - Best-effort send shutdown —
send_data()shutdown no longer propagates errors during normal teardown races. - Kernel pacing rate width —
SO_MAX_PACING_RATEnow uses nativec_ulonginstead ofu32, removing an unintended ~34 Gbps ceiling on 64-bit Linux. - JoinHandle panic with many parallel streams (issue #24) — removed second
join_allafter aborting timed-out stream tasks. - Final summary showing 0 retransmits/RTT/cwnd (issue #26) — each stream task captures a final sender-side TCP_INFO snapshot before socket close.
- Broken pipe / connection reset at teardown (issue #25) — client joins stream task handles with timeout before returning.
- MPTCP label in server log — server displays "MPTCP" instead of "TCP" when client uses
--mptcp.
Install
# Homebrew
brew install lance0/tap/xfr
# Cargo
cargo install xfr
# Binary (Linux x86_64)
curl -sSL https://github.com/lance0/xfr/releases/download/v0.9.1/xfr-x86_64-unknown-linux-musl.tar.gz | tar xzAcknowledgments
Thanks to @matttbe (Linux kernel MPTCP co-maintainer) for extensive testing, bug reports (#24, #25, #30, #32), suggesting kernel TCP pacing via SO_MAX_PACING_RATE, and catching the FIN vs RST teardown behavior.
Full Changelog: v0.8.0...v0.9.1