tun_windows.go 1.7 KB

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