cmd/tailscale: fix netstack init, call SetLocalBackend

The netstack code on Android was never told about the LocalBackend,
so the peerapi interception wasn't working.

Fixes tailscale/tailscale#4449
Fixes tailscale/tailscale#4293

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
release-branch/1.24
Brad Fitzpatrick 2 years ago committed by Brad Fitzpatrick
parent 8550365e52
commit cff9e2a772

@ -121,16 +121,27 @@ func newBackend(dataDir string, jvm *jni.JVM, appCtx jni.Object, store *stateSto
return nil, fmt.Errorf("runBackend: NewUserspaceEngine: %v", err) return nil, fmt.Errorf("runBackend: NewUserspaceEngine: %v", err)
} }
b.logIDPublic = logID.Public().String() b.logIDPublic = logID.Public().String()
if err := startNetstack(log.Printf, dialer, engine); err != nil { tunDev, magicConn, ok := engine.(wgengine.InternalsGetter).GetInternals()
return nil, fmt.Errorf("startNetstack: %w", err) if !ok {
return nil, fmt.Errorf("%T is not a wgengine.InternalsGetter", engine)
}
ns, err := netstack.Create(logf, tunDev, engine, magicConn, dialer)
if err != nil {
return nil, fmt.Errorf("netstack.Create: %w", err)
} }
local, err := ipnlocal.NewLocalBackend(logf, b.logIDPublic, store, dialer, engine, 0) ns.ProcessLocalIPs = false // let Android kernel handle it; VpnBuilder sets this up
ns.ProcessSubnets = true // for Android-being-an-exit-node support
lb, err := ipnlocal.NewLocalBackend(logf, b.logIDPublic, store, dialer, engine, 0)
if err != nil { if err != nil {
engine.Close() engine.Close()
return nil, fmt.Errorf("runBackend: NewLocalBackend: %v", err) return nil, fmt.Errorf("runBackend: NewLocalBackend: %v", err)
} }
ns.SetLocalBackend(lb)
if err := ns.Start(); err != nil {
return nil, fmt.Errorf("startNetstack: %w", err)
}
b.engine = engine b.engine = engine
b.backend = local b.backend = lb
return b, nil return b, nil
} }
@ -432,17 +443,3 @@ func (b *backend) getDNSBaseConfig() (dns.OSConfig, error) {
return config, nil return config, nil
} }
func startNetstack(logf logger.Logf, dialer *tsdial.Dialer, e wgengine.Engine) error {
tunDev, magicConn, ok := e.(wgengine.InternalsGetter).GetInternals()
if !ok {
return fmt.Errorf("%T is not a wgengine.InternalsGetter", e)
}
ns, err := netstack.Create(logf, tunDev, e, magicConn, dialer)
if err != nil {
return fmt.Errorf("netstack.Create: %w", err)
}
ns.ProcessLocalIPs = false
ns.ProcessSubnets = true
return ns.Start()
}

Loading…
Cancel
Save