diff --git a/src/config.go b/src/config.go index d92e8d7..ad4ac97 100644 --- a/src/config.go +++ b/src/config.go @@ -10,6 +10,7 @@ import ( "strings" "sync/atomic" "syscall" + "time" ) const ( @@ -58,8 +59,15 @@ func ipcGetOperation(device *Device, socket *bufio.ReadWriter) *IPCError { if peer.endpoint != nil { send("endpoint=" + peer.endpoint.String()) } - send(fmt.Sprintf("tx_bytes=%d", peer.txBytes)) - send(fmt.Sprintf("rx_bytes=%d", peer.rxBytes)) + + nano := atomic.LoadInt64(&peer.stats.lastHandshakeNano) + secs := nano / time.Second.Nanoseconds() + nano %= time.Second.Nanoseconds() + + send(fmt.Sprintf("last_handshake_time_sec=%d", secs)) + send(fmt.Sprintf("last_handshake_time_nsec=%d", nano)) + send(fmt.Sprintf("tx_bytes=%d", peer.stats.txBytes)) + send(fmt.Sprintf("rx_bytes=%d", peer.stats.rxBytes)) send(fmt.Sprintf("persistent_keepalive_interval=%d", atomic.LoadUint64(&peer.persistentKeepaliveInterval), )) diff --git a/src/peer.go b/src/peer.go index 408c605..8eea929 100644 --- a/src/peer.go +++ b/src/peer.go @@ -19,9 +19,12 @@ type Peer struct { keyPairs KeyPairs handshake Handshake device *Device - txBytes uint64 - rxBytes uint64 - time struct { + stats struct { + txBytes uint64 // bytes send to peer (endpoint) + rxBytes uint64 // bytes received from peer + lastHandshakeNano int64 // nano seconds since epoch + } + time struct { mutex sync.RWMutex lastSend time.Time // last send message lastHandshake time.Time // last completed handshake diff --git a/src/receive.go b/src/receive.go index e063c99..d97ca41 100644 --- a/src/receive.go +++ b/src/receive.go @@ -540,7 +540,7 @@ func (peer *Peer) RoutineSequentialReceiver() { return } - atomic.AddUint64(&peer.rxBytes, uint64(len(elem.packet))) + atomic.AddUint64(&peer.stats.rxBytes, uint64(len(elem.packet))) device.addToInboundQueue(device.queue.inbound, elem) }() } diff --git a/src/send.go b/src/send.go index ca42934..7cdb806 100644 --- a/src/send.go +++ b/src/send.go @@ -379,7 +379,8 @@ func (peer *Peer) RoutineSequentialSender() { if err != nil { return } - atomic.AddUint64(&peer.txBytes, uint64(len(elem.packet))) + + atomic.AddUint64(&peer.stats.txBytes, uint64(len(elem.packet))) peer.TimerResetKeepalive() }() diff --git a/src/timers.go b/src/timers.go index fd2bdc3..2454414 100644 --- a/src/timers.go +++ b/src/timers.go @@ -52,6 +52,10 @@ func (peer *Peer) KeepKeyFreshReceiving() { func (peer *Peer) EventHandshakeComplete() { peer.device.log.Info.Println("Negotiated new handshake for", peer.String()) peer.timer.zeroAllKeys.Reset(RejectAfterTime * 3) + atomic.StoreInt64( + &peer.stats.lastHandshakeNano, + time.Now().UnixNano(), + ) signalSend(peer.signal.handshakeCompleted) }