@@ -264,15 +264,15 @@ func startIPNServer(ctx context.Context, logid string) error {
264
264
}
265
265
dialer := new (tsdial.Dialer )
266
266
267
- getEngineRaw := func () (wgengine.Engine , error ) {
267
+ getEngineRaw := func () (wgengine.Engine , * netstack. Impl , error ) {
268
268
dev , devName , err := tstun .New (logf , "Tailscale" )
269
269
if err != nil {
270
- return nil , fmt .Errorf ("TUN: %w" , err )
270
+ return nil , nil , fmt .Errorf ("TUN: %w" , err )
271
271
}
272
272
r , err := router .New (logf , dev , nil )
273
273
if err != nil {
274
274
dev .Close ()
275
- return nil , fmt .Errorf ("router: %w" , err )
275
+ return nil , nil , fmt .Errorf ("router: %w" , err )
276
276
}
277
277
if wrapNetstack {
278
278
r = netstack .NewSubnetRouterWrapper (r )
@@ -281,7 +281,7 @@ func startIPNServer(ctx context.Context, logid string) error {
281
281
if err != nil {
282
282
r .Close ()
283
283
dev .Close ()
284
- return nil , fmt .Errorf ("DNS: %w" , err )
284
+ return nil , nil , fmt .Errorf ("DNS: %w" , err )
285
285
}
286
286
eng , err := wgengine .NewUserspaceEngine (logf , wgengine.Config {
287
287
Tun : dev ,
@@ -294,23 +294,24 @@ func startIPNServer(ctx context.Context, logid string) error {
294
294
if err != nil {
295
295
r .Close ()
296
296
dev .Close ()
297
- return nil , fmt .Errorf ("engine: %w" , err )
297
+ return nil , nil , fmt .Errorf ("engine: %w" , err )
298
298
}
299
299
ns , err := newNetstack (logf , dialer , eng )
300
300
if err != nil {
301
- return nil , fmt .Errorf ("newNetstack: %w" , err )
301
+ return nil , nil , fmt .Errorf ("newNetstack: %w" , err )
302
302
}
303
303
ns .ProcessLocalIPs = false
304
304
ns .ProcessSubnets = wrapNetstack
305
305
if err := ns .Start (); err != nil {
306
- return nil , fmt .Errorf ("failed to start netstack: %w" , err )
306
+ return nil , nil , fmt .Errorf ("failed to start netstack: %w" , err )
307
307
}
308
- return wgengine .NewWatchdog (eng ), nil
308
+ return wgengine .NewWatchdog (eng ), ns , nil
309
309
}
310
310
311
311
type engineOrError struct {
312
- Engine wgengine.Engine
313
- Err error
312
+ Engine wgengine.Engine
313
+ Netstack * netstack.Impl
314
+ Err error
314
315
}
315
316
engErrc := make (chan engineOrError )
316
317
t0 := time .Now ()
@@ -319,7 +320,7 @@ func startIPNServer(ctx context.Context, logid string) error {
319
320
for try := 1 ; ; try ++ {
320
321
logf ("tailscaled: getting engine... (try %v)" , try )
321
322
t1 := time .Now ()
322
- eng , err := getEngineRaw ()
323
+ eng , ns , err := getEngineRaw ()
323
324
d , dt := time .Since (t1 ).Round (ms ), time .Since (t1 ).Round (ms )
324
325
if err != nil {
325
326
logf ("tailscaled: engine fetch error (try %v) in %v (total %v, sysUptime %v): %v" ,
@@ -332,7 +333,7 @@ func startIPNServer(ctx context.Context, logid string) error {
332
333
}
333
334
}
334
335
timer := time .NewTimer (5 * time .Second )
335
- engErrc <- engineOrError {eng , err }
336
+ engErrc <- engineOrError {eng , ns , err }
336
337
if err == nil {
337
338
timer .Stop ()
338
339
return
@@ -344,14 +345,14 @@ func startIPNServer(ctx context.Context, logid string) error {
344
345
// getEngine is called by ipnserver to get the engine. It's
345
346
// not called concurrently and is not called again once it
346
347
// successfully returns an engine.
347
- getEngine := func () (wgengine.Engine , error ) {
348
+ getEngine := func () (wgengine.Engine , * netstack. Impl , error ) {
348
349
if msg := envknob .String ("TS_DEBUG_WIN_FAIL" ); msg != "" {
349
- return nil , fmt .Errorf ("pretending to be a service failure: %v" , msg )
350
+ return nil , nil , fmt .Errorf ("pretending to be a service failure: %v" , msg )
350
351
}
351
352
for {
352
353
res := <- engErrc
353
354
if res .Engine != nil {
354
- return res .Engine , nil
355
+ return res .Engine , res . Netstack , nil
355
356
}
356
357
if time .Since (t0 ) < time .Minute || windowsUptime () < 10 * time .Minute {
357
358
// Ignore errors during early boot. Windows 10 auto logs in the GUI
@@ -362,7 +363,7 @@ func startIPNServer(ctx context.Context, logid string) error {
362
363
}
363
364
// Return nicer errors to users, annotated with logids, which helps
364
365
// when they file bugs.
365
- return nil , fmt .Errorf ("%w\n \n logid: %v" , res .Err , logid )
366
+ return nil , nil , fmt .Errorf ("%w\n \n logid: %v" , res .Err , logid )
366
367
}
367
368
}
368
369
store , err := store .New (logf , statePathOrDefault ())
0 commit comments