Races for this aren't a huge problem.
)
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)
* 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)
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)
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()
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())
return &IPCError{Code: ipcErrorInvalid}
}
- old := atomic.SwapUint64(
- &peer.persistentKeepaliveInterval,
- secs,
- )
+ old := peer.persistentKeepaliveInterval
+ peer.persistentKeepaliveInterval = uint16(secs)
// send immediate keep-alive