2
0

udp_darwin.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. //go:build !e2e_testing
  2. // +build !e2e_testing
  3. package udp
  4. // Darwin support is primarily implemented in udp_generic, besides NewListenConfig
  5. import (
  6. "fmt"
  7. "net"
  8. "net/netip"
  9. "syscall"
  10. "github.com/sirupsen/logrus"
  11. "golang.org/x/sys/unix"
  12. )
  13. func NewListener(l *logrus.Logger, ip netip.Addr, port int, multi bool, batch int) (Conn, error) {
  14. return NewGenericListener(l, ip, port, multi, batch)
  15. }
  16. func NewListenConfig(multi bool) net.ListenConfig {
  17. return net.ListenConfig{
  18. Control: func(network, address string, c syscall.RawConn) error {
  19. if multi {
  20. var controlErr error
  21. err := c.Control(func(fd uintptr) {
  22. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, unix.SO_REUSEPORT, 1); err != nil {
  23. controlErr = fmt.Errorf("SO_REUSEPORT failed: %v", err)
  24. return
  25. }
  26. })
  27. if err != nil {
  28. return err
  29. }
  30. if controlErr != nil {
  31. return controlErr
  32. }
  33. }
  34. return nil
  35. },
  36. }
  37. }
  38. func (u *GenericConn) Rebind() error {
  39. rc, err := u.UDPConn.SyscallConn()
  40. if err != nil {
  41. return err
  42. }
  43. return rc.Control(func(fd uintptr) {
  44. err := syscall.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_BOUND_IF, 0)
  45. if err != nil {
  46. u.l.WithError(err).Error("Failed to rebind udp socket")
  47. }
  48. })
  49. }