summaryrefslogtreecommitdiffhomepage
path: root/tun/tun_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'tun/tun_windows.go')
-rw-r--r--tun/tun_windows.go5
1 files changed, 5 insertions, 0 deletions
diff --git a/tun/tun_windows.go b/tun/tun_windows.go
index 8fc5174..b16dbb7 100644
--- a/tun/tun_windows.go
+++ b/tun/tun_windows.go
@@ -9,6 +9,7 @@ import (
"errors"
"fmt"
"os"
+ "sync"
"sync/atomic"
"time"
"unsafe"
@@ -40,6 +41,7 @@ type NativeTun struct {
forcedMTU int
rate rateJuggler
rings *wintun.RingDescriptor
+ writeLock sync.Mutex
}
const WintunPool = wintun.Pool("WireGuard")
@@ -219,6 +221,9 @@ func (tun *NativeTun) Write(buff []byte, offset int) (int, error) {
tun.rate.update(uint64(packetSize))
alignedPacketSize := wintun.PacketAlign(uint32(unsafe.Sizeof(wintun.PacketHeader{})) + packetSize)
+ tun.writeLock.Lock()
+ defer tun.writeLock.Unlock()
+
buffHead := atomic.LoadUint32(&tun.rings.Receive.Ring.Head)
if buffHead >= wintun.PacketCapacity {
return 0, os.ErrClosed