udp_darwin.go 885 B

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