nebula/overlay/tun_windows.go

59 lines
1.3 KiB
Go
Raw Normal View History

2021-10-21 15:24:11 -06:00
//go:build !e2e_testing
2021-03-31 09:26:35 -06:00
// +build !e2e_testing
2021-11-11 15:37:29 -07:00
package overlay
2019-11-19 10:00:20 -07:00
import (
"fmt"
"net"
2021-11-08 11:36:31 -07:00
"os"
"path/filepath"
"runtime"
"syscall"
2019-11-19 10:00:20 -07:00
2021-03-26 08:46:30 -06:00
"github.com/sirupsen/logrus"
2019-11-19 10:00:20 -07:00
)
func newTunFromFd(_ *logrus.Logger, _ int, _ *net.IPNet, _ int, _ []Route, _ int) (Device, error) {
return nil, fmt.Errorf("newTunFromFd not supported in Windows")
}
func newTun(l *logrus.Logger, deviceName string, cidr *net.IPNet, defaultMTU int, routes []Route, _ int, _ bool) (Device, error) {
2021-11-08 11:36:31 -07:00
useWintun := true
if err := checkWinTunExists(); err != nil {
2021-11-08 11:36:31 -07:00
l.WithError(err).Warn("Check Wintun driver failed, fallback to wintap driver")
useWintun = false
2019-11-19 10:00:20 -07:00
}
2021-11-08 11:36:31 -07:00
if useWintun {
device, err := newWinTun(l, deviceName, cidr, defaultMTU, routes)
2021-11-08 11:36:31 -07:00
if err != nil {
return nil, fmt.Errorf("create Wintun interface failed, %w", err)
}
return device, nil
}
device, err := newWaterTun(l, cidr, defaultMTU, routes)
if err != nil {
return nil, fmt.Errorf("create wintap driver failed, %w", err)
}
return device, nil
2019-11-19 10:00:20 -07:00
}
2021-11-08 11:36:31 -07:00
func checkWinTunExists() error {
myPath, err := os.Executable()
if err != nil {
return err
}
2021-11-08 11:36:31 -07:00
arch := runtime.GOARCH
switch arch {
case "386":
//NOTE: wintun bundles 386 as x86
arch = "x86"
}
2021-11-08 11:36:31 -07:00
_, err = syscall.LoadDLL(filepath.Join(filepath.Dir(myPath), "dist", "windows", "wintun", "bin", arch, "wintun.dll"))
2019-11-19 10:00:20 -07:00
return err
}