Skip to content

Commit 4aea1b6

Browse files
committed
windows: simplify auto-redirect startup and TUN GUID resolution
1 parent 80f9f8c commit 4aea1b6

1 file changed

Lines changed: 34 additions & 49 deletions

File tree

redirect_windows.go

Lines changed: 34 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,29 @@ func (r *autoRedirect) Start() error {
7777
if !r.enableIPv4 && !r.enableIPv6 {
7878
return E.New("no address configured")
7979
}
80+
err := r.startRedirect()
81+
if err != nil {
82+
common.Close(
83+
common.PtrOrNil(r.redirectServer),
84+
common.PtrOrNil(r.driverManager),
85+
)
86+
r.redirectServer = nil
87+
r.driverManager = nil
88+
return err
89+
}
90+
r.updateLocalAddresses()
91+
if r.networkMonitor != nil {
92+
r.networkListener = r.networkMonitor.RegisterCallback(func() {
93+
r.updateLocalAddresses()
94+
})
95+
}
96+
for i := 0; i < r.workerCount; i++ {
97+
go r.preMatchWorker()
98+
}
99+
return nil
100+
}
80101

102+
func (r *autoRedirect) startRedirect() error {
81103
manager, err := winredirect.NewManager()
82104
if err != nil {
83105
return E.Cause(err, "create driver manager")
@@ -86,22 +108,16 @@ func (r *autoRedirect) Start() error {
86108

87109
err = manager.Install()
88110
if err != nil {
89-
manager.Close()
90-
r.driverManager = nil
91111
return E.Cause(err, "install driver")
92112
}
93113

94114
err = manager.Start()
95115
if err != nil {
96-
manager.Close()
97-
r.driverManager = nil
98116
return E.Cause(err, "start driver")
99117
}
100118

101119
err = manager.OpenDevice()
102120
if err != nil {
103-
manager.Close()
104-
r.driverManager = nil
105121
return E.Cause(err, "open driver device")
106122
}
107123

@@ -115,18 +131,11 @@ func (r *autoRedirect) Start() error {
115131
r.redirectServer = server
116132
err = server.Start()
117133
if err != nil {
118-
r.redirectServer = nil
119-
manager.Close()
120-
r.driverManager = nil
121134
return E.Cause(err, "start redirect server")
122135
}
123136

124137
tunGUID, err := r.resolveTunInterfaceGUID()
125138
if err != nil {
126-
server.Close()
127-
manager.Close()
128-
r.redirectServer = nil
129-
r.driverManager = nil
130139
return E.Cause(err, "resolve tun interface")
131140
}
132141

@@ -137,33 +146,14 @@ func (r *autoRedirect) Start() error {
137146
TunGUID: tunGUID,
138147
})
139148
if err != nil {
140-
server.Close()
141-
manager.Close()
142-
r.redirectServer = nil
143-
r.driverManager = nil
144149
return E.Cause(err, "set driver config")
145150
}
146151

147152
err = manager.StartRedirect()
148153
if err != nil {
149-
server.Close()
150-
manager.Close()
151-
r.redirectServer = nil
152-
r.driverManager = nil
153154
return E.Cause(err, "start redirect")
154155
}
155156

156-
r.updateLocalAddresses()
157-
if r.networkMonitor != nil {
158-
r.networkListener = r.networkMonitor.RegisterCallback(func() {
159-
r.updateLocalAddresses()
160-
})
161-
}
162-
163-
for i := 0; i < r.workerCount; i++ {
164-
go r.preMatchWorker()
165-
}
166-
167157
return nil
168158
}
169159

@@ -377,27 +367,22 @@ func (r *autoRedirect) dnsServerForFamily(addr netip.Addr) netip.Addr {
377367
}
378368

379369
func (r *autoRedirect) resolveTunInterfaceGUID() ([16]byte, error) {
370+
var index int
380371
if r.interfaceFinder != nil {
381-
if err := r.interfaceFinder.Update(); err == nil {
382-
iface, err := r.interfaceFinder.ByName(r.tunOptions.Name)
383-
if err == nil {
384-
luid, err := winipcfg.LUIDFromIndex(uint32(iface.Index))
385-
if err != nil {
386-
return [16]byte{}, err
387-
}
388-
guid, err := luid.GUID()
389-
if err != nil {
390-
return [16]byte{}, err
391-
}
392-
return guidBytes(guid), nil
393-
}
372+
_ = r.interfaceFinder.Update()
373+
iface, err := r.interfaceFinder.ByName(r.tunOptions.Name)
374+
if err == nil {
375+
index = iface.Index
394376
}
395377
}
396-
iface, err := net.InterfaceByName(r.tunOptions.Name)
397-
if err != nil {
398-
return [16]byte{}, err
378+
if index == 0 {
379+
iface, err := net.InterfaceByName(r.tunOptions.Name)
380+
if err != nil {
381+
return [16]byte{}, err
382+
}
383+
index = iface.Index
399384
}
400-
luid, err := winipcfg.LUIDFromIndex(uint32(iface.Index))
385+
luid, err := winipcfg.LUIDFromIndex(uint32(index))
401386
if err != nil {
402387
return [16]byte{}, err
403388
}

0 commit comments

Comments
 (0)