From a86492a5673983fe7755631996a23c2dc510808f Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 17 Jan 2021 09:49:39 -0800 Subject: device: remove QueueInboundElement.dropped Now that we block when enqueueing to the decryption queue, there is only one case in which we "drop" a inbound element, when decryption fails. We can use a simple, obvious, sync-free sentinel for that, elem.packet == nil. Also, we can return the message buffer to the pool slightly later, which further simplifies the code. Signed-off-by: Josh Bleecher Snyder --- device/receive.go | 35 +++++------------------------------ 1 file changed, 5 insertions(+), 30 deletions(-) diff --git a/device/receive.go b/device/receive.go index 972b342..701e308 100644 --- a/device/receive.go +++ b/device/receive.go @@ -30,7 +30,6 @@ type QueueHandshakeElement struct { } type QueueInboundElement struct { - dropped int32 sync.Mutex buffer *[MaxMessageSize]byte packet []byte @@ -50,14 +49,6 @@ func (elem *QueueInboundElement) clearPointers() { elem.endpoint = nil } -func (elem *QueueInboundElement) Drop() { - atomic.StoreInt32(&elem.dropped, AtomicTrue) -} - -func (elem *QueueInboundElement) IsDropped() bool { - return atomic.LoadInt32(&elem.dropped) == AtomicTrue -} - func (device *Device) addToHandshakeQueue(queue chan QueueHandshakeElement, elem QueueHandshakeElement) bool { select { case queue <- elem: @@ -180,7 +171,6 @@ func (device *Device) RoutineReceiveIncoming(IP int, bind conn.Bind) { elem.packet = packet elem.buffer = buffer elem.keypair = keypair - elem.dropped = AtomicFalse elem.endpoint = endpoint elem.counter = 0 elem.Mutex = sync.Mutex{} @@ -243,19 +233,11 @@ func (device *Device) RoutineDecryption() { logDebug.Println("Routine: decryption worker - started") for elem := range device.queue.decryption.c { - // check if dropped - - if elem.IsDropped() { - continue - } - // split message into fields - counter := elem.packet[MessageTransportOffsetCounter:MessageTransportOffsetContent] content := elem.packet[MessageTransportOffsetContent:] // decrypt and release to consumer - var err error elem.counter = binary.LittleEndian.Uint64(counter) // copy counter to nonce @@ -267,8 +249,7 @@ func (device *Device) RoutineDecryption() { nil, ) if err != nil { - elem.Drop() - device.PutMessageBuffer(elem.buffer) + elem.packet = nil } elem.Unlock() } @@ -484,9 +465,7 @@ func (peer *Peer) RoutineSequentialReceiver() { logDebug.Println(peer, "- Routine: sequential receiver - stopped") peer.routines.stopping.Done() if elem != nil { - if !elem.IsDropped() { - device.PutMessageBuffer(elem.buffer) - } + device.PutMessageBuffer(elem.buffer) device.PutInboundElement(elem) } }() @@ -495,9 +474,7 @@ func (peer *Peer) RoutineSequentialReceiver() { for { if elem != nil { - if !elem.IsDropped() { - device.PutMessageBuffer(elem.buffer) - } + device.PutMessageBuffer(elem.buffer) device.PutInboundElement(elem) elem = nil } @@ -513,15 +490,13 @@ func (peer *Peer) RoutineSequentialReceiver() { } // wait for decryption - elem.Lock() - - if elem.IsDropped() { + if elem.packet == nil { + // decryption failed continue } // check for replay - if !elem.keypair.replayFilter.ValidateCounter(elem.counter, RejectAfterMessages) { continue } -- cgit v1.2.3-59-g8ed1b