From 441720811e7b390c733027f075cdd5165025ac8c Mon Sep 17 00:00:00 2001 From: Nils Andreas Svee Date: Wed, 14 Oct 2026 11:12:50 +0700 Subject: [PATCH] fix(irtt): use effective RTT for latency fallback --- src/baseliner.rs | 1 + src/measurement/icmp.rs | 2 ++ src/measurement/irtt.rs | 3 +++ src/measurement/model.rs | 8 +++++++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/baseliner.rs b/src/baseliner.rs index c80e5a5..8363050 100644 --- a/src/baseliner.rs +++ b/src/baseliner.rs @@ -289,6 +289,7 @@ mod tests { }, started_at: received_at, observed_at: received_at, + round_trip: None, one_way: Some(OneWayLatency { uplink: SignedDuration::from_millis(up_time as i64), downlink: SignedDuration::from_millis(down_time as i64), diff --git a/src/measurement/icmp.rs b/src/measurement/icmp.rs index 3d96b3b..cbdeb59 100644 --- a/src/measurement/icmp.rs +++ b/src/measurement/icmp.rs @@ -326,6 +326,7 @@ impl IcmpEngine { stream: probe.stream, started_at: probe.sent_at, observed_at, + round_trip: None, one_way: None, }) } @@ -385,6 +386,7 @@ impl IcmpEngine { stream: probe.stream, started_at: probe.sent_at, observed_at, + round_trip: None, one_way: Some(OneWayLatency { uplink: SignedDuration::from_millis(uplink_ms), downlink: SignedDuration::from_millis(downlink_ms), diff --git a/src/measurement/irtt.rs b/src/measurement/irtt.rs index ac24058..b25bd90 100644 --- a/src/measurement/irtt.rs +++ b/src/measurement/irtt.rs @@ -255,6 +255,7 @@ impl IrttEngine { sent_at, received_at, one_way, + rtt, .. } => { let Some(stream) = stream else { @@ -265,6 +266,8 @@ impl IrttEngine { stream, started_at: sent_at.mono, observed_at: received_at.mono, + round_trip: i64::try_from(rtt.effective.as_nanos()) + .ok().map(SignedDuration::from_nanos), one_way: one_way.and_then(map_one_way), }; diff --git a/src/measurement/model.rs b/src/measurement/model.rs index aab7fb5..643afec 100644 --- a/src/measurement/model.rs +++ b/src/measurement/model.rs @@ -121,6 +121,9 @@ pub struct MeasurementObservation { /// Local monotonic time at which the result was observed. pub observed_at: Instant, + /// Measured round-trip latency when it differs from elapsed local time. + pub round_trip: Option, + /// Directional timing, when the measurement mechanism can provide it. pub one_way: Option, } @@ -131,7 +134,10 @@ impl MeasurementObservation { } pub fn rtt_ms(&self) -> f64 { - self.rtt().as_secs_f64() * 1000.0 + self.round_trip + .map(SignedDuration::as_secs_f64) + .unwrap_or_else(|| self.rtt().as_secs_f64()) + * 1000.0 } }