]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
device: add PeerStats js/peer-stats
authorJosh Bleecher Snyder <josh@tailscale.com>
Tue, 26 Jan 2021 18:54:59 +0000 (10:54 -0800)
committerJosh Bleecher Snyder <josh@tailscale.com>
Tue, 26 Jan 2021 21:29:34 +0000 (13:29 -0800)
Per-peer statistics are the sort of thing
clients refresh very frequently, for UIs.

They are available via UAPI, but the serialization
and deserialization is quite heavy for frequent use.

This commit adds a very cheap, direct means of
retrieving peer stats.

Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
device/stats.go [new file with mode: 0644]

diff --git a/device/stats.go b/device/stats.go
new file mode 100644 (file)
index 0000000..6ccc501
--- /dev/null
@@ -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
+}