aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josh@tailscale.com>2021-01-17 09:49:39 -0800
committerJason A. Donenfeld <Jason@zx2c4.com>2021-01-20 19:57:06 +0100
commita86492a5673983fe7755631996a23c2dc510808f (patch)
tree5444c653678b076799fa756a49a24d3521665e94
parentdevice: remove QueueOutboundElement.dropped (diff)
downloadwireguard-go-a86492a5673983fe7755631996a23c2dc510808f.tar.xz
wireguard-go-a86492a5673983fe7755631996a23c2dc510808f.zip
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>
-rw-r--r--device/receive.go35
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
}