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.go38
1 files changed, 22 insertions, 16 deletions
diff --git a/tun/tun_windows.go b/tun/tun_windows.go
index 543482e..613bc9f 100644
--- a/tun/tun_windows.go
+++ b/tun/tun_windows.go
@@ -11,6 +11,7 @@ import (
"io"
"os"
"sync"
+ "sync/atomic"
"time"
"unsafe"
@@ -38,16 +39,17 @@ type exchgBufWrite struct {
}
type NativeTun struct {
- wt *wintun.Wintun
- tunFileRead *os.File
- tunFileWrite *os.File
- tunLock sync.Mutex
- close bool
- rdBuff *exchgBufRead
- wrBuff *exchgBufWrite
- events chan Event
- errors chan error
- forcedMTU int
+ wt *wintun.Wintun
+ tunFileRead *os.File
+ tunFileWrite *os.File
+ haveRegisteredWriteBuffer int32
+ tunLock sync.Mutex
+ close bool
+ rdBuff *exchgBufRead
+ wrBuff *exchgBufWrite
+ events chan Event
+ errors chan error
+ forcedMTU int
}
func packetAlign(size uint32) uint32 {
@@ -140,12 +142,7 @@ func (tun *NativeTun) openTUN() error {
}
return err
}
- firstSize := (*uint32)(unsafe.Pointer(&tun.wrBuff.data[0]))
- saved := *firstSize
- *firstSize = 0
- // Set the maximum buffer length with an invalid write.
- tun.tunFileWrite.Write(tun.wrBuff.data[:])
- *firstSize = saved
+ atomic.StoreInt32(&tun.haveRegisteredWriteBuffer, 0)
}
return nil
}
@@ -324,6 +321,15 @@ func (tun *NativeTun) Flush() error {
return err
}
+ if atomic.CompareAndSwapInt32(&tun.haveRegisteredWriteBuffer, 0, 1) {
+ firstSize := (*uint32)(unsafe.Pointer(&tun.wrBuff.data[0]))
+ saved := *firstSize
+ *firstSize = 0
+ // Set the maximum buffer length with an invalid write.
+ tun.tunFileWrite.Write(tun.wrBuff.data[:])
+ *firstSize = saved
+ }
+
for {
_, err = file.Write(tun.wrBuff.data[:tun.wrBuff.offset])
if err != nil {