udp_darwin.go 938 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. //go:build !e2e_testing
  2. // +build !e2e_testing
  3. package nebula
  4. // Darwin support is primarily implemented in udp_generic, besides NewListenConfig
  5. import (
  6. "fmt"
  7. "net"
  8. "syscall"
  9. "golang.org/x/sys/unix"
  10. )
  11. func NewListenConfig(multi bool) net.ListenConfig {
  12. return net.ListenConfig{
  13. Control: func(network, address string, c syscall.RawConn) error {
  14. if multi {
  15. var controlErr error
  16. err := c.Control(func(fd uintptr) {
  17. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, unix.SO_REUSEPORT, 1); err != nil {
  18. controlErr = fmt.Errorf("SO_REUSEPORT failed: %v", err)
  19. return
  20. }
  21. })
  22. if err != nil {
  23. return err
  24. }
  25. if controlErr != nil {
  26. return controlErr
  27. }
  28. }
  29. return nil
  30. },
  31. }
  32. }
  33. func (u *udpConn) Rebind() error {
  34. file, err := u.File()
  35. if err != nil {
  36. return err
  37. }
  38. return syscall.SetsockoptInt(int(file.Fd()), unix.IPPROTO_IPV6, unix.IPV6_BOUND_IF, 0)
  39. }