]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
device: flush peer queues before starting device
authorJason A. Donenfeld <Jason@zx2c4.com>
Tue, 9 Feb 2021 23:39:28 +0000 (00:39 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Tue, 9 Feb 2021 23:39:28 +0000 (00:39 +0100)
In case some old packets snuck in there before, this flushes before
starting afresh.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
device/channels.go
device/peer.go

index bf788682aeef1628dcd0d242906182e3a2d65314..6f4370a995bed3c20c6f1ddee8552a024e56ba91 100644 (file)
@@ -83,21 +83,23 @@ func newAutodrainingInboundQueue(device *Device) *autodrainingInboundQueue {
        q := &autodrainingInboundQueue{
                c: make(chan *QueueInboundElement, QueueInboundSize),
        }
-       runtime.SetFinalizer(q, func(q *autodrainingInboundQueue) {
-               for {
-                       select {
-                       case elem := <-q.c:
-                               elem.Lock()
-                               device.PutMessageBuffer(elem.buffer)
-                               device.PutInboundElement(elem)
-                       default:
-                               return
-                       }
-               }
-       })
+       runtime.SetFinalizer(q, device.flushInboundQueue)
        return q
 }
 
+func (device *Device) flushInboundQueue(q *autodrainingInboundQueue) {
+       for {
+               select {
+               case elem := <-q.c:
+                       elem.Lock()
+                       device.PutMessageBuffer(elem.buffer)
+                       device.PutInboundElement(elem)
+               default:
+                       return
+               }
+       }
+}
+
 type autodrainingOutboundQueue struct {
        c chan *QueueOutboundElement
 }
@@ -111,17 +113,19 @@ func newAutodrainingOutboundQueue(device *Device) *autodrainingOutboundQueue {
        q := &autodrainingOutboundQueue{
                c: make(chan *QueueOutboundElement, QueueOutboundSize),
        }
-       runtime.SetFinalizer(q, func(q *autodrainingOutboundQueue) {
-               for {
-                       select {
-                       case elem := <-q.c:
-                               elem.Lock()
-                               device.PutMessageBuffer(elem.buffer)
-                               device.PutOutboundElement(elem)
-                       default:
-                               return
-                       }
-               }
-       })
+       runtime.SetFinalizer(q, device.flushOutboundQueue)
        return q
 }
+
+func (device *Device) flushOutboundQueue(q *autodrainingOutboundQueue) {
+       for {
+               select {
+               case elem := <-q.c:
+                       elem.Lock()
+                       device.PutMessageBuffer(elem.buffer)
+                       device.PutOutboundElement(elem)
+               default:
+                       return
+               }
+       }
+}
index 40de59b636fec2ee2b2dc1bd35936b5fb9f11a25..a3b428a231d930cf8af438f4d8cf122c77d63169 100644 (file)
@@ -186,6 +186,8 @@ func (peer *Peer) Start() {
 
        peer.timersStart()
 
+       device.flushInboundQueue(peer.queue.inbound)
+       device.flushOutboundQueue(peer.queue.outbound)
        go peer.RoutineSequentialSender()
        go peer.RoutineSequentialReceiver()