From a8aeddacab7dd4b9e634b4420867ea3b402cb858 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 10 Sep 2026 11:56:06 +0200 Subject: [PATCH] Let the media probe fragment on demand A seventh argument sets max_fragment_bytes on the sender. Without it a 3,392-byte payload leaves loopback as one datagram, and a matrix that claims to measure fragmentation measures nothing: the impair proxy's received count equalled the payload count in every cell. Co-Authored-By: Claude Fable 5.1 --- packages/cultnet-rs/examples/media_delivery_probe.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/cultnet-rs/examples/media_delivery_probe.rs b/packages/cultnet-rs/examples/media_delivery_probe.rs index e1f2ac97..397eb656 100644 --- a/packages/cultnet-rs/examples/media_delivery_probe.rs +++ b/packages/cultnet-rs/examples/media_delivery_probe.rs @@ -45,9 +45,10 @@ fn main() -> Result<()> { args.get(4).ok_or_else(|| anyhow!("payload bytes"))?.parse()?, args.get(5).ok_or_else(|| anyhow!("count"))?.parse()?, args.get(6).map(|v| v.parse()).transpose()?.unwrap_or(12.0), + args.get(7).map(|v| v.parse()).transpose()?, ), _ => Err(anyhow!( - "usage: media_delivery_probe recv | send " + "usage: media_delivery_probe recv | send [mbps] [max_fragment_bytes]" )), } } @@ -102,6 +103,7 @@ fn send( payload_bytes: usize, count: u64, target_mbps: f64, + max_fragment_bytes: Option, ) -> Result<()> { let socket = UdpSocket::bind("0.0.0.0:0")?; socket.set_nonblocking(true)?; @@ -109,6 +111,9 @@ fn send( CultNetRudpSocketTransportOptions::client("probe-send", socket, endpoint, 0x0BE0_0001); options.media_delivery = Some(delivery); options.media_reliable_expire_after_ms = None; + // Fragment above this many bytes so a lost datagram costs a whole payload; + // None sends each payload as one datagram, which loopback carries whole. + options.max_fragment_bytes = max_fragment_bytes; let mut transport = CultNetRudpSocketTransportConnection::new(options)?; transport.connect(b"probe".to_vec())?;