@@ -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
379369func (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