2
0

tun_windows.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. //go:build !e2e_testing
  2. // +build !e2e_testing
  3. package overlay
  4. import (
  5. "fmt"
  6. "net"
  7. "os"
  8. "path/filepath"
  9. "runtime"
  10. "syscall"
  11. "github.com/sirupsen/logrus"
  12. )
  13. func newTunFromFd(_ *logrus.Logger, _ int, _ *net.IPNet, _ int, _ []Route, _ int) (Device, error) {
  14. return nil, fmt.Errorf("newTunFromFd not supported in Windows")
  15. }
  16. func newTun(l *logrus.Logger, deviceName string, cidr *net.IPNet, defaultMTU int, routes []Route, _ int, _ bool) (Device, error) {
  17. if len(routes) > 0 {
  18. return nil, fmt.Errorf("route MTU not supported in Windows")
  19. }
  20. useWintun := true
  21. if err := checkWinTunExists(); err != nil {
  22. l.WithError(err).Warn("Check Wintun driver failed, fallback to wintap driver")
  23. useWintun = false
  24. }
  25. if useWintun {
  26. device, err := newWinTun(l, deviceName, cidr, defaultMTU, routes)
  27. if err != nil {
  28. return nil, fmt.Errorf("create Wintun interface failed, %w", err)
  29. }
  30. return device, nil
  31. }
  32. device, err := newWaterTun(l, cidr, defaultMTU, routes)
  33. if err != nil {
  34. return nil, fmt.Errorf("create wintap driver failed, %w", err)
  35. }
  36. return device, nil
  37. }
  38. func checkWinTunExists() error {
  39. myPath, err := os.Executable()
  40. if err != nil {
  41. return err
  42. }
  43. arch := runtime.GOARCH
  44. switch arch {
  45. case "386":
  46. //NOTE: wintun bundles 386 as x86
  47. arch = "x86"
  48. }
  49. _, err = syscall.LoadDLL(filepath.Join(filepath.Dir(myPath), "dist", "windows", "wintun", "bin", arch, "wintun.dll"))
  50. return err
  51. }