tun_windows.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. "github.com/slackhq/nebula/config"
  13. )
  14. func newTunFromFd(_ *config.C, _ *logrus.Logger, _ int, _ *net.IPNet) (Device, error) {
  15. return nil, fmt.Errorf("newTunFromFd not supported in Windows")
  16. }
  17. func newTun(c *config.C, l *logrus.Logger, cidr *net.IPNet, multiqueue bool) (Device, error) {
  18. useWintun := true
  19. if err := checkWinTunExists(); err != nil {
  20. l.WithError(err).Warn("Check Wintun driver failed, fallback to wintap driver")
  21. useWintun = false
  22. }
  23. if useWintun {
  24. device, err := newWinTun(c, l, cidr, multiqueue)
  25. if err != nil {
  26. return nil, fmt.Errorf("create Wintun interface failed, %w", err)
  27. }
  28. return device, nil
  29. }
  30. device, err := newWaterTun(c, l, cidr, multiqueue)
  31. if err != nil {
  32. return nil, fmt.Errorf("create wintap driver failed, %w", err)
  33. }
  34. return device, nil
  35. }
  36. func checkWinTunExists() error {
  37. myPath, err := os.Executable()
  38. if err != nil {
  39. return err
  40. }
  41. arch := runtime.GOARCH
  42. switch arch {
  43. case "386":
  44. //NOTE: wintun bundles 386 as x86
  45. arch = "x86"
  46. }
  47. _, err = syscall.LoadDLL(filepath.Join(filepath.Dir(myPath), "dist", "windows", "wintun", "bin", arch, "wintun.dll"))
  48. return err
  49. }