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: Fri Jun 12 12:31:37 UTC 2026
Modified Files:
pkgsrc/net/xfr: Makefile cargo-depends.mk distinfo
Log Message:
net/xfr: update to 0.9.18
[0.9.18] - 2026-06-11
Added
CSV interval rows carry the bidirectional split (issue #56 follow-up) — --csv interval output gains bytes_sent, bytes_received, throughput_send_mbps, and throughput_recv_mbps columns, matching
the fields the CSV summary row and final JSON already expose. The new columns are appended at the end of the row so existing parsers that index columns by position keep working; unidirectional tests
leave them empty, like the summary row already does.
Single-port UDP data plane (single_port_udp_v1 capability) (issue #63) — all per-stream UDP test traffic now flows to the server's main port (default 5201/UDP) instead of per-stream ephemeral
ports, so firewalls only need one UDP port open. Per stream, the client sends a small token-bearing hello datagram to the main port (retried at 100 ms up to ~5 s, then the test fails loudly); the
server creates a fresh UDP socket, binds it to the same port via SO_REUSEADDR+SO_REUSEPORT, connect()s it to the client's source address, and acks from that socket. The kernel's UDP lookup scores
connected sockets above the wildcard, so line-rate data rides the connected socket and the shared socket only ever sees hellos. The per-test token (16 random bytes, returned in TestAck.udp_token)
routes hellos to the right test across NAT and concurrent clients. The main UDP port is owned by the quinn QUIC endpoint; it now gets a tee implementing quinn::AsyncUdpSocket that delegates to the
runtime
's quinn-udp-backed socket (GSO/GRO/ECN paths intact) and diverts only xfr hello datagrams. The classifier (hello framing first, then QUIC long-header bit 0x80, then short-header fixed bit 0x40) is
made sound by disabling QUIC-bit greasing on the server endpoint — RFC 9287 greasing is permission-based, so not advertising it stops compliant peers from clearing the fixed bit toward us. The
hello/ack magic b"\x00XFR" lives in the 0b00 first-byte space QUIC can never use. With --no-quic, a plain shared socket serves the hello lane instead. The server advertises the capability only after
a startup self-test proves the running kernel actually routes a connected-socket datagram past a same-port wildcard (SO_REUSEPORT semantics vary by platform); on failure — and against older peers —
the legacy per-stream ephemeral-port path is used unchanged. Single-port is the default when both peers advertise, mirroring single_port_tcp, and covers upload, download, bidir, and --probe-mtu.
--connect-timeout <DURATION> — bound the control-connection establishment (TCP connect or QUIC handshake) and fail with a clear error instead of waiting on OS defaults, which against a dead or
filtered server can mean minutes. Off by default (behavior unchanged unless set); aimed at CI and scripted runs.
Changed
QUIC tests now warn about ignored flags — -b/--bitrate, -w/--window, --congestion, and --tcp-nodelay have never applied to QUIC (pacing and socket tuning are not implemented on that path), but
the client accepted them silently, so a rate-limited or buffer-tuned QUIC test ran untuned with no indication. Each now prints a warning, matching what --dscp already did. Actually implementing QUIC
pacing remains on the roadmap.
The server log now answers "which client was that" — every control connection logs the client software string and protocol version, plus a line listing any server capabilities the client doesn't
share (i.e., the features that silently fall back for that session). Previously the log showed only the peer address.
--tcp-nodelay now propagates to the server — the flag previously shaped only client-created sockets; the client now forwards the request in TestStart.tcp_nodelay (wire-additive, absent = false)
and the server ORs it into its data-socket configuration. The server has always enabled TCP_NODELAY on its data sockets, so the OR cannot regress existing behavior — the field makes the client's
intent explicit on the wire and keeps it honored if the server-side default ever changes. Older servers ignore the field, an acceptable degradation since they already run with nodelay on (same call
as window_size; no new capability).
Maintenance
Control-channel skew CI test recalibrated — packet captures showed the test's FIFO-bloat profile has two stable delivery rhythms (~2 s batches of 2 interval lines, ~4 s batches of 3) on a
correctly functioning NODELAY control channel, and which rhythm a run locks onto is decided by startup phase; the single-port UDP handshake shifted that phase and made the previously-rare rhythm
dominant. The assertion now targets what the #70 bug actually does (total collapse to one timestamp: 5+ lines in one bunch or fewer than 3 distinct timestamps) instead of a threshold that sat between
the two physical rhythms. Findings documented in KNOWN_ISSUES.md.
Library API (pre-1.0 break)
client::ClientConfig gains connect_timeout: Option<Duration> (Default is None); struct-literal constructors must supply it.
protocol::ControlMessage::TestStart gains tcp_nodelay: bool (serde-default, omitted when false); struct-literal constructors must supply it.
protocol::ControlMessage::TestAck gains udp_token: Option<String> (serde-default, wire-additive); struct-literal constructors must supply it.
udp::receive_udp and udp::respond_mtu_probes gain a trailing single_port_ack: Option<[u8; 24]> parameter.
New public items: udp::{UdpHelloPacket, SharedSocketLane, classify_shared_datagram, single_port_udp_handshake, respond_single_port_hellos, encode_hello_token, parse_hello_token, UDP_HELLO_*};
net::{create_shared_udp_socket, create_connected_udp_same_port, single_port_udp_self_test}; quic::XfrHelloDatagram; protocol::{SINGLE_PORT_UDP_CAPABILITY, supported_capabilities,
supported_capabilities_without}; ControlMessage::{server_hello_with_capabilities, server_hello_with_auth_and_capabilities}.
quic::create_server_endpoint gains a trailing xfr_hello_tx: Option<mpsc::Sender<XfrHelloDatagram>> parameter.
[0.9.17] - 2026-06-11
Added
Path-MTU probe: --probe-mtu (issue #64) — discovers the largest UDP payload that survives the path in each direction, instead of running a throughput test. The client walks a ladder of common
wire MTUs (576, 1280, 1492, 1500, 4352, 9000, 9216) and binary-searches the gap, RFC 8899 style, with the IP don't-fragment flag set so middleboxes must drop oversized packets rather than quietly
fragment them. Each probe gets two replies from the server: a small ack (proves the client→server direction) and a same-size echo (proves server→client), so an asymmetric path shows up as
ack-without-echo — per-direction attribution was brettowe's suggestion on the issue. Output is a per-size table plus the largest surviving payload and derived path MTU per direction; --json carries
the full report. Requires a server advertising the new mtu_probe_v1 capability (the client refuses old servers up front, since they'd silently swallow probes). Validated in a netns harness with a
1500-byt
e middle hop on a jumbo-framed client (test-mtu-probe-ns.sh, now a CI job).
Changed
Zero-copy TCP sends are now on by default (issue #33 follow-up) — sendfile(2) needs only Linux 3.17+ and every unsupported configuration (non-Linux, old kernels, old servers, sockets that reject
sendfile) already falls back to regular writes, so there is no reason to make users opt in to the cheaper send path. -Z/--zerocopy is kept: passing it explicitly upgrades the silent fallback to a
warning (non-Linux client sends, or a -R/--bidir server that doesn't advertise zerocopy_v1). New --no-zerocopy flag opts out. Payload semantics are unchanged, and on links where the sender isn't
CPU-bound results are identical — where it is, throughput now reflects the network rather than the sender's copy overhead.
Fixed
TUI sparkline keeps advancing when the control channel stalls (issue #93, split from #70) — bars were appended only on full TCP Interval arrivals, and upload-mode saturation stalls exactly that
channel, so the graph froze while the udp_feedback_v1 loss counter stayed live. tick() now synthesizes a bar at the regular cadence once two report intervals pass without one, taking loss tint from
feedback deltas not yet rendered into any bar and repeating the last known bar height (a zero-height bar draws no glyph, leaving nothing to tint — the flat tinted plateau reads as "no fresh
throughput, loss still arriving"). Cumulative loss is tracked against what's been drawn, so a resuming Interval never re-counts loss already shown during the stall. Normal 1 Hz delivery is visually
unchanged.
Bidir UDP no longer reports the server's send rate as download throughput (issue #91) — same root cause as the -R fix in 0.9.16 (issue #81), on the other code path: in bidirectional UDP tests the
download half of the split (bytes_received, throughput_recv_mbps) was computed from the server's send-side counters, which track the requested -b rate rather than what arrived. The client now
overlays its own receive counters onto both the live split and the final result, and the combined totals are rebuilt from the two corrected halves (upload was always receiver-truth — the server
counts what it actually received). Per-stream rows still show the server's combined view; splitting those per-direction needs wire changes and is out of scope here.
Library API (pre-1.0 break)
client::ClientConfig.zerocopy is now a ZerocopyMode enum (Off / Auto / Requested) instead of bool; Default is Auto. Auto and Requested behave identically except Requested warns on downgrade.
tcp::TcpConfig.zerocopy stays bool.
New public module probe (ProbePacket, SizeSearch, MtuProbeReport, run_probe); client::ClientConfig gains mtu_probe: bool; protocol::ControlMessage::TestStart gains mtu_probe: bool and
protocol::TestResult gains mtu_probe: Option<MtuProbeReport> (both serde-default, wire-additive); udp::respond_mtu_probes and net::set_dont_fragment are new.
To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 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.13 pkgsrc/net/xfr/Makefile:1.14
--- pkgsrc/net/xfr/Makefile:1.13 Wed Jun 10 19:25:33 2026
+++ pkgsrc/net/xfr/Makefile Fri Jun 12 12:31:37 2026
@@ -1,6 +1,6 @@
-# $NetBSD: Makefile,v 1.13 2026/06/10 19:25:33 pin Exp $
+# $NetBSD: Makefile,v 1.14 2026/06/12 12:31:37 pin Exp $
-DISTNAME= xfr-0.9.16
+DISTNAME= xfr-0.9.18
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.13 pkgsrc/net/xfr/cargo-depends.mk:1.14
--- pkgsrc/net/xfr/cargo-depends.mk:1.13 Wed Jun 10 19:25:33 2026
+++ pkgsrc/net/xfr/cargo-depends.mk Fri Jun 12 12:31:37 2026
@@ -1,4 +1,4 @@
-# $NetBSD: cargo-depends.mk,v 1.13 2026/06/10 19:25:33 pin Exp $
+# $NetBSD: cargo-depends.mk,v 1.14 2026/06/12 12:31:37 pin Exp $
CARGO_CRATE_DEPENDS+= adler2-2.0.1
CARGO_CRATE_DEPENDS+= aho-corasick-1.1.4
Index: pkgsrc/net/xfr/distinfo
diff -u pkgsrc/net/xfr/distinfo:1.13 pkgsrc/net/xfr/distinfo:1.14
--- pkgsrc/net/xfr/distinfo:1.13 Wed Jun 10 19:25:33 2026
+++ pkgsrc/net/xfr/distinfo Fri Jun 12 12:31:37 2026
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.13 2026/06/10 19:25:33 pin Exp $
+$NetBSD: distinfo,v 1.14 2026/06/12 12:31:37 pin Exp $
BLAKE2s (adler2-2.0.1.crate) = 4d391e0fcde91c7435ee9a5503fee4a5346f549f1b45e482ce3e1e151d90f8f5
SHA512 (adler2-2.0.1.crate) = 555b2b7ba6f8116acccd0bcd16ed34cc78162c81023cff31a8566ffcd456c03832089fca2d5b668ceaac4fe8f922d31aa9c487f226a36cace294ff4a219bd91d
@@ -1335,9 +1335,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.16.tar.gz) = 421b6c3047fac67f9a232fb687ad53e2c419143c48792bf5637b6931dad77734
-SHA512 (xfr-0.9.16.tar.gz) = 16a63dfb65bc7d94cccb2906250bb3c74492a5772a5f4d480d24c535150044b03385991d263673b116301cd2c00569744dcbfa99bee6de35edeb343386c70d0d
-Size (xfr-0.9.16.tar.gz) = 840178 bytes
+BLAKE2s (xfr-0.9.18.tar.gz) = 5945e6c480b88ae04708b4f4cbe1a7f26142e98c700fd850815a2611dce41a8e
+SHA512 (xfr-0.9.18.tar.gz) = 93e04d40c14bb4576bf8f8d9ab0e5359c0526515eb9ba10b4a97313c053a50f5be91604362c0e0f7e773242317dbf1923b7bef0fa4a2e4745b9b7fef1340d1e7
+Size (xfr-0.9.18.tar.gz) = 891132 bytes
BLAKE2s (yasna-0.6.0.crate) = 591c8e37bd6f6a71763c470031399e5b09b787a541994f5fc78b95a226aba11a
SHA512 (yasna-0.6.0.crate) = 63aa1399a2f24d60981612dde74ebaf4868caff4cac4e06117985925efdb7e06411630a86dcf0731f36d97c7131343113b56f3a104db8f2a2f80be72c0a40ef9
Size (yasna-0.6.0.crate) = 40598 bytes
Home |
Main Index |
Thread Index |
Old Index