(logf logger.Logf, sys *tsd.System, name string)
| 747 | var tstunNew = tstun.New |
| 748 | |
| 749 | func tryEngine(logf logger.Logf, sys *tsd.System, name string) (onlyNetstack bool, err error) { |
| 750 | conf := wgengine.Config{ |
| 751 | ListenPort: args.port, |
| 752 | NetMon: sys.NetMon.Get(), |
| 753 | HealthTracker: sys.HealthTracker.Get(), |
| 754 | ExtraRootCAs: sys.ExtraRootCAs, |
| 755 | Metrics: sys.UserMetricsRegistry(), |
| 756 | Dialer: sys.Dialer.Get(), |
| 757 | SetSubsystem: sys.Set, |
| 758 | ControlKnobs: sys.ControlKnobs(), |
| 759 | EventBus: sys.Bus.Get(), |
| 760 | } |
| 761 | if f, ok := hookSetWgEnginConfigDrive.GetOk(); ok { |
| 762 | f(&conf, logf) |
| 763 | } |
| 764 | |
| 765 | sys.HealthTracker.Get().SetMetricsRegistry(sys.UserMetricsRegistry()) |
| 766 | |
| 767 | onlyNetstack = name == "userspace-networking" |
| 768 | netstackSubnetRouter := onlyNetstack // but mutated later on some platforms |
| 769 | netns.SetEnabled(!onlyNetstack) |
| 770 | |
| 771 | if args.birdSocketPath != "" && createBIRDClient != nil { |
| 772 | log.Printf("Connecting to BIRD at %s ...", args.birdSocketPath) |
| 773 | conf.BIRDClient, err = createBIRDClient(args.birdSocketPath) |
| 774 | if err != nil { |
| 775 | return false, fmt.Errorf("createBIRDClient: %w", err) |
| 776 | } |
| 777 | } |
| 778 | if onlyNetstack { |
| 779 | if runtime.GOOS == "linux" && distro.Get() == distro.Synology { |
| 780 | // On Synology in netstack mode, still init a DNS |
| 781 | // manager (directManager) to avoid the health check |
| 782 | // warnings in 'tailscale status' about DNS base |
| 783 | // configuration being unavailable (from the noop |
| 784 | // manager). More in Issue 4017. |
| 785 | // TODO(bradfitz): add a Synology-specific DNS manager. |
| 786 | conf.DNS, err = dns.NewOSConfigurator(logf, sys.HealthTracker.Get(), sys.Bus.Get(), sys.PolicyClientOrDefault(), sys.ControlKnobs(), "") // empty interface name |
| 787 | if err != nil { |
| 788 | return false, fmt.Errorf("dns.NewOSConfigurator: %w", err) |
| 789 | } |
| 790 | } |
| 791 | } else { |
| 792 | dev, devName, err := tstunNew(logf, name) |
| 793 | if err != nil { |
| 794 | tstun.Diagnose(logf, name, err) |
| 795 | return false, fmt.Errorf("tstun.New(%q): %w", name, err) |
| 796 | } |
| 797 | conf.Tun = dev |
| 798 | if strings.HasPrefix(name, "tap:") { |
| 799 | conf.IsTAP = true |
| 800 | e, err := wgengine.NewUserspaceEngine(logf, conf) |
| 801 | if err != nil { |
| 802 | return false, err |
| 803 | } |
| 804 | sys.Set(e) |
| 805 | return false, err |
| 806 | } |
no test coverage detected
searching dependent graphs…