mirror of
https://git.zx2c4.com/wireguard-go
synced 2024-11-14 16:55:15 +01:00
device: add PeerStats
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>
This commit is contained in:
parent
23b2790aa0
commit
cda9f6e73a
39
device/stats.go
Normal file
39
device/stats.go
Normal file
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user