commit 5078b3d01584d786d632eca19fa6ccdd57813fdb from: Thomas Böhler date: Wed Dec 7 14:13:31 2022 UTC Check for packet loss Implements: https://todo.sr.ht/~witcher/bachelor-thesis/1 commit - e7d90f974045001043e2aa0741f19aceac52e6ff commit + 5078b3d01584d786d632eca19fa6ccdd57813fdb blob - ca2042ff7c5d30a846a792812497f0d1790a58eb blob + 5d7a590bcafa165dfc90e4c281cf91f92f0101fc --- src/main.rs +++ src/main.rs @@ -23,6 +23,8 @@ static STATE: Lazy> = Lazy::new struct ThroughputState { time_passed: Instant, write_len: usize, + next_seq: u8, + packets_missed: usize, } impl ThroughputState { @@ -30,9 +32,21 @@ impl ThroughputState { Self { time_passed: Instant::now(), write_len: 0, + next_seq: 0, + packets_missed: 0, } } + pub fn recv(&mut self, payload: &[u8]) { + self.add_write_len(payload.len()); + + if self.next_seq != payload[0] { + self.packets_missed += 1; + } + + self.next_seq = self.next_seq.wrapping_add(1); + } + pub fn get_time_passed(&self) -> Duration { self.time_passed.elapsed() } @@ -44,11 +58,15 @@ impl ThroughputState { pub fn get_write_len(&self) -> usize { self.write_len } + + pub fn get_packets_missed(&self) -> usize { + self.packets_missed + } } fn handle_buffer_write(payload: Vec) { let mut state = STATE.lock().unwrap(); - state.add_write_len(payload.len()); + state.recv(&payload); } fn setup(ble: &mut ble_esp32c3::Ble) { @@ -104,13 +122,15 @@ fn main() { let s = state.lock().unwrap(); let passed = s.get_time_passed().as_secs().max(1); let len = s.get_write_len(); + let lost = s.get_packets_missed(); drop(s); log::info!( - "Throughput: {} kbit/s ({} / {})", + "Throughput: {} kbit/s ({} bit/{} s) ({} packets lost)", (len * 8) / 1000 / passed as usize, len, - passed + passed, + lost ); } else { log::info!("Not connected");