diff options
author | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2017-07-08 23:51:26 +0200 |
---|---|---|
committer | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2017-07-08 23:51:26 +0200 |
commit | 4ad62aaa6aa269f08c0fdc9c139e6d5417e21746 (patch) | |
tree | 2105f65bc61b0fb842ac44c11a81150a8bb9a909 /src/peer.go | |
parent | 5c1ccbddf0c6fdfd98cb3204c1cd4726862855f2 (diff) |
Improved timer state machine
Diffstat (limited to 'src/peer.go')
-rw-r--r-- | src/peer.go | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/peer.go b/src/peer.go index fadc43f..c8dc5c0 100644 --- a/src/peer.go +++ b/src/peer.go @@ -20,25 +20,36 @@ type Peer struct { txBytes uint64 rxBytes uint64 time struct { + mutex sync.RWMutex lastSend time.Time // last send message lastHandshake time.Time // last completed handshake + nextKeepalive time.Time } signal struct { newKeyPair chan struct{} // (size 1) : a new key pair was generated handshakeBegin chan struct{} // (size 1) : request that a new handshake be started ("queue handshake") handshakeCompleted chan struct{} // (size 1) : handshake completed flushNonceQueue chan struct{} // (size 1) : empty queued packets + messageSend chan struct{} // (size 1) : a message was send to the peer + messageReceived chan struct{} // (size 1) : an authenticated message was received stop chan struct{} // (size 0) : close to stop all goroutines for peer } timer struct { - sendKeepalive *time.Timer - handshakeTimeout *time.Timer + /* Both keep-alive timers acts as one (see timers.go) + * They are kept seperate to simplify the implementation. + */ + keepalivePersistent *time.Timer // set for persistent keepalives + keepaliveAcknowledgement *time.Timer // set upon recieving messages + zeroAllKeys *time.Timer // zero all key material after RejectAfterTime*3 } queue struct { nonce chan *QueueOutboundElement // nonce / pre-handshake queue outbound chan *QueueOutboundElement // sequential ordering of work inbound chan *QueueInboundElement // sequential ordering of work } + flags struct { + keepaliveWaiting int32 + } mac MACStatePeer } @@ -51,7 +62,12 @@ func (device *Device) NewPeer(pk NoisePublicKey) *Peer { peer.mac.Init(pk) peer.device = device - peer.timer.sendKeepalive = stoppedTimer() + + peer.timer.keepalivePersistent = NewStoppedTimer() + peer.timer.keepaliveAcknowledgement = NewStoppedTimer() + peer.timer.zeroAllKeys = NewStoppedTimer() + + peer.flags.keepaliveWaiting = AtomicFalse // assign id for debugging @@ -82,7 +98,7 @@ func (device *Device) NewPeer(pk NoisePublicKey) *Peer { peer.queue.outbound = make(chan *QueueOutboundElement, QueueOutboundSize) peer.queue.inbound = make(chan *QueueInboundElement, QueueInboundSize) - // prepare signaling + // prepare signaling & routines peer.signal.stop = make(chan struct{}) peer.signal.newKeyPair = make(chan struct{}, 1) @@ -90,9 +106,8 @@ func (device *Device) NewPeer(pk NoisePublicKey) *Peer { peer.signal.handshakeCompleted = make(chan struct{}, 1) peer.signal.flushNonceQueue = make(chan struct{}, 1) - // outbound pipeline - go peer.RoutineNonce() + go peer.RoutineTimerHandler() go peer.RoutineHandshakeInitiator() go peer.RoutineSequentialSender() go peer.RoutineSequentialReceiver() |