From 6484d385f24e9cc52f6e64387139119465d2b844 Mon Sep 17 00:00:00 2001 From: tomitony123 Date: Wed, 16 Jul 2025 16:25:32 +0800 Subject: [PATCH 1/2] test tun --- tun_windows.go | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/tun_windows.go b/tun_windows.go index 9cb1e96d..3ce419b6 100644 --- a/tun_windows.go +++ b/tun_windows.go @@ -42,14 +42,29 @@ func New(options Options) (WinTun, error) { if options.FileDescriptor != 0 { return nil, os.ErrInvalid } - adapter, err := wintun.CreateAdapter(options.Name, TunnelType, generateGUIDByDeviceName(options.Name)) - if err != nil { - return nil, err + + var adapter *wintun.Adapter = nil + + // check tun device + netInterface, err := net.InterfaceByName(options.Name) + + if err == nil && netInterface.Name == options.Name { + adapter, err = wintun.OpenAdapter(options.Name) + if err != nil { + return nil, errors.New("open tun adapter failed: " + err.Error()) + } + } else { + adapter, err = wintun.CreateAdapter(options.Name, TunnelType, generateGUIDByDeviceName(options.Name)) + if err != nil { + return nil, errors.New("create tun adapter failed: " + err.Error()) + } } + nativeTun := &NativeTun{ adapter: adapter, options: options, } + session, err := adapter.StartSession(0x800000) if err != nil { return nil, err @@ -528,7 +543,7 @@ func (t *NativeTun) Close() error { windows.SetEvent(t.readWait) t.running.Wait() t.session.End() - t.adapter.Close() + //t.adapter.Close() if t.fwpmSession != 0 { winsys.FwpmEngineClose0(t.fwpmSession) } From 3f589e1f75d072ea366de971ea6ed1ba7743d80b Mon Sep 17 00:00:00 2001 From: tomitony123 Date: Wed, 16 Jul 2025 23:33:38 +0800 Subject: [PATCH 2/2] save --- internal/wintun/wintun_windows.go | 13 +++++++++---- tun_windows.go | 25 ++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/internal/wintun/wintun_windows.go b/internal/wintun/wintun_windows.go index a817e6c5..3b0e9ab6 100644 --- a/internal/wintun/wintun_windows.go +++ b/internal/wintun/wintun_windows.go @@ -6,7 +6,7 @@ package wintun import ( - "runtime" + "log" "syscall" "unsafe" @@ -30,6 +30,7 @@ var ( ) func closeAdapter(wintun *Adapter) { + log.Println("[tomi] closeAdapter") syscall.SyscallN(procWintunCloseAdapter.Addr(), 1, wintun.handle, 0, 0) } @@ -39,6 +40,7 @@ func closeAdapter(wintun *Adapter) { // deterministically. If it is set to nil, the GUID is chosen by the system at random, // and hence a new NLA entry is created for each new adapter. func CreateAdapter(name string, tunnelType string, requestedGUID *windows.GUID) (wintun *Adapter, err error) { + log.Println("[tomi] CreateAdapter") var name16 *uint16 name16, err = windows.UTF16PtrFromString(name) if err != nil { @@ -55,12 +57,13 @@ func CreateAdapter(name string, tunnelType string, requestedGUID *windows.GUID) return } wintun = &Adapter{handle: r0} - runtime.SetFinalizer(wintun, closeAdapter) + //runtime.SetFinalizer(wintun, closeAdapter) return } // OpenAdapter opens an existing Wintun adapter by name. func OpenAdapter(name string) (wintun *Adapter, err error) { + log.Println("[tomi] OpenAdapter") var name16 *uint16 name16, err = windows.UTF16PtrFromString(name) if err != nil { @@ -72,13 +75,15 @@ func OpenAdapter(name string) (wintun *Adapter, err error) { return } wintun = &Adapter{handle: r0} - runtime.SetFinalizer(wintun, closeAdapter) + //runtime.SetFinalizer(wintun, closeAdapter) return } // Close closes a Wintun adapter. func (wintun *Adapter) Close() (err error) { - runtime.SetFinalizer(wintun, nil) + log.Println("[tomi] CloseAdapter") + + //runtime.SetFinalizer(wintun, nil) r1, _, e1 := syscall.Syscall(procWintunCloseAdapter.Addr(), 1, wintun.handle, 0, 0) if r1 == 0 { err = e1 diff --git a/tun_windows.go b/tun_windows.go index 3ce419b6..61b49e83 100644 --- a/tun_windows.go +++ b/tun_windows.go @@ -4,6 +4,7 @@ import ( "crypto/md5" "errors" "fmt" + "log" "math" "net" "net/netip" @@ -38,6 +39,8 @@ type NativeTun struct { fwpmSession uintptr } +var logPrefix = "[tomi][tun]" + func New(options Options) (WinTun, error) { if options.FileDescriptor != 0 { return nil, os.ErrInvalid @@ -45,17 +48,31 @@ func New(options Options) (WinTun, error) { var adapter *wintun.Adapter = nil + logPrefix = "[tomi][tun:" + options.Name + "]" + log.Println(logPrefix, "New() start") + // check tun device netInterface, err := net.InterfaceByName(options.Name) + if err != nil { + log.Println(logPrefix, "find interface:", options.Name, ", failed:", err.Error()) + } + + if err == nil { + log.Println(logPrefix, "found interface:", netInterface.Name) + } if err == nil && netInterface.Name == options.Name { + log.Println(logPrefix, "tun device found, just opening it") adapter, err = wintun.OpenAdapter(options.Name) if err != nil { + log.Println(logPrefix, "open tun adapter failed: "+err.Error()) return nil, errors.New("open tun adapter failed: " + err.Error()) } } else { + log.Println(logPrefix, "tun device not found, create it") adapter, err = wintun.CreateAdapter(options.Name, TunnelType, generateGUIDByDeviceName(options.Name)) if err != nil { + log.Println(logPrefix, "create tun adapter failed: "+err.Error()) return nil, errors.New("create tun adapter failed: " + err.Error()) } } @@ -73,10 +90,13 @@ func New(options Options) (WinTun, error) { nativeTun.readWait = session.ReadWaitEvent() err = nativeTun.configure() if err != nil { + log.Println(logPrefix, "tun configure failed: "+err.Error()) session.End() - adapter.Close() + //adapter.Close() return nil, err } + + log.Println(logPrefix, "New() done") return nativeTun, nil } @@ -537,6 +557,7 @@ func (t *NativeTun) WriteVectorised(buffers []*buf.Buffer) error { } func (t *NativeTun) Close() error { + log.Println(logPrefix, "Close() start") var err error t.closeOnce.Do(func() { t.close.Store(1) @@ -551,6 +572,8 @@ func (t *NativeTun) Close() error { windnsapi.FlushResolverCache() } }) + + log.Println(logPrefix, "Close() done") return err }