pkgsrc-Changes archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
CVS commit: pkgsrc/net/xfr
Module Name: pkgsrc
Committed By: pin
Date: Tue May 5 10:05:00 UTC 2026
Modified Files:
pkgsrc/net/xfr: Makefile cargo-depends.mk distinfo
Log Message:
net/xfr: update to 0.9.14
## [0.9.14] - 2026-05-03
### Fixed
- **Live UDP loss counter no longer stalls under upload-mode saturation** (issue #70 final fix) — v0.9.13's `TCP_NODELAY` partially addressed the bug but brettowe's retest showed 8 subsequent
intervals still bunched at one end-of-test client-side timestamp. Root cause was `tokio::time::interval` defaulting to `MissedTickBehavior::Burst` on the server's stats sampling timer: when
`writer.write_all()` stalled under the back-pressure that the saturated UDP uplink induces on TCP control, missed ticks accumulated and fired as a burst when the writer unblocked, producing stale
interval samples with fresh client-side arrival timestamps and misleading throughput numbers. `Skip` now drops the stale ticks; cumulative state in `StreamStats` atomics still surfaces correctly on
the next live tick and at end-of-test. Applied unconditionally on both `run_test` interval-loop sites; benefits even pre-v0.9.14 clients pairing with a v0.9.14 server.
- **`--omit` no longer folds hidden UDP loss into the first visible interval** — the new cumulative-loss tracker added below was advancing its cache on every progress arrival, but the printed-line
baseline only advanced when a line printed. With `--omit 3`, the first visible interval would report all loss accumulated during seconds 0-3 as one jumbo delta, defeating the purpose of `--omit`. The
baseline now advances during the omit window so visible lines reflect only loss observed during printed intervals.
### Added
- **UDP receiver feedback (`udp_feedback_v1` capability)** (issue #70 final fix) — when both peers advertise the capability, the server now emits a 36-byte cumulative `(packets_received,
packets_lost)` UDP packet back to the client at 2 Hz on the same data socket, sidestepping the TCP control channel for live UDP loss reporting. Wire format: `b"XFRF"` magic + version + kind + flags +
`stream_id` + reserved + `elapsed_ms` + cumulative `packets_received` + cumulative `packets_lost`, all big-endian, fixed 36 bytes. Length-first demux at receive sites distinguishes feedback from data
packets without inspecting sequence-number bits. Cumulative-not-delta semantics let the client recover from any dropped feedback packet without needing the lost intermediate state. Capability
negotiation gates emission so older clients (which wouldn't know to listen) never see a packet they don't understand.
- **Producer-side monotonic-denominator filter on the client** — both the TCP control `udp_progress` decode site and the UDP feedback aggregator funnel updates through `UdpProgressFilter::apply`,
which admits only readings whose `(received + lost)` denominator is at-least-as-fresh as anything we've seen before. Atomic CAS via `fetch_update` so two producers cannot race a stale store after a
fresh one. Applies in addition to TUI display: plain text, CSV, and JSON-stream output use the cached cumulative as the source of truth for the per-line `lost` field, so the freshest reading from
either source flows through to scripted consumers, not just the TUI live counter.
- **Live UDP loss in non-TUI output paths** — `--no-tui --json-stream` / `--csv` / plain interval output now reflects the freshest `udp_progress` from either TCP control or UDP feedback. Previously
these consumers used per-stream `streams[].lost` from the most recent TCP `Interval` only, which under control-channel stalls could be several seconds stale. Falls back to the per-stream sum for
sessions where `udp_progress` is never sent (paired with a pre-0.9.11 server, or non-UDP tests).
- **Docker repro harness for issue #70** (`docker/Dockerfile.repro`, `docker/repro-issue-70.sh`, `docker/README.md`) — multi-stage build with the current branch and the released v0.9.13 baseline
side-by-side. `docker run --rm --cap-add=NET_ADMIN xfr-repro` runs hard assertions on the new build (max bunch ≤ 2, time-to-first-loss < 5s, live mid-run loss observed); `--baseline` prints
diagnostics for narrative comparison without gating on a threshold. Stays out of CI — the existing 2× oversubscription `control-channel-skew` job remains the regression floor; the harness is for
human-driven A/B at brettowe's 10× recipe before publishing.
### Changed
- **`TestProgress` schema (pre-1.0 break)** — adds `udp_feedback_only: bool` so consumers can distinguish a feedback-only update (only `udp_progress` carries truth; everything else is sentinel/None)
from a full TCP `Interval` update. Three consumers handle the partial variant: `App::on_progress` early-returns after updating UDP loss state and preserves all other field values; `main.rs` print
loop skips feedback-only entries entirely (the cumulative cache picks up the freshness for the next full interval); cross-version compat test path adopts the new field.
- **Server bidir mode no longer emits UDP feedback** — feedback is upload-mode-only by design. Bidir's server-side recv half was passing `client_supports_udp_feedback` through to `receive_udp` even
though the client's bidir recv has no consumer for those packets; emission was pure overhead on the return path. Bidir always passes `false` now.
- **`receive_udp` skips feedback packets in `bytes_received` accounting** — the length-first demux previously rejected feedback before the data path but bumped `bytes_received` first. With server
bidir gating that's a moot path post-fix, but defense-in-depth: feedback bytes never count toward `bytes_received`, which tracks test-data wire bandwidth.
- **Capability list factored into a single `SUPPORTED_CAPABILITIES` const** — `client_hello`, `server_hello`, and `server_hello_with_auth` previously each had a duplicated `Vec<String>` literal.
Future capability additions now touch one line. New `capability_advertised(&capabilities, name)` helper centralizes the matcher used at both negotiation sites.
### Library API (pre-1.0 break)
- `client::TestProgress` gains `udp_feedback_only: bool`. Constructors must supply it.
- `client::UdpProgressFilter` and `client::UdpFeedbackAggregator` are new public types backing the producer-side filter and aggregator.
- `udp::receive_udp` signature gains a trailing `feedback_enabled: bool` parameter.
- `udp::receive_udp_feedback_only(socket, aggregator, stream_index, cancel)` is new; spawned per-stream on the client in upload mode.
- `udp::UdpFeedbackPacket` and `UDP_FEEDBACK_SIZE` / `UDP_FEEDBACK_MAGIC` / `UDP_FEEDBACK_VERSION` / `UDP_FEEDBACK_KIND_RECEIVER_PROGRESS` constants exported.
- `protocol::SUPPORTED_CAPABILITIES` and `protocol::capability_advertised` exported.
- `stats::StreamStats::udp_progress_snapshot()` exported for callers that need a coherent `(received, lost)` pair.
### Maintenance
- Bump `Cargo.toml` to `0.9.14`.
## [0.9.13] - 2026-05-03
### Fixed
- **Live UDP loss counter no longer stuck at 0% under saturated links** (issue #70 follow-up) — `TCP_NODELAY` was not being set on the control connection. With Nagle still active, the periodic
`Interval` messages (~150-byte 1 Hz writes) coalesced waiting for an MSS-sized payload (which never arrives — they're tiny) or a delayed ACK from the peer. Under heavy parallel UDP data load on a
saturated path (Wi-Fi, rate-limited links, anything where ACK turnaround stretches), the kernel held every queued segment for the duration of the test and flushed the entire backlog in a single burst
when data traffic stopped. The TUI live counter appeared permanently stuck at 0% during the run, then jumped to the final value at quit. iperf3 sets `TCP_NODELAY` on its control channel for exactly
this reason. New `tcp::configure_control_stream` helper applies it before splitting the stream into reader/writer halves; called at three sites (server's accepted control connection, client's connect
ing control connection, server's auth-handshake fallback path). Reproduced and verified with a `tc netem` 50 Mbps + 50ms-delay simulation: the pre-fix binary collapses 3+ interval lines to a single
end-of-test timestamp; the post-fix binary spreads them across the run with at most a 2-line tail collision.
### Added
- **CI regression test for the bunching pattern** (`test-control-channel-skew.sh`, runs as the `Control-channel skew (#70 regression)` job). Applies a 50 Mbps shaper + 50ms each-way delay to `lo`,
runs an 8-second UDP test at 100 Mbps target (2× oversubscription), and asserts no 3-or-more interval lines share a client-side timestamp. Catches future regressions where the `TCP_NODELAY` plumbing
is dropped from any of the three control-stream sites or a new code path forgets to call the helper.
### Maintenance
- Rust dependency group bump (PR #76): `clap_complete` 4.6.2 → 4.6.3, `rustls` 0.23.39 → 0.23.40. Patch-version updates only, no source changes required.
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 pkgsrc/net/xfr/Makefile \
pkgsrc/net/xfr/cargo-depends.mk pkgsrc/net/xfr/distinfo
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: pkgsrc/net/xfr/Makefile
diff -u pkgsrc/net/xfr/Makefile:1.11 pkgsrc/net/xfr/Makefile:1.12
--- pkgsrc/net/xfr/Makefile:1.11 Sun May 3 14:59:11 2026
+++ pkgsrc/net/xfr/Makefile Tue May 5 10:05:00 2026
@@ -1,6 +1,6 @@
-# $NetBSD: Makefile,v 1.11 2026/05/03 14:59:11 pin Exp $
+# $NetBSD: Makefile,v 1.12 2026/05/05 10:05:00 pin Exp $
-DISTNAME= xfr-0.9.12
+DISTNAME= xfr-0.9.14
CATEGORIES= net
MASTER_SITES= ${MASTER_SITE_GITHUB:=lance0/}
GITHUB_TAG= v${PKGVERSION_NOREV}
Index: pkgsrc/net/xfr/cargo-depends.mk
diff -u pkgsrc/net/xfr/cargo-depends.mk:1.11 pkgsrc/net/xfr/cargo-depends.mk:1.12
--- pkgsrc/net/xfr/cargo-depends.mk:1.11 Sun May 3 14:59:11 2026
+++ pkgsrc/net/xfr/cargo-depends.mk Tue May 5 10:05:00 2026
@@ -1,4 +1,4 @@
-# $NetBSD: cargo-depends.mk,v 1.11 2026/05/03 14:59:11 pin Exp $
+# $NetBSD: cargo-depends.mk,v 1.12 2026/05/05 10:05:00 pin Exp $
CARGO_CRATE_DEPENDS+= adler2-2.0.1
CARGO_CRATE_DEPENDS+= aho-corasick-1.1.4
@@ -42,7 +42,7 @@ CARGO_CRATE_DEPENDS+= ciborium-io-0.2.2
CARGO_CRATE_DEPENDS+= ciborium-ll-0.2.2
CARGO_CRATE_DEPENDS+= clap-4.6.1
CARGO_CRATE_DEPENDS+= clap_builder-4.6.0
-CARGO_CRATE_DEPENDS+= clap_complete-4.6.2
+CARGO_CRATE_DEPENDS+= clap_complete-4.6.3
CARGO_CRATE_DEPENDS+= clap_derive-4.6.1
CARGO_CRATE_DEPENDS+= clap_lex-1.0.0
CARGO_CRATE_DEPENDS+= cmov-0.5.3
@@ -264,7 +264,7 @@ CARGO_CRATE_DEPENDS+= rustc-hash-2.1.1
CARGO_CRATE_DEPENDS+= rustc_version-0.4.1
CARGO_CRATE_DEPENDS+= rusticata-macros-4.1.0
CARGO_CRATE_DEPENDS+= rustix-1.1.4
-CARGO_CRATE_DEPENDS+= rustls-0.23.39
+CARGO_CRATE_DEPENDS+= rustls-0.23.40
CARGO_CRATE_DEPENDS+= rustls-native-certs-0.8.3
CARGO_CRATE_DEPENDS+= rustls-pki-types-1.14.0
CARGO_CRATE_DEPENDS+= rustls-platform-verifier-0.6.2
Index: pkgsrc/net/xfr/distinfo
diff -u pkgsrc/net/xfr/distinfo:1.11 pkgsrc/net/xfr/distinfo:1.12
--- pkgsrc/net/xfr/distinfo:1.11 Sun May 3 14:59:11 2026
+++ pkgsrc/net/xfr/distinfo Tue May 5 10:05:00 2026
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.11 2026/05/03 14:59:11 pin Exp $
+$NetBSD: distinfo,v 1.12 2026/05/05 10:05:00 pin Exp $
BLAKE2s (adler2-2.0.1.crate) = 4d391e0fcde91c7435ee9a5503fee4a5346f549f1b45e482ce3e1e151d90f8f5
SHA512 (adler2-2.0.1.crate) = 555b2b7ba6f8116acccd0bcd16ed34cc78162c81023cff31a8566ffcd456c03832089fca2d5b668ceaac4fe8f922d31aa9c487f226a36cace294ff4a219bd91d
@@ -126,9 +126,9 @@ Size (clap-4.6.1.crate) = 61836 bytes
BLAKE2s (clap_builder-4.6.0.crate) = 5d7686f002e18c9bb10f76b283fde443f2c2c50eb9a221f796e085bafe2a231f
SHA512 (clap_builder-4.6.0.crate) = 43b26377a8f15d29f8fdc9ada914888d87111084c5e205308d166789a27d91c2d8db6756b24d48ef8a293c92ca4c27dbf5433db21e336b2116d51377116fabd7
Size (clap_builder-4.6.0.crate) = 171122 bytes
-BLAKE2s (clap_complete-4.6.2.crate) = 2247bcd01d5044e6fe84a7a737c7785eec2cd1ad803a5b9e31bf7f6ee2a12306
-SHA512 (clap_complete-4.6.2.crate) = c031870668dad42f2dd789daee2a45017ef3adbed2dc4acdca9d004bfb1a5488eb2f4efab0ce3773102c834315d7d88deb9ae2963dab7c90d9f18089735e267a
-Size (clap_complete-4.6.2.crate) = 50291 bytes
+BLAKE2s (clap_complete-4.6.3.crate) = 79bb46e210d8e4680c918f22134500f84576e8294b93f807594be936708c71ed
+SHA512 (clap_complete-4.6.3.crate) = 27d0440eec2970b05a339f94bf9568ec3896a28928366c574a17db5e6f22e80ac7362aef2a535ec4a764e4ba44c4fc0697624ad278598fb303df13517b66798d
+Size (clap_complete-4.6.3.crate) = 50627 bytes
BLAKE2s (clap_derive-4.6.1.crate) = 945495dc8a3310d4f2fdb25a5060fd4d3ba238575b3eb16bd0076fc62979c053
SHA512 (clap_derive-4.6.1.crate) = ed210527cecfe3791b9d5af7279b337890b46b61fa05fa6979c88db1693ddf0ee5a4eb0904dd93e2da76f5c870963cc79b90d87cfc3cecf166a65364c16ffd06
Size (clap_derive-4.6.1.crate) = 33512 bytes
@@ -792,9 +792,9 @@ Size (rusticata-macros-4.1.0.crate) = 11
BLAKE2s (rustix-1.1.4.crate) = 47b462406ba74a3225cf16b2e8b75855857edd58915f4033d7387b67cc694948
SHA512 (rustix-1.1.4.crate) = 33619ed2434963a98b0846414656bcc4945ca0e9b883821869fe0cc86db4a74c6961ce1375963ae49c6b5044ad0536eda807dac1320209739c9d669bd80fd75c
Size (rustix-1.1.4.crate) = 425241 bytes
-BLAKE2s (rustls-0.23.39.crate) = 689117f5209f243d0a7c9fbcc6c54e3f50baf05f5e572d2b4c6a46efdf6a7b7e
-SHA512 (rustls-0.23.39.crate) = e53b5186cada311bada9f685db668fd607286952c99739b4018d90f8b49ea081bd7cdd26d0faa8481b2c93dd08bf794b959ead1b21c63b1f5e245337f5c57993
-Size (rustls-0.23.39.crate) = 372747 bytes
+BLAKE2s (rustls-0.23.40.crate) = 30e4093040e02358ec1bae8ff70890611db5893fdd861b8e014a8ad1ec7321ad
+SHA512 (rustls-0.23.40.crate) = d16484fd4904f4cf61e3a3612da54d91c1617d63725debceae56b46686a7fde6d5720961e7778dc3a17085c9e5fcd0ac3f2da2ed05f353ef071090dc86505aab
+Size (rustls-0.23.40.crate) = 373839 bytes
BLAKE2s (rustls-native-certs-0.8.3.crate) = 54b2e636a90d1b4e1d949adb15cfb9844a23c2cd689d9e4d75adbaf2b3ae2f22
SHA512 (rustls-native-certs-0.8.3.crate) = ffca026a5365a97e7a254faac2ceab188bd1cf51876a32e99b16bdf5902363c6416e8e28247f53864609d0f492646fead7b19328e376d0b8b2073e6fb3bc60a8
Size (rustls-native-certs-0.8.3.crate) = 30380 bytes
@@ -1311,9 +1311,9 @@ Size (writeable-0.6.2.crate) = 25181 byt
BLAKE2s (x509-parser-0.18.1.crate) = a5f2838a9880a6e075ead6b25c4078314403bbd5f9d59df631663b87ee4edee4
SHA512 (x509-parser-0.18.1.crate) = a30af92885d157b837832b7a3242fc8dbe5eacbce97ce5cb92a8c5e948324ec38150ca709734eb191a914f4f34d4d521ba313b72a57541a62cb254e8808535ef
Size (x509-parser-0.18.1.crate) = 102625 bytes
-BLAKE2s (xfr-0.9.12.tar.gz) = fd123eb4d3b80b3e59bd94ed5beed625325a960b4c52efa1a3fbc8830970cca1
-SHA512 (xfr-0.9.12.tar.gz) = 0656a86dcab065b4313f8fa6982e7e513b13e89fd35fe5e2f6f6ec85c501dbd9955630c4323efeea350d4d5ee709ec632acf707893ae1e5938726969a0896cb8
-Size (xfr-0.9.12.tar.gz) = 800865 bytes
+BLAKE2s (xfr-0.9.14.tar.gz) = c22b38187a8ecf5b1a6083d6f802183836df6f1aa7178cd0a525df04ec12130b
+SHA512 (xfr-0.9.14.tar.gz) = b8269a626bda125be580722daaa5083c4a3f8cdc2bdf96717f5c6eb4c4fd379a501b87f817eb8b9864dcf25f953215b75d7bf9b33048e910a37c13f2acd4878c
+Size (xfr-0.9.14.tar.gz) = 829652 bytes
BLAKE2s (yasna-0.5.2.crate) = 25391034f1d4c9715add3175629a012024dc2a34fa85b4dc85c4dce2c100742a
SHA512 (yasna-0.5.2.crate) = 7532b6d06b34b0a5e2b769c5d2647f910bec481d98482bf9cea212f1bd1466336d7cb117d0c2e240e7673b2825f1d091619f79814bad836d25cf3a6ca2be63e5
Size (yasna-0.5.2.crate) = 34859 bytes
Home |
Main Index |
Thread Index |
Old Index