aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--device/stats.go39
1 files changed, 39 insertions, 0 deletions
diff --git a/device/stats.go b/device/stats.go
new file mode 100644
index 0000000..6ccc501
--- /dev/null
+++ b/device/stats.go
@@ -0,0 +1,39 @@
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2017-2020 WireGuard LLC. All Rights Reserved.
+ */
+
+package device
+
+import (
+ "sync/atomic"
+ "time"
+)
+
+// PeerStats are connection statistics for a given Peer.
+type PeerStats struct {
+ RxBytes uint64
+ TxBytes uint64
+ LastHandshakeInitiated time.Time
+}
+
+// PeerStats returns statistics for the peer with public key pk,
+// and reports whether the peer lookup succeeded.
+func (device *Device) PeerStats(pk NoisePublicKey) (stats PeerStats, ok bool) {
+ device.peers.RLock()
+ peer := device.peers.keyMap[pk]
+ device.peers.RUnlock()
+
+ if peer == nil {
+ return PeerStats{}, false
+ }
+
+ peer.RLock()
+ defer peer.RUnlock()
+ stats = PeerStats{
+ RxBytes: atomic.LoadUint64(&peer.stats.rxBytes),
+ TxBytes: atomic.LoadUint64(&peer.stats.txBytes),
+ LastHandshakeInitiated: time.Unix(0, atomic.LoadInt64(&peer.stats.lastHandshakeNano)),
+ }
+ return stats, true
+}