]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
Moved ratelimiter to internal package
authorMathias Hall-Andersen <mathias@hall-andersen.dk>
Sun, 11 Feb 2018 21:53:39 +0000 (22:53 +0100)
committerMathias Hall-Andersen <mathias@hall-andersen.dk>
Sun, 11 Feb 2018 21:53:39 +0000 (22:53 +0100)
device.go
internal/ratelimiter/ratelimiter.go [moved from ratelimiter.go with 79% similarity]
internal/ratelimiter/ratelimiter_test.go [moved from ratelimiter_test.go with 99% similarity]
internal/tai64n/tai64n.go [moved from internal/tai64n/tai64.go with 100% similarity]
internal/tai64n/tai64n_test.go [new file with mode: 0644]
timers.go

index e288ebeca4eb78a8aca6d1865042913ac34614bf..9f93f2144b8e19a4e64d8080fd436bd02ed1ccf2 100644 (file)
--- a/device.go
+++ b/device.go
@@ -1,6 +1,7 @@
 package main
 
 import (
+       "git.zx2c4.com/wireguard-go/internal/ratelimiter"
        "runtime"
        "sync"
        "sync/atomic"
@@ -50,7 +51,7 @@ type Device struct {
 
        rate struct {
                underLoadUntil atomic.Value
-               limiter        Ratelimiter
+               limiter        ratelimiter.Ratelimiter
        }
 
        pool struct {
@@ -300,7 +301,6 @@ func NewDevice(tun TUNDevice, logger *Logger) *Device {
 
        go device.RoutineReadFromTUN()
        go device.RoutineTUNEventReader()
-       go device.rate.limiter.RoutineGarbageCollector(device.signal.stop)
 
        return device
 }
@@ -355,6 +355,7 @@ func (device *Device) Close() {
        device.BindClose()
        device.isUp.Set(false)
        device.RemoveAllPeers()
+       device.rate.limiter.Close()
        device.log.Info.Println("Interface closed")
 }
 
similarity index 79%
rename from ratelimiter.go
rename to internal/ratelimiter/ratelimiter.go
index 6e5f005fa52fd6882c83fdc7486fa633d047acc9..f9fc6731d0c230c3effc74b8f3f681a7e63c47ba 100644 (file)
@@ -1,4 +1,4 @@
-package main
+package ratelimiter
 
 /* Copyright (C) 2015-2017 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. */
 
@@ -26,21 +26,48 @@ type RatelimiterEntry struct {
 }
 
 type Ratelimiter struct {
-       mutex              sync.RWMutex
-       lastGarbageCollect time.Time
-       tableIPv4          map[[net.IPv4len]byte]*RatelimiterEntry
-       tableIPv6          map[[net.IPv6len]byte]*RatelimiterEntry
+       mutex     sync.RWMutex
+       stop      chan struct{}
+       tableIPv4 map[[net.IPv4len]byte]*RatelimiterEntry
+       tableIPv6 map[[net.IPv6len]byte]*RatelimiterEntry
+}
+
+func (rate *Ratelimiter) Close() {
+       rate.mutex.Lock()
+       defer rate.mutex.Unlock()
+
+       if rate.stop != nil {
+               close(rate.stop)
+       }
 }
 
 func (rate *Ratelimiter) Init() {
        rate.mutex.Lock()
        defer rate.mutex.Unlock()
+
+       if rate.stop != nil {
+               close(rate.stop)
+       }
+
+       rate.stop = make(chan struct{})
        rate.tableIPv4 = make(map[[net.IPv4len]byte]*RatelimiterEntry)
        rate.tableIPv6 = make(map[[net.IPv6len]byte]*RatelimiterEntry)
-       rate.lastGarbageCollect = time.Now()
+
+       go func() {
+               timer := time.NewTimer(time.Second)
+               for {
+                       select {
+                       case <-rate.stop:
+                               return
+                       case <-timer.C:
+                               rate.garbageCollectEntries()
+                               timer.Reset(time.Second)
+                       }
+               }
+       }()
 }
 
-func (rate *Ratelimiter) GarbageCollectEntries() {
+func (rate *Ratelimiter) garbageCollectEntries() {
        rate.mutex.Lock()
 
        // remove unused IPv4 entries
@@ -66,19 +93,6 @@ func (rate *Ratelimiter) GarbageCollectEntries() {
        rate.mutex.Unlock()
 }
 
-func (rate *Ratelimiter) RoutineGarbageCollector(stop Signal) {
-       timer := time.NewTimer(time.Second)
-       for {
-               select {
-               case <-stop.Wait():
-                       return
-               case <-timer.C:
-                       rate.GarbageCollectEntries()
-                       timer.Reset(time.Second)
-               }
-       }
-}
-
 func (rate *Ratelimiter) Allow(ip net.IP) bool {
        var entry *RatelimiterEntry
        var KeyIPv4 [net.IPv4len]byte
similarity index 99%
rename from ratelimiter_test.go
rename to internal/ratelimiter/ratelimiter_test.go
index 13b6a230397869362372012bf65b50c3619af2ed..a6f618b6a3f560fc2f2a9ee2ebb2e288077541ab 100644 (file)
@@ -1,4 +1,4 @@
-package main
+package ratelimiter
 
 import (
        "net"
diff --git a/internal/tai64n/tai64n_test.go b/internal/tai64n/tai64n_test.go
new file mode 100644 (file)
index 0000000..389b65c
--- /dev/null
@@ -0,0 +1,21 @@
+package tai64n
+
+import (
+       "testing"
+       "time"
+)
+
+/* Testing the essential property of the timestamp
+ * as used by WireGuard.
+ */
+func TestMonotonic(t *testing.T) {
+       old := Now()
+       for i := 0; i < 10000; i++ {
+               time.Sleep(time.Nanosecond)
+               next := Now()
+               if !next.After(old) {
+                       t.Error("TAI64N, not monotonically increasing on nano-second scale")
+               }
+               old = next
+       }
+}
index 70e907c17377cc9baad83f9d0ef18249c15fd640..1240c219c89ae30a1ae8d7c30eb76ee080996408 100644 (file)
--- a/timers.go
+++ b/timers.go
@@ -120,7 +120,7 @@ func (peer *Peer) TimerAnyAuthenticatedPacketTraversal() {
  */
 func (peer *Peer) TimerHandshakeComplete() {
        peer.signal.handshakeCompleted.Send()
-       peer.device.log.Info.Println("Negotiated new handshake for", peer.String())
+       peer.device.log.Info.Println(peer.String(), ": New handshake completed")
 }
 
 /* Event: