udp_darwin.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. var controlErr error
  13. err := c.Control(func(fd uintptr) {
  14. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_SNDBUF, 999999); err != nil {
  15. controlErr = fmt.Errorf("SO_SNDBUF failed: %v", err)
  16. return
  17. }
  18. })
  19. if err != nil {
  20. return err
  21. }
  22. if controlErr != nil {
  23. return controlErr
  24. }
  25. err = c.Control(func(fd uintptr) {
  26. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF, 999999); err != nil {
  27. controlErr = fmt.Errorf("SO_RCVBUF failed: %v", err)
  28. return
  29. }
  30. })
  31. if err != nil {
  32. return err
  33. }
  34. if controlErr != nil {
  35. return controlErr
  36. }
  37. if multi {
  38. var controlErr error
  39. err := c.Control(func(fd uintptr) {
  40. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, unix.SO_REUSEPORT, 1); err != nil {
  41. controlErr = fmt.Errorf("SO_REUSEPORT failed: %v", err)
  42. return
  43. }
  44. })
  45. if err != nil {
  46. return err
  47. }
  48. if controlErr != nil {
  49. return controlErr
  50. }
  51. }
  52. return nil
  53. },
  54. }
  55. }
  56. func (u *udpConn) Rebind() error {
  57. file, err := u.File()
  58. if err != nil {
  59. return err
  60. }
  61. return syscall.SetsockoptInt(int(file.Fd()), unix.IPPROTO_IP, unix.IP_BOUND_IF, 0)
  62. }