@ -17,6 +17,8 @@ var (
offHandshake = getPeerStatsOffset ( "lastHandshakeNano" )
offHandshake = getPeerStatsOffset ( "lastHandshakeNano" )
offRxBytes = getPeerStatsOffset ( "rxBytes" )
offRxBytes = getPeerStatsOffset ( "rxBytes" )
offTxBytes = getPeerStatsOffset ( "txBytes" )
offTxBytes = getPeerStatsOffset ( "txBytes" )
offHandshakeAttempts = getPeerHandshakeAttemptsOffset ( )
)
)
func getPeerStatsOffset ( name string ) uintptr {
func getPeerStatsOffset ( name string ) uintptr {
@ -31,6 +33,22 @@ func getPeerStatsOffset(name string) uintptr {
return field . Offset
return field . Offset
}
}
func getPeerHandshakeAttemptsOffset ( ) uintptr {
peerType := reflect . TypeFor [ device . Peer ] ( )
field , ok := peerType . FieldByName ( "timers" )
if ! ok {
panic ( "no timers field in device.Peer" )
}
field2 , ok := field . Type . FieldByName ( "handshakeAttempts" )
if ! ok {
panic ( "no handshakeAttempts field in device.Peer.timers" )
}
if g , w := field2 . Type . String ( ) , "atomic.Uint32" ; g != w {
panic ( "unexpected type " + g + " of field handshakeAttempts in device.Peer.timers; want " + w )
}
return field . Offset + field2 . Offset
}
// PeerLastHandshakeNano returns the last handshake time in nanoseconds since the
// PeerLastHandshakeNano returns the last handshake time in nanoseconds since the
// unix epoch.
// unix epoch.
func PeerLastHandshakeNano ( peer * device . Peer ) int64 {
func PeerLastHandshakeNano ( peer * device . Peer ) int64 {
@ -46,3 +64,9 @@ func PeerRxBytes(peer *device.Peer) uint64 {
func PeerTxBytes ( peer * device . Peer ) uint64 {
func PeerTxBytes ( peer * device . Peer ) uint64 {
return ( * atomic . Uint64 ) ( unsafe . Add ( unsafe . Pointer ( peer ) , offTxBytes ) ) . Load ( )
return ( * atomic . Uint64 ) ( unsafe . Add ( unsafe . Pointer ( peer ) , offTxBytes ) ) . Load ( )
}
}
// PeerHandshakeAttempts returns the number of WireGuard handshake attempts
// made for the current handshake. It resets to zero before every new handshake.
func PeerHandshakeAttempts ( peer * device . Peer ) uint32 {
return ( * atomic . Uint32 ) ( unsafe . Add ( unsafe . Pointer ( peer ) , offHandshakeAttempts ) ) . Load ( )
}