defer device.peers.mutex.Unlock()
for key, peer := range device.peers.keyMap {
- println("rm", peer.String())
unsafeRemovePeer(device, peer, key)
}
return
}
- peer.device.log.Debug.Println("Starting:", peer.String())
+ device := peer.device
+ device.log.Debug.Println(peer.String(), ": Starting...")
// sanity check : these should be 0
}
device := peer.device
- device.log.Debug.Println("Stopping:", peer.String())
+ device.log.Debug.Println(peer.String(), ": Stopping...")
// stop & wait for ongoing peer routines
close(peer.queue.outbound)
close(peer.queue.inbound)
+ // close signals
+
+ peer.signal.newKeyPair.Close()
+ peer.signal.handshakeBegin.Close()
+ peer.signal.handshakeCompleted.Close()
+ peer.signal.flushNonceQueue.Close()
+
// clear key pairs
kp := &peer.keyPairs
peer.TimerEphemeralKeyCreated()
peer.NewKeyPair()
- logDebug.Println("Creating response message for", peer.String())
+ logDebug.Println(peer.String(), "Creating handshake response")
writer := bytes.NewBuffer(temp[:0])
binary.Write(writer, binary.LittleEndian, response)
if err == nil {
peer.TimerAnyAuthenticatedPacketTraversal()
} else {
- logError.Println("Failed to send response to:", peer.String(), err)
+ logError.Println(peer.String(), "Failed to send handshake response", err)
}
case MessageResponseType:
func (peer *Peer) RoutineSequentialReceiver() {
- defer peer.routines.stopping.Done()
-
device := peer.device
-
logInfo := device.log.Info
logError := device.log.Error
logDebug := device.log.Debug
- logDebug.Println("Routine, sequential receiver, started for peer", peer.String())
+
+ func() {
+ defer peer.routines.stopping.Done()
+ logDebug.Println(peer.String(), ": Routine, Sequential Receiver, Stopped")
+ }()
+
+ logDebug.Println(peer.String(), ": Routine, Sequential Receiver, Started")
peer.routines.starting.Done()
select {
case <-peer.routines.stop.Wait():
- logDebug.Println("Routine, sequential receiver, stopped for peer", peer.String())
return
case elem := <-peer.queue.inbound:
func (peer *Peer) RoutineNonce() {
var keyPair *KeyPair
- defer peer.routines.stopping.Done()
-
device := peer.device
logDebug := device.log.Debug
- logDebug.Println("Routine, nonce worker, started for peer", peer.String())
+
+ defer func() {
+ peer.routines.stopping.Done()
+ logDebug.Println(peer.String(), ": Routine, Nonce Worker, Stopped")
+ }()
peer.routines.starting.Done()
+ logDebug.Println(peer.String(), ": Routine, Nonce Worker, Started")
for {
NextPacket:
peer.signal.handshakeBegin.Send()
- logDebug.Println("Awaiting key-pair for", peer.String())
+ logDebug.Println(peer.String(), ": Awaiting key-pair")
select {
case <-peer.signal.newKeyPair.Wait():
+ logDebug.Println(peer.String(), ": Obtained awaited key-pair")
case <-peer.signal.flushNonceQueue.Wait():
- logDebug.Println("Clearing queue for", peer.String())
+ logDebug.Println(peer.String(), ": Flushing nonce queue")
peer.FlushNonceQueue()
goto NextPacket
case <-peer.routines.stop.Wait():
return
}
+func (s *Signal) Close() {
+ close(s.C)
+}
+
func (s *Signal) Disable() {
s.enabled.Set(false)
s.Clear()
/* Unblocks all listeners (forever)
*/
func (s Signal) Broadcast() {
- close(s.C)
+ if s.enabled.Get() {
+ close(s.C)
+ }
}
/* Wait for the signal
/* Starts the timer if not already pending
*/
func (t *Timer) Start(dur time.Duration) bool {
- set := t.pending.Swap(true)
- if !set {
+ if !t.pending.Swap(true) {
t.timer.Reset(dur)
return true
}
/* Stops the timer
*/
func (t *Timer) Stop() {
- set := t.pending.Swap(true)
- if set {
+ if t.pending.Swap(true) {
t.timer.Stop()
select {
case <-t.timer.C:
\r
interval := atomic.LoadUint64(&peer.persistentKeepaliveInterval)\r
if interval > 0 {\r
- logDebug.Println("Sending keep-alive to", peer.String())\r
+ logDebug.Println(peer.String(), ": Send keep-alive (persistent)")\r
peer.timer.keepalivePassive.Stop()\r
peer.SendKeepAlive()\r
}\r
\r
case <-peer.timer.keepalivePassive.Wait():\r
\r
- logDebug.Println("Sending keep-alive to", peer.String())\r
+ logDebug.Println(peer.String(), ": Send keep-alive (passive)")\r
\r
peer.SendKeepAlive()\r
\r
\r
case <-peer.timer.zeroAllKeys.Wait():\r
\r
- logDebug.Println("Clearing all key material for", peer.String())\r
+ logDebug.Println(peer.String(), ": Clear all key-material (timer event)")\r
\r
hs := &peer.handshake\r
hs.mutex.Lock()\r
// handshake timers\r
\r
case <-peer.timer.handshakeNew.Wait():\r
- logInfo.Println("Retrying handshake with", peer.String())\r
+ logInfo.Println(peer.String(), ": Retrying handshake (timer event)")\r
peer.signal.handshakeBegin.Send()\r
\r
case <-peer.timer.handshakeTimeout.Wait():\r
// send new handshake\r
\r
err := peer.sendNewHandshake()\r
+\r
if err != nil {\r
- logInfo.Println(\r
- "Failed to send handshake to peer:", peer.String(), "(", err, ")")\r
+ logInfo.Println(peer.String(), ": Failed to send handshake initiation", err)\r
+ } else {\r
+ logDebug.Println(peer.String(), ": Send handshake initiation (subsequent)")\r
}\r
\r
case <-peer.timer.handshakeDeadline.Wait():\r
\r
// clear all queued packets and stop keep-alive\r
\r
- logInfo.Println(\r
- "Handshake negotiation timed out for:", peer.String())\r
+ logInfo.Println(peer.String(), ": Handshake negotiation timed-out")\r
\r
peer.signal.flushNonceQueue.Send()\r
peer.timer.keepalivePersistent.Stop()\r
peer.signal.handshakeBegin.Disable()\r
\r
err := peer.sendNewHandshake()\r
+\r
if err != nil {\r
- logInfo.Println(\r
- "Failed to send handshake to peer:", peer.String(), "(", err, ")")\r
+ logInfo.Println(peer.String(), ": Failed to send handshake initiation", err)\r
+ } else {\r
+ logDebug.Println(peer.String(), ": Send handshake initiation (initial)")\r
}\r
\r
peer.timer.handshakeDeadline.Reset(RekeyAttemptTime)\r
\r
case <-peer.signal.handshakeCompleted.Wait():\r
\r
- logInfo.Println(\r
- "Handshake completed for:", peer.String())\r
+ logInfo.Println(peer.String(), ": Handshake completed")\r
\r
atomic.StoreInt64(\r
&peer.stats.lastHandshakeNano,\r