handshakeDeadline Timer // complete handshake timeout
handshakeTimeout Timer // current handshake message timeout
- sendLastMinuteHandshake bool
- needAnotherKeepalive bool
+ sendLastMinuteHandshake AtomicBool
+ needAnotherKeepalive AtomicBool
}
queue struct {
/* Returns a short string identifier for logging
*/
func (peer *Peer) String() string {
- if peer.endpoint == nil {
- return fmt.Sprintf(
- "peer(unknown %s)",
- base64.StdEncoding.EncodeToString(peer.handshake.remoteStatic[:]),
- )
- }
return fmt.Sprintf(
- "peer(%s %s)",
- peer.endpoint.DstToString(),
+ "peer(%s)",
base64.StdEncoding.EncodeToString(peer.handshake.remoteStatic[:]),
)
}
package main
import (
+ "sync"
"time"
)
type Timer struct {
- pending AtomicBool
+ mutex sync.Mutex
+ pending bool
timer *time.Timer
}
/* Starts the timer if not already pending
*/
func (t *Timer) Start(dur time.Duration) bool {
- if !t.pending.Swap(true) {
+ t.mutex.Lock()
+ defer t.mutex.Unlock()
+
+ started := !t.pending
+ if started {
t.timer.Reset(dur)
- return true
}
- return false
+ return started
}
-/* Stops the timer
- */
func (t *Timer) Stop() {
- if t.pending.Swap(true) {
- t.timer.Stop()
- select {
- case <-t.timer.C:
- default:
- }
+ t.mutex.Lock()
+ defer t.mutex.Unlock()
+
+ t.timer.Stop()
+ select {
+ case <-t.timer.C:
+ default:
}
- t.pending.Set(false)
+ t.pending = false
}
func (t *Timer) Pending() bool {
- return t.pending.Get()
+ t.mutex.Lock()
+ defer t.mutex.Unlock()
+
+ return t.pending
}
func (t *Timer) Reset(dur time.Duration) {
- t.pending.Set(false)
- t.Start(dur)
+ t.mutex.Lock()
+ defer t.mutex.Unlock()
+ t.timer.Reset(dur)
}
func (t *Timer) Wait() <-chan time.Time {
}
func NewTimer() (t Timer) {
- t.pending.Set(false)
- t.timer = time.NewTimer(0)
+ t.pending = false
+ t.timer = time.NewTimer(time.Hour)
t.timer.Stop()
select {
case <-t.timer.C:
* NOTE: Not thread safe, but called by sequential receiver!
*/
func (peer *Peer) KeepKeyFreshReceiving() {
- if peer.timer.sendLastMinuteHandshake {
+ if peer.timer.sendLastMinuteHandshake.Get() {
return
}
kp := peer.keyPairs.Current()
send := nonce > RekeyAfterMessages || time.Now().Sub(kp.created) > RekeyAfterTimeReceiving
if send {
// do a last minute attempt at initiating a new handshake
- peer.timer.sendLastMinuteHandshake = true
+ peer.timer.sendLastMinuteHandshake.Set(true)
peer.signal.handshakeBegin.Send()
}
}
*/
func (peer *Peer) TimerDataReceived() {
if !peer.timer.keepalivePassive.Start(KeepaliveTimeout) {
- peer.timer.needAnotherKeepalive = true
+ peer.timer.needAnotherKeepalive.Set(true)
}
}
peer.SendKeepAlive()
- if peer.timer.needAnotherKeepalive {
- peer.timer.needAnotherKeepalive = false
+ if peer.timer.needAnotherKeepalive.Swap(false) {
peer.timer.keepalivePassive.Reset(KeepaliveTimeout)
}
peer.timer.handshakeDeadline.Stop()
peer.signal.handshakeBegin.Enable()
- peer.timer.sendLastMinuteHandshake = false
+ peer.timer.sendLastMinuteHandshake.Set(false)
}
}
}
}
func (device *Device) RoutineTUNEventReader() {
+ setUp := false
logInfo := device.log.Info
logError := device.log.Error
}
}
- if event&TUNEventUp != 0 && !device.isUp.Get() {
+ if event&TUNEventUp != 0 && !setUp {
logInfo.Println("Interface set up")
+ setUp = true
device.Up()
}
- if event&TUNEventDown != 0 && device.isUp.Get() {
+ if event&TUNEventDown != 0 && setUp {
logInfo.Println("Interface set down")
+ setUp = false
device.Down()
}
}