From eb6728400ba656990aa4518dc4f5f2a6f0f19f8e Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 18 Apr 2018 07:24:33 +0200 Subject: [PATCH] Use simple 16-bit integer for persistent keepalive Races for this aren't a huge problem. --- peer.go | 3 ++- timers.go | 6 +++--- uapi.go | 10 +++------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/peer.go b/peer.go index 3a4f5f2..8acdfbc 100644 --- a/peer.go +++ b/peer.go @@ -13,13 +13,14 @@ const ( ) type Peer struct { - persistentKeepaliveInterval uint64 isRunning AtomicBool mutex sync.RWMutex keyPairs KeyPairs handshake Handshake device *Device endpoint Endpoint + persistentKeepaliveInterval uint16 + _ uint32 // padding for alignment stats struct { txBytes uint64 // bytes send to peer (endpoint) diff --git a/timers.go b/timers.go index 76dffb9..e118c38 100644 --- a/timers.go +++ b/timers.go @@ -105,7 +105,7 @@ func (peer *Peer) TimerAnyAuthenticatedPacketReceived() { * Push persistent keep-alive into the future */ func (peer *Peer) TimerAnyAuthenticatedPacketTraversal() { - interval := atomic.LoadUint64(&peer.persistentKeepaliveInterval) + interval := peer.persistentKeepaliveInterval if interval > 0 { duration := time.Duration(interval) * time.Second peer.timer.keepalivePersistent.Reset(duration) @@ -199,7 +199,7 @@ func (peer *Peer) RoutineTimerHandler() { peer.timer.handshakeNew.Stop() peer.timer.zeroAllKeys.Stop() - interval := atomic.LoadUint64(&peer.persistentKeepaliveInterval) + interval := peer.persistentKeepaliveInterval if interval > 0 { duration := time.Duration(interval) * time.Second peer.timer.keepalivePersistent.Reset(duration) @@ -225,7 +225,7 @@ func (peer *Peer) RoutineTimerHandler() { case <-peer.timer.keepalivePersistent.Wait(): - interval := atomic.LoadUint64(&peer.persistentKeepaliveInterval) + interval := peer.persistentKeepaliveInterval if interval > 0 { logDebug.Println(peer.String(), ": Send keep-alive (persistent)") peer.timer.keepalivePassive.Stop() diff --git a/uapi.go b/uapi.go index 01cdab6..c795b73 100644 --- a/uapi.go +++ b/uapi.go @@ -84,9 +84,7 @@ func ipcGetOperation(device *Device, socket *bufio.ReadWriter) *IPCError { 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), - )) + send(fmt.Sprintf("persistent_keepalive_interval=%d", peer.persistentKeepaliveInterval)) for _, ip := range device.routing.table.AllowedIPs(peer) { send("allowed_ip=" + ip.String()) @@ -322,10 +320,8 @@ func ipcSetOperation(device *Device, socket *bufio.ReadWriter) *IPCError { return &IPCError{Code: ipcErrorInvalid} } - old := atomic.SwapUint64( - &peer.persistentKeepaliveInterval, - secs, - ) + old := peer.persistentKeepaliveInterval + peer.persistentKeepaliveInterval = uint16(secs) // send immediate keep-alive