mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-14 15:07:55 +00:00
all: detect JetKVM and specialize a handful of things for it
Updates #16524 Change-Id: I183428de8c65d7155d82979d2d33f031c22e3331 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:

committed by
Brad Fitzpatrick

parent
bebc796e6c
commit
fbc6a9ec5a
@@ -22,6 +22,7 @@ import (
|
||||
"tailscale.com/types/logger"
|
||||
"tailscale.com/util/clientmetric"
|
||||
"tailscale.com/util/cmpver"
|
||||
"tailscale.com/version/distro"
|
||||
)
|
||||
|
||||
type kv struct {
|
||||
@@ -38,6 +39,10 @@ var publishOnce sync.Once
|
||||
//
|
||||
// The health tracker may be nil; the knobs may be nil and are ignored on this platform.
|
||||
func NewOSConfigurator(logf logger.Logf, health *health.Tracker, _ *controlknobs.Knobs, interfaceName string) (ret OSConfigurator, err error) {
|
||||
if distro.Get() == distro.JetKVM {
|
||||
return NewNoopManager()
|
||||
}
|
||||
|
||||
env := newOSConfigEnv{
|
||||
fs: directFS{},
|
||||
dbusPing: dbusPing,
|
||||
|
@@ -24,6 +24,9 @@ import (
|
||||
// CrateTAP is the hook set by feature/tap.
|
||||
var CreateTAP feature.Hook[func(logf logger.Logf, tapName, bridgeName string) (tun.Device, error)]
|
||||
|
||||
// modprobeTunHook is a Linux-specific hook to run "/sbin/modprobe tun".
|
||||
var modprobeTunHook feature.Hook[func() error]
|
||||
|
||||
// New returns a tun.Device for the requested device name, along with
|
||||
// the OS-dependent name that was allocated to the device.
|
||||
func New(logf logger.Logf, tunName string) (tun.Device, string, error) {
|
||||
@@ -51,7 +54,22 @@ func New(logf logger.Logf, tunName string) (tun.Device, string, error) {
|
||||
if runtime.GOOS == "plan9" {
|
||||
cleanUpPlan9Interfaces()
|
||||
}
|
||||
dev, err = tun.CreateTUN(tunName, int(DefaultTUNMTU()))
|
||||
// Try to create the TUN device up to two times. If it fails
|
||||
// the first time and we're on Linux, try a desperate
|
||||
// "modprobe tun" to load the tun module and try again.
|
||||
for try := range 2 {
|
||||
dev, err = tun.CreateTUN(tunName, int(DefaultTUNMTU()))
|
||||
if err == nil || !modprobeTunHook.IsSet() {
|
||||
if try > 0 {
|
||||
logf("created TUN device %q after doing `modprobe tun`", tunName)
|
||||
}
|
||||
break
|
||||
}
|
||||
if modprobeTunHook.Get()() != nil {
|
||||
// modprobe failed; no point trying again.
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
|
@@ -17,6 +17,14 @@ import (
|
||||
|
||||
func init() {
|
||||
tunDiagnoseFailure = diagnoseLinuxTUNFailure
|
||||
modprobeTunHook.Set(func() error {
|
||||
_, err := modprobeTun()
|
||||
return err
|
||||
})
|
||||
}
|
||||
|
||||
func modprobeTun() ([]byte, error) {
|
||||
return exec.Command("/sbin/modprobe", "tun").CombinedOutput()
|
||||
}
|
||||
|
||||
func diagnoseLinuxTUNFailure(tunName string, logf logger.Logf, createErr error) {
|
||||
@@ -36,7 +44,7 @@ func diagnoseLinuxTUNFailure(tunName string, logf logger.Logf, createErr error)
|
||||
kernel := utsReleaseField(&un)
|
||||
logf("Linux kernel version: %s", kernel)
|
||||
|
||||
modprobeOut, err := exec.Command("/sbin/modprobe", "tun").CombinedOutput()
|
||||
modprobeOut, err := modprobeTun()
|
||||
if err == nil {
|
||||
logf("'modprobe tun' successful")
|
||||
// Either tun is currently loaded, or it's statically
|
||||
|
Reference in New Issue
Block a user