1
0

udp_windows.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. //go:build !e2e_testing
  2. package udp
  3. import (
  4. "fmt"
  5. "log/slog"
  6. "net"
  7. "syscall"
  8. )
  9. func NewListener(l *slog.Logger, s Settings) (Conn, error) {
  10. if s.Multi {
  11. //NOTE: Technically we can support it with RIO but it wouldn't be at the socket level
  12. // The udp stack would need to be reworked to hide away the implementation differences between
  13. // Windows and Linux
  14. return nil, fmt.Errorf("multiple udp listeners not supported on windows")
  15. }
  16. var conn Conn
  17. rc, err := NewRIOListener(l, s.Listen.Addr(), int(s.Listen.Port()))
  18. if err == nil {
  19. conn = rc
  20. } else {
  21. l.Error("Falling back to standard udp sockets", "error", err)
  22. conn, err = NewGenericListener(l, s)
  23. if err != nil {
  24. return nil, err
  25. }
  26. }
  27. return wrapWithWDFBypass(l, conn), nil
  28. }
  29. func NewListenConfig(multi bool) net.ListenConfig {
  30. return net.ListenConfig{
  31. Control: func(network, address string, c syscall.RawConn) error {
  32. if multi {
  33. // There is no way to support multiple listeners safely on Windows:
  34. // https://docs.microsoft.com/en-us/windows/desktop/winsock/using-so-reuseaddr-and-so-exclusiveaddruse
  35. return fmt.Errorf("multiple udp listeners not supported on windows")
  36. }
  37. return nil
  38. },
  39. }
  40. }
  41. func (u *GenericConn) Rebind() error {
  42. return nil
  43. }