diff options
| author | ache <ache@ache.one> | 2026-08-04 14:04:27 +0200 |
|---|---|---|
| committer | ache <ache@ache.one> | 2026-08-04 14:04:27 +0200 |
| commit | 47e9423ca0d637d6647c7fa93c65df7059d5b7fd (patch) | |
| tree | e5007c0541c5db37a5280749137501c099a71e63 /src | |
| parent | Add project description (diff) | |
Add stats computing
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 1 | ||||
| -rw-r--r-- | src/stats.rs | 70 |
2 files changed, 71 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs index 98660ff..9181bf6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ mod ip; mod pinger; mod print; mod state; +mod stats; use args::Args; use ip::parse_ip; use pinger::{spawn_ping, PingResult}; diff --git a/src/stats.rs b/src/stats.rs new file mode 100644 index 0000000..0829845 --- /dev/null +++ b/src/stats.rs @@ -0,0 +1,70 @@ +pub struct Stats { + /// Number of received packets (better names: `packets_received` or `received_count`) + pub received: usize, + /// Number of lost packets (total - received) (better names: `packets_lost` or `lost_count`) + pub lost: usize, + + // Round-Time Trip + pub min_rtt: u64, + pub max_rtt: u64, + pub avg_rtt: f64, + /// Mean absolute difference (deviation) from the average + pub mad_rtt: f64, + + // Time To Live + pub min_ttl: u32, + pub max_ttl: u32, + pub avg_ttl: f64, + /// Mean absolute difference (deviation) from the average + pub mad_ttl: f64, +} + +pub fn compute_stats(states: &[crate::state::State]) -> Option<Stats> { + let mut rtts: Vec<u64> = Vec::new(); + let mut ttls: Vec<u32> = Vec::new(); + + let received = states.iter().filter(|state| matches!(state, crate::state::State::Received { .. })).count(); + let lost = states.len() - received; + + if received == 0 { + return None; + } + + for state in states { + if let crate::state::State::Received { rtt, ttl } = state { + rtts.push(*rtt); + ttls.push(*ttl); + } + } + + // RTT stats + let min_rtt = rtts.iter().min().copied().unwrap(); + let max_rtt = rtts.iter().max().copied().unwrap(); + + let sum_rtt: u64 = rtts.iter().sum(); + let avg_rtt = sum_rtt as f64 / rtts.len() as f64; + + let mad_rtt: f64 = rtts.iter().map(|&x| (x as f64 - avg_rtt).abs()).sum::<f64>() / rtts.len() as f64; + + // TTL stats + let min_ttl = ttls.iter().min().copied().unwrap(); + let max_ttl = ttls.iter().max().copied().unwrap(); + + let sum_ttl: u32 = ttls.iter().sum(); + let avg_ttl = sum_ttl as f64 / ttls.len() as f64; + + let mad_ttl: f64 = ttls.iter().map(|&x| (x as f64 - avg_ttl).abs()).sum::<f64>() / ttls.len() as f64; + + Some(Stats { + received, + lost, + min_rtt, + max_rtt, + avg_rtt, + mad_rtt, + min_ttl, + max_ttl, + avg_ttl, + mad_ttl + }) +} |