diff options
author | Josh Bleecher Snyder <josh@tailscale.com> | 2021-01-17 09:49:39 -0800 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-01-20 19:57:06 +0100 |
commit | a86492a5673983fe7755631996a23c2dc510808f (patch) | |
tree | 5444c653678b076799fa756a49a24d3521665e94 /device/receive.go | |
parent | 7ee95e053c280796ecfb5533000915e7daa13f69 (diff) |
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 <josh@tailscale.com>
Diffstat (limited to 'device/receive.go')
-rw-r--r-- | device/receive.go | 35 |
1 files 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 } |