summaryrefslogtreecommitdiffhomepage
path: root/talpid-wireguard/src/wireguard_kernel
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2023-08-10 12:16:18 +0200
committerDavid Lönnhager <david.l@mullvad.net>2023-08-31 13:25:40 +0200
commitf33aecedd72c0067a6d48b4e87f1eb36cbe48272 (patch)
tree427653a6482ba8d71390eebd3eab89d59a234a26 /talpid-wireguard/src/wireguard_kernel
parent41b4f8021fd8401e535585c3b12ad5ac6f5c982a (diff)
downloadmullvadvpn-f33aecedd72c0067a6d48b4e87f1eb36cbe48272.tar.xz
mullvadvpn-f33aecedd72c0067a6d48b4e87f1eb36cbe48272.zip
Hide implementation-specific wg stats parsers
Diffstat (limited to 'talpid-wireguard/src/wireguard_kernel')
-rw-r--r--talpid-wireguard/src/wireguard_kernel/mod.rs1
-rw-r--r--talpid-wireguard/src/wireguard_kernel/stats.rs32
2 files changed, 33 insertions, 0 deletions
diff --git a/talpid-wireguard/src/wireguard_kernel/mod.rs b/talpid-wireguard/src/wireguard_kernel/mod.rs
index 7a64ee3f65..15eaad4c24 100644
--- a/talpid-wireguard/src/wireguard_kernel/mod.rs
+++ b/talpid-wireguard/src/wireguard_kernel/mod.rs
@@ -18,6 +18,7 @@ use std::{ffi::CString, net::IpAddr};
use tokio_stream::StreamExt;
mod parsers;
+mod stats;
pub mod wg_message;
use wg_message::{DeviceMessage, DeviceNla};
diff --git a/talpid-wireguard/src/wireguard_kernel/stats.rs b/talpid-wireguard/src/wireguard_kernel/stats.rs
new file mode 100644
index 0000000000..8604e8243f
--- /dev/null
+++ b/talpid-wireguard/src/wireguard_kernel/stats.rs
@@ -0,0 +1,32 @@
+use super::wg_message::{DeviceMessage, DeviceNla, PeerNla};
+use crate::stats::{Stats, StatsMap};
+
+impl Stats {
+ pub fn parse_device_message(message: &DeviceMessage) -> StatsMap {
+ let mut map = StatsMap::new();
+
+ for nla in &message.nlas {
+ if let DeviceNla::Peers(peers) = nla {
+ for msg in peers {
+ let mut tx_bytes = 0;
+ let mut rx_bytes = 0;
+ let mut pub_key = None;
+
+ for nla in &msg.0 {
+ match nla {
+ PeerNla::TxBytes(bytes) => tx_bytes = *bytes,
+ PeerNla::RxBytes(bytes) => rx_bytes = *bytes,
+ PeerNla::PublicKey(key) => pub_key = Some(*key),
+ _ => continue,
+ }
+ }
+ if let Some(key) = pub_key {
+ map.insert(key, Stats { tx_bytes, rx_bytes });
+ }
+ }
+ }
+ }
+
+ map
+ }
+}