aboutsummaryrefslogtreecommitdiff
path: root/peer.go
diff options
context:
space:
mode:
Diffstat (limited to 'peer.go')
-rw-r--r--peer.go71
1 files changed, 30 insertions, 41 deletions
diff --git a/peer.go b/peer.go
index 9703b58..0b947fd 100644
--- a/peer.go
+++ b/peer.go
@@ -15,6 +15,7 @@ import (
const (
PeerRoutineNumber = 4
+ EventInterval = 10 * time.Millisecond
)
type Peer struct {
@@ -40,26 +41,23 @@ type Peer struct {
nextKeepalive time.Time
}
+ event struct {
+ dataSent *Event
+ dataReceived *Event
+ anyAuthenticatedPacketReceived *Event
+ anyAuthenticatedPacketTraversal *Event
+ handshakeCompleted *Event
+ handshakePushDeadline *Event
+ handshakeBegin *Event
+ ephemeralKeyCreated *Event
+ newKeyPair *Event
+ }
+
signal struct {
- newKeyPair Signal // size 1, new key pair was generated
- handshakeCompleted Signal // size 1, handshake completed
- handshakeBegin Signal // size 1, begin new handshake begin
- flushNonceQueue Signal // size 1, empty queued packets
- messageSend Signal // size 1, message was send to peer
- messageReceived Signal // size 1, authenticated message recv
+ flushNonceQueue chan struct{} // size 0, empty queued packets
}
timer struct {
-
- // state related to WireGuard timers
-
- keepalivePersistent Timer // set for persistent keep-alive
- keepalivePassive Timer // set upon receiving messages
- zeroAllKeys Timer // zero all key material
- handshakeNew Timer // begin a new handshake (stale)
- handshakeDeadline Timer // complete handshake timeout
- handshakeTimeout Timer // current handshake message timeout
-
sendLastMinuteHandshake AtomicBool
needAnotherKeepalive AtomicBool
}
@@ -113,12 +111,17 @@ func (device *Device) NewPeer(pk NoisePublicKey) (*Peer, error) {
peer.device = device
peer.isRunning.Set(false)
- peer.timer.zeroAllKeys = NewTimer()
- peer.timer.keepalivePersistent = NewTimer()
- peer.timer.keepalivePassive = NewTimer()
- peer.timer.handshakeNew = NewTimer()
- peer.timer.handshakeDeadline = NewTimer()
- peer.timer.handshakeTimeout = NewTimer()
+ // events
+
+ peer.event.dataSent = newEvent(EventInterval)
+ peer.event.dataReceived = newEvent(EventInterval)
+ peer.event.anyAuthenticatedPacketReceived = newEvent(EventInterval)
+ peer.event.anyAuthenticatedPacketTraversal = newEvent(EventInterval)
+ peer.event.handshakeCompleted = newEvent(EventInterval)
+ peer.event.handshakePushDeadline = newEvent(EventInterval)
+ peer.event.handshakeBegin = newEvent(EventInterval)
+ peer.event.ephemeralKeyCreated = newEvent(EventInterval)
+ peer.event.newKeyPair = newEvent(EventInterval)
// map public key
@@ -200,7 +203,7 @@ func (peer *Peer) Start() {
}
device := peer.device
- device.log.Debug.Println(peer.String() + ": Starting...")
+ device.log.Debug.Println(peer, ": Starting...")
// sanity check : these should be 0
@@ -209,10 +212,7 @@ func (peer *Peer) Start() {
// prepare queues and signals
- peer.signal.newKeyPair = NewSignal()
- peer.signal.handshakeBegin = NewSignal()
- peer.signal.handshakeCompleted = NewSignal()
- peer.signal.flushNonceQueue = NewSignal()
+ peer.signal.flushNonceQueue = make(chan struct{})
peer.queue.nonce = make(chan *QueueOutboundElement, QueueOutboundSize)
peer.queue.outbound = make(chan *QueueOutboundElement, QueueOutboundSize)
@@ -247,7 +247,7 @@ func (peer *Peer) Stop() {
}
device := peer.device
- device.log.Debug.Println(peer.String() + ": Stopping...")
+ device.log.Debug.Println(peer, ": Stopping...")
// stop & wait for ongoing peer routines
@@ -255,15 +255,6 @@ func (peer *Peer) Stop() {
peer.routines.stop.Broadcast()
peer.routines.stopping.Wait()
- // stop timers
-
- peer.timer.keepalivePersistent.Stop()
- peer.timer.keepalivePassive.Stop()
- peer.timer.zeroAllKeys.Stop()
- peer.timer.handshakeNew.Stop()
- peer.timer.handshakeDeadline.Stop()
- peer.timer.handshakeTimeout.Stop()
-
// close queues
close(peer.queue.nonce)
@@ -272,10 +263,8 @@ func (peer *Peer) Stop() {
// close signals
- peer.signal.newKeyPair.Close()
- peer.signal.handshakeBegin.Close()
- peer.signal.handshakeCompleted.Close()
- peer.signal.flushNonceQueue.Close()
+ close(peer.signal.flushNonceQueue)
+ peer.signal.flushNonceQueue = nil
// clear key pairs