Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a9b4bf1

Browse files
committed
ipn/ipnserver, cmd/tailscaled: fix peerapi on Windows
We weren't wiring up netstack.Impl to the LocalBackend in some cases on Windows. This fixes Windows 7 when run as a service. Updates tailscale#4750 (fixes after pull in to corp repo) Change-Id: I9ce51b797710f2bedfa90545776b7628c7528e99 Signed-off-by: Brad Fitzpatrick <[email protected]>
1 parent 43f9c25 commit a9b4bf1

File tree

4 files changed

+40
-32
lines changed

4 files changed

+40
-32
lines changed

cmd/tailscaled/depaware.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de
282282
tailscale.com/wgengine/filter from tailscale.com/control/controlclient+
283283
tailscale.com/wgengine/magicsock from tailscale.com/ipn/ipnlocal+
284284
tailscale.com/wgengine/monitor from tailscale.com/control/controlclient+
285-
tailscale.com/wgengine/netstack from tailscale.com/cmd/tailscaled
285+
tailscale.com/wgengine/netstack from tailscale.com/cmd/tailscaled+
286286
tailscale.com/wgengine/router from tailscale.com/ipn/ipnlocal+
287287
tailscale.com/wgengine/wgcfg from tailscale.com/ipn/ipnlocal+
288288
tailscale.com/wgengine/wgcfg/nmcfg from tailscale.com/ipn/ipnlocal

cmd/tailscaled/tailscaled_windows.go

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -264,15 +264,15 @@ func startIPNServer(ctx context.Context, logid string) error {
264264
}
265265
dialer := new(tsdial.Dialer)
266266

267-
getEngineRaw := func() (wgengine.Engine, error) {
267+
getEngineRaw := func() (wgengine.Engine, *netstack.Impl, error) {
268268
dev, devName, err := tstun.New(logf, "Tailscale")
269269
if err != nil {
270-
return nil, fmt.Errorf("TUN: %w", err)
270+
return nil, nil, fmt.Errorf("TUN: %w", err)
271271
}
272272
r, err := router.New(logf, dev, nil)
273273
if err != nil {
274274
dev.Close()
275-
return nil, fmt.Errorf("router: %w", err)
275+
return nil, nil, fmt.Errorf("router: %w", err)
276276
}
277277
if wrapNetstack {
278278
r = netstack.NewSubnetRouterWrapper(r)
@@ -281,7 +281,7 @@ func startIPNServer(ctx context.Context, logid string) error {
281281
if err != nil {
282282
r.Close()
283283
dev.Close()
284-
return nil, fmt.Errorf("DNS: %w", err)
284+
return nil, nil, fmt.Errorf("DNS: %w", err)
285285
}
286286
eng, err := wgengine.NewUserspaceEngine(logf, wgengine.Config{
287287
Tun: dev,
@@ -294,23 +294,24 @@ func startIPNServer(ctx context.Context, logid string) error {
294294
if err != nil {
295295
r.Close()
296296
dev.Close()
297-
return nil, fmt.Errorf("engine: %w", err)
297+
return nil, nil, fmt.Errorf("engine: %w", err)
298298
}
299299
ns, err := newNetstack(logf, dialer, eng)
300300
if err != nil {
301-
return nil, fmt.Errorf("newNetstack: %w", err)
301+
return nil, nil, fmt.Errorf("newNetstack: %w", err)
302302
}
303303
ns.ProcessLocalIPs = false
304304
ns.ProcessSubnets = wrapNetstack
305305
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)
307307
}
308-
return wgengine.NewWatchdog(eng), nil
308+
return wgengine.NewWatchdog(eng), ns, nil
309309
}
310310

311311
type engineOrError struct {
312-
Engine wgengine.Engine
313-
Err error
312+
Engine wgengine.Engine
313+
Netstack *netstack.Impl
314+
Err error
314315
}
315316
engErrc := make(chan engineOrError)
316317
t0 := time.Now()
@@ -319,7 +320,7 @@ func startIPNServer(ctx context.Context, logid string) error {
319320
for try := 1; ; try++ {
320321
logf("tailscaled: getting engine... (try %v)", try)
321322
t1 := time.Now()
322-
eng, err := getEngineRaw()
323+
eng, ns, err := getEngineRaw()
323324
d, dt := time.Since(t1).Round(ms), time.Since(t1).Round(ms)
324325
if err != nil {
325326
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 {
332333
}
333334
}
334335
timer := time.NewTimer(5 * time.Second)
335-
engErrc <- engineOrError{eng, err}
336+
engErrc <- engineOrError{eng, ns, err}
336337
if err == nil {
337338
timer.Stop()
338339
return
@@ -344,14 +345,14 @@ func startIPNServer(ctx context.Context, logid string) error {
344345
// getEngine is called by ipnserver to get the engine. It's
345346
// not called concurrently and is not called again once it
346347
// successfully returns an engine.
347-
getEngine := func() (wgengine.Engine, error) {
348+
getEngine := func() (wgengine.Engine, *netstack.Impl, error) {
348349
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)
350351
}
351352
for {
352353
res := <-engErrc
353354
if res.Engine != nil {
354-
return res.Engine, nil
355+
return res.Engine, res.Netstack, nil
355356
}
356357
if time.Since(t0) < time.Minute || windowsUptime() < 10*time.Minute {
357358
// Ignore errors during early boot. Windows 10 auto logs in the GUI
@@ -362,7 +363,7 @@ func startIPNServer(ctx context.Context, logid string) error {
362363
}
363364
// Return nicer errors to users, annotated with logids, which helps
364365
// when they file bugs.
365-
return nil, fmt.Errorf("%w\n\nlogid: %v", res.Err, logid)
366+
return nil, nil, fmt.Errorf("%w\n\nlogid: %v", res.Err, logid)
366367
}
367368
}
368369
store, err := store.New(logf, statePathOrDefault())

ipn/ipnserver/server.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import (
5151
"tailscale.com/version/distro"
5252
"tailscale.com/wgengine"
5353
"tailscale.com/wgengine/monitor"
54+
"tailscale.com/wgengine/netstack"
5455
)
5556

5657
// Options is the configuration of the Tailscale node agent.
@@ -659,7 +660,7 @@ func (s *Server) writeToClients(n ipn.Notify) {
659660
// The getEngine func is called repeatedly, once per connection, until it returns an engine successfully.
660661
//
661662
// Deprecated: use New and Server.Run instead.
662-
func Run(ctx context.Context, logf logger.Logf, ln net.Listener, store ipn.StateStore, linkMon *monitor.Mon, dialer *tsdial.Dialer, logid string, getEngine func() (wgengine.Engine, error), opts Options) error {
663+
func Run(ctx context.Context, logf logger.Logf, ln net.Listener, store ipn.StateStore, linkMon *monitor.Mon, dialer *tsdial.Dialer, logid string, getEngine func() (wgengine.Engine, *netstack.Impl, error), opts Options) error {
663664
getEngine = getEngineUntilItWorksWrapper(getEngine)
664665
runDone := make(chan struct{})
665666
defer close(runDone)
@@ -706,7 +707,7 @@ func Run(ctx context.Context, logf logger.Logf, ln net.Listener, store ipn.State
706707
bo := backoff.NewBackoff("ipnserver", logf, 30*time.Second)
707708
var unservedConn net.Conn // if non-nil, accepted, but hasn't served yet
708709

709-
eng, err := getEngine()
710+
eng, ns, err := getEngine()
710711
if err != nil {
711712
logf("ipnserver: initial getEngine call: %v", err)
712713
for i := 1; ctx.Err() == nil; i++ {
@@ -717,7 +718,7 @@ func Run(ctx context.Context, logf logger.Logf, ln net.Listener, store ipn.State
717718
continue
718719
}
719720
logf("ipnserver: try%d: trying getEngine again...", i)
720-
eng, err = getEngine()
721+
eng, ns, err = getEngine()
721722
if err == nil {
722723
logf("%d: GetEngine worked; exiting failure loop", i)
723724
unservedConn = c
@@ -747,6 +748,9 @@ func Run(ctx context.Context, logf logger.Logf, ln net.Listener, store ipn.State
747748
if err != nil {
748749
return err
749750
}
751+
if ns != nil {
752+
ns.SetLocalBackend(server.LocalBackend())
753+
}
750754
serverMu.Lock()
751755
serverOrNil = server
752756
serverMu.Unlock()
@@ -996,29 +1000,26 @@ func BabysitProc(ctx context.Context, args []string, logf logger.Logf) {
9961000
}
9971001
}
9981002

999-
// FixedEngine returns a func that returns eng and a nil error.
1000-
func FixedEngine(eng wgengine.Engine) func() (wgengine.Engine, error) {
1001-
return func() (wgengine.Engine, error) { return eng, nil }
1002-
}
1003-
10041003
// getEngineUntilItWorksWrapper returns a getEngine wrapper that does
10051004
// not call getEngine concurrently and stops calling getEngine once
10061005
// it's returned a working engine.
1007-
func getEngineUntilItWorksWrapper(getEngine func() (wgengine.Engine, error)) func() (wgengine.Engine, error) {
1006+
func getEngineUntilItWorksWrapper(getEngine func() (wgengine.Engine, *netstack.Impl, error)) func() (wgengine.Engine, *netstack.Impl, error) {
10081007
var mu sync.Mutex
10091008
var engGood wgengine.Engine
1010-
return func() (wgengine.Engine, error) {
1009+
var nsGood *netstack.Impl
1010+
return func() (wgengine.Engine, *netstack.Impl, error) {
10111011
mu.Lock()
10121012
defer mu.Unlock()
10131013
if engGood != nil {
1014-
return engGood, nil
1014+
return engGood, nsGood, nil
10151015
}
1016-
e, err := getEngine()
1016+
e, ns, err := getEngine()
10171017
if err != nil {
1018-
return nil, err
1018+
return nil, nil, err
10191019
}
10201020
engGood = e
1021-
return e, nil
1021+
nsGood = ns
1022+
return e, ns, nil
10221023
}
10231024
}
10241025

ipn/ipnserver/server_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"tailscale.com/net/tsdial"
1818
"tailscale.com/safesocket"
1919
"tailscale.com/wgengine"
20+
"tailscale.com/wgengine/netstack"
2021
)
2122

2223
func TestRunMultipleAccepts(t *testing.T) {
@@ -75,6 +76,11 @@ func TestRunMultipleAccepts(t *testing.T) {
7576
}
7677
defer ln.Close()
7778

78-
err = ipnserver.Run(ctx, logTriggerTestf, ln, store, nil /* mon */, new(tsdial.Dialer), "dummy_logid", ipnserver.FixedEngine(eng), opts)
79+
err = ipnserver.Run(ctx, logTriggerTestf, ln, store, nil /* mon */, new(tsdial.Dialer), "dummy_logid", FixedEngine(eng), opts)
7980
t.Logf("ipnserver.Run = %v", err)
8081
}
82+
83+
// FixedEngine returns a func that returns eng and a nil error.
84+
func FixedEngine(eng wgengine.Engine) func() (wgengine.Engine, *netstack.Impl, error) {
85+
return func() (wgengine.Engine, *netstack.Impl, error) { return eng, nil, nil }
86+
}

0 commit comments

Comments
 (0)