Replace > 0 counter guards with has_prev_rr flag for delta computation

The loss and goodput delta guards used prev_rr_highest_counter > 0 and
prev_rr_cum_bytes > 0, which conflates "never received a report" with
"received a report where the value was 0." Since Noise transport
counters start at 0, this is semantically wrong. Use a dedicated
has_prev_rr boolean flag instead. Fixes GitHub issue #14 (Bug B).
This commit is contained in:
Johnathan Corgan
2026-03-16 17:48:55 +00:00
parent 1020f90828
commit 6e03adde72
+7 -2
View File
@@ -45,6 +45,8 @@ pub struct MmpMetrics {
prev_rr_reorder: u32,
/// Time of previous ReceiverReport (for goodput rate computation).
prev_rr_time: Option<Instant>,
/// Whether we have a previous ReceiverReport for delta computation.
has_prev_rr: bool,
// --- State for reverse delivery ratio delta computation ---
/// Previous reverse-side cumulative packets received (our receiver state).
@@ -68,6 +70,7 @@ impl MmpMetrics {
self.prev_rr_ecn_ce = 0;
self.prev_rr_reorder = 0;
self.prev_rr_time = None;
self.has_prev_rr = false;
self.delivery_ratio_forward = 1.0;
self.prev_reverse_packets = 0;
self.prev_reverse_highest = 0;
@@ -93,6 +96,7 @@ impl MmpMetrics {
prev_rr_ecn_ce: 0,
prev_rr_reorder: 0,
prev_rr_time: None,
has_prev_rr: false,
prev_reverse_packets: 0,
prev_reverse_highest: 0,
has_prev_reverse: false,
@@ -133,7 +137,7 @@ impl MmpMetrics {
// --- Loss rate from cumulative counters ---
// Delta: frames the peer should have received vs. actually received
if self.prev_rr_highest_counter > 0 {
if self.has_prev_rr {
let counter_span = rr.highest_counter.saturating_sub(self.prev_rr_highest_counter);
let packets_delta = rr.cumulative_packets_recv.saturating_sub(self.prev_rr_cum_packets);
@@ -148,7 +152,7 @@ impl MmpMetrics {
}
// --- Goodput from cumulative bytes + time delta ---
if self.prev_rr_cum_bytes > 0 {
if self.has_prev_rr {
let bytes_delta = rr.cumulative_bytes_recv.saturating_sub(self.prev_rr_cum_bytes);
self.goodput_trend.update(bytes_delta as f64);
@@ -178,6 +182,7 @@ impl MmpMetrics {
self.prev_rr_ecn_ce = rr.ecn_ce_count;
self.prev_rr_reorder = rr.cumulative_reorder_count;
self.prev_rr_time = Some(now);
self.has_prev_rr = true;
!had_srtt && self.srtt.initialized()
}