aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2020-12-09 01:46:55 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2020-12-09 01:46:55 +0100
commit310ae107c346178c2d985792665dcd071ebc044b (patch)
treef44f3c7ba5c80c4eb559636fcca66697122ecdb5
parentf64d2a2bbc915338d8c77700883466be0e2dee87 (diff)
downloadwireguard-go-310ae107c346178c2d985792665dcd071ebc044b.tar.gz
wireguard-go-310ae107c346178c2d985792665dcd071ebc044b.zip
wintun: do not load dll in init()
This prevents linking to wintun.dll until it's actually needed, which should improve startup time. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--tun/wintun/dll_fromfile_windows.go4
-rw-r--r--tun/wintun/dll_fromrsrc_windows.go4
-rw-r--r--tun/wintun/dll_windows.go4
-rw-r--r--tun/wintun/session_windows.go16
-rw-r--r--tun/wintun/wintun_windows.go7
5 files changed, 21 insertions, 14 deletions
diff --git a/tun/wintun/dll_fromfile_windows.go b/tun/wintun/dll_fromfile_windows.go
index 525812b..f40f8b3 100644
--- a/tun/wintun/dll_fromfile_windows.go
+++ b/tun/wintun/dll_fromfile_windows.go
@@ -20,6 +20,7 @@ type lazyDLL struct {
Name string
mu sync.Mutex
module windows.Handle
+ onLoad func(d *lazyDLL)
}
func (d *lazyDLL) Load() error {
@@ -42,6 +43,9 @@ func (d *lazyDLL) Load() error {
}
atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.module)), unsafe.Pointer(module))
+ if d.onLoad != nil {
+ d.onLoad(d)
+ }
return nil
}
diff --git a/tun/wintun/dll_fromrsrc_windows.go b/tun/wintun/dll_fromrsrc_windows.go
index e6e393f..d107ba9 100644
--- a/tun/wintun/dll_fromrsrc_windows.go
+++ b/tun/wintun/dll_fromrsrc_windows.go
@@ -23,6 +23,7 @@ type lazyDLL struct {
Name string
mu sync.Mutex
module *memmod.Module
+ onLoad func(d *lazyDLL)
}
func (d *lazyDLL) Load() error {
@@ -50,6 +51,9 @@ func (d *lazyDLL) Load() error {
}
atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.module)), unsafe.Pointer(module))
+ if d.onLoad != nil {
+ d.onLoad(d)
+ }
return nil
}
diff --git a/tun/wintun/dll_windows.go b/tun/wintun/dll_windows.go
index 9f04f73..dd97bbc 100644
--- a/tun/wintun/dll_windows.go
+++ b/tun/wintun/dll_windows.go
@@ -12,8 +12,8 @@ import (
"unsafe"
)
-func newLazyDLL(name string) *lazyDLL {
- return &lazyDLL{Name: name}
+func newLazyDLL(name string, onLoad func(d *lazyDLL)) *lazyDLL {
+ return &lazyDLL{Name: name, onLoad: onLoad}
}
func (d *lazyDLL) NewProc(name string) *lazyProc {
diff --git a/tun/wintun/session_windows.go b/tun/wintun/session_windows.go
index 1619e5a..5b24fa5 100644
--- a/tun/wintun/session_windows.go
+++ b/tun/wintun/session_windows.go
@@ -30,12 +30,12 @@ type Packet struct {
}
var (
- procWintunAllocateSendPacket = modwintun.NewProc("WintunAllocateSendPacket").Addr()
+ procWintunAllocateSendPacket = modwintun.NewProc("WintunAllocateSendPacket")
procWintunEndSession = modwintun.NewProc("WintunEndSession")
procWintunGetReadWaitEvent = modwintun.NewProc("WintunGetReadWaitEvent")
- procWintunReceivePacket = modwintun.NewProc("WintunReceivePacket").Addr()
- procWintunReleaseReceivePacket = modwintun.NewProc("WintunReleaseReceivePacket").Addr()
- procWintunSendPacket = modwintun.NewProc("WintunSendPacket").Addr()
+ procWintunReceivePacket = modwintun.NewProc("WintunReceivePacket")
+ procWintunReleaseReceivePacket = modwintun.NewProc("WintunReleaseReceivePacket")
+ procWintunSendPacket = modwintun.NewProc("WintunSendPacket")
procWintunStartSession = modwintun.NewProc("WintunStartSession")
)
@@ -62,7 +62,7 @@ func (session Session) ReadWaitEvent() (handle windows.Handle) {
func (session Session) ReceivePacket() (packet []byte, err error) {
var packetSize uint32
- r0, _, e1 := syscall.Syscall(procWintunReceivePacket, 2, session.handle, uintptr(unsafe.Pointer(&packetSize)), 0)
+ r0, _, e1 := syscall.Syscall(procWintunReceivePacket.Addr(), 2, session.handle, uintptr(unsafe.Pointer(&packetSize)), 0)
if r0 == 0 {
err = e1
return
@@ -72,11 +72,11 @@ func (session Session) ReceivePacket() (packet []byte, err error) {
}
func (session Session) ReleaseReceivePacket(packet []byte) {
- syscall.Syscall(procWintunReleaseReceivePacket, 2, session.handle, uintptr(unsafe.Pointer(&packet[0])), 0)
+ syscall.Syscall(procWintunReleaseReceivePacket.Addr(), 2, session.handle, uintptr(unsafe.Pointer(&packet[0])), 0)
}
func (session Session) AllocateSendPacket(packetSize int) (packet []byte, err error) {
- r0, _, e1 := syscall.Syscall(procWintunAllocateSendPacket, 2, session.handle, uintptr(packetSize), 0)
+ r0, _, e1 := syscall.Syscall(procWintunAllocateSendPacket.Addr(), 2, session.handle, uintptr(packetSize), 0)
if r0 == 0 {
err = e1
return
@@ -86,7 +86,7 @@ func (session Session) AllocateSendPacket(packetSize int) (packet []byte, err er
}
func (session Session) SendPacket(packet []byte) {
- syscall.Syscall(procWintunSendPacket, 2, session.handle, uintptr(unsafe.Pointer(&packet[0])), 0)
+ syscall.Syscall(procWintunSendPacket.Addr(), 2, session.handle, uintptr(unsafe.Pointer(&packet[0])), 0)
}
// unsafeSlice updates the slice slicePtr to be a slice
diff --git a/tun/wintun/wintun_windows.go b/tun/wintun/wintun_windows.go
index e7ba8b6..afbbe76 100644
--- a/tun/wintun/wintun_windows.go
+++ b/tun/wintun/wintun_windows.go
@@ -34,7 +34,7 @@ type Adapter struct {
}
var (
- modwintun = newLazyDLL("wintun.dll")
+ modwintun = newLazyDLL("wintun.dll", setupLogger)
procWintunCreateAdapter = modwintun.NewProc("WintunCreateAdapter")
procWintunDeleteAdapter = modwintun.NewProc("WintunDeleteAdapter")
@@ -46,11 +46,10 @@ var (
procWintunGetAdapterName = modwintun.NewProc("WintunGetAdapterName")
procWintunGetRunningDriverVersion = modwintun.NewProc("WintunGetRunningDriverVersion")
procWintunSetAdapterName = modwintun.NewProc("WintunSetAdapterName")
- procWintunSetLogger = modwintun.NewProc("WintunSetLogger")
)
-func init() {
- syscall.Syscall(procWintunSetLogger.Addr(), 1, windows.NewCallback(func(level loggerLevel, msg *uint16) int {
+func setupLogger(dll *lazyDLL) {
+ syscall.Syscall(dll.NewProc("WintunSetLogger").Addr(), 1, windows.NewCallback(func(level loggerLevel, msg *uint16) int {
log.Println("[Wintun]", windows.UTF16PtrToString(msg))
return 0
}), 0, 0)