sockopt_darwin.go 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package internet
  2. import (
  3. "golang.org/x/sys/unix"
  4. )
  5. const (
  6. // TCP_FASTOPEN_SERVER is the value to enable TCP fast open on darwin for server connections.
  7. TCP_FASTOPEN_SERVER = 0x01 // nolint: golint,stylecheck
  8. // TCP_FASTOPEN_CLIENT is the value to enable TCP fast open on darwin for client connections.
  9. TCP_FASTOPEN_CLIENT = 0x02 // nolint: revive,stylecheck
  10. // syscall.TCP_KEEPINTVL is missing on some darwin architectures.
  11. sysTCP_KEEPINTVL = 0x101 // nolint: revive,stylecheck
  12. )
  13. func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error {
  14. if isTCPSocket(network) {
  15. switch config.Tfo {
  16. case SocketConfig_Enable:
  17. if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_TCP, unix.TCP_FASTOPEN, TCP_FASTOPEN_CLIENT); err != nil {
  18. return err
  19. }
  20. case SocketConfig_Disable:
  21. if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_TCP, unix.TCP_FASTOPEN, 0); err != nil {
  22. return err
  23. }
  24. }
  25. if config.TcpKeepAliveIdle > 0 || config.TcpKeepAliveInterval > 0 {
  26. if config.TcpKeepAliveIdle > 0 {
  27. if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_TCP, unix.TCP_KEEPALIVE, int(config.TcpKeepAliveInterval)); err != nil {
  28. return newError("failed to set TCP_KEEPINTVL", err)
  29. }
  30. }
  31. if config.TcpKeepAliveInterval > 0 {
  32. if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_TCP, sysTCP_KEEPINTVL, int(config.TcpKeepAliveIdle)); err != nil {
  33. return newError("failed to set TCP_KEEPIDLE", err)
  34. }
  35. }
  36. if err := unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_KEEPALIVE, 1); err != nil {
  37. return newError("failed to set SO_KEEPALIVE", err)
  38. }
  39. }
  40. }
  41. return nil
  42. }
  43. func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig) error {
  44. if isTCPSocket(network) {
  45. switch config.Tfo {
  46. case SocketConfig_Enable:
  47. if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_TCP, unix.TCP_FASTOPEN, TCP_FASTOPEN_SERVER); err != nil {
  48. return err
  49. }
  50. case SocketConfig_Disable:
  51. if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_TCP, unix.TCP_FASTOPEN, 0); err != nil {
  52. return err
  53. }
  54. }
  55. if config.TcpKeepAliveIdle > 0 || config.TcpKeepAliveInterval > 0 {
  56. if config.TcpKeepAliveIdle > 0 {
  57. if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_TCP, unix.TCP_KEEPALIVE, int(config.TcpKeepAliveInterval)); err != nil {
  58. return newError("failed to set TCP_KEEPINTVL", err)
  59. }
  60. }
  61. if config.TcpKeepAliveInterval > 0 {
  62. if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_TCP, sysTCP_KEEPINTVL, int(config.TcpKeepAliveIdle)); err != nil {
  63. return newError("failed to set TCP_KEEPIDLE", err)
  64. }
  65. }
  66. if err := unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_KEEPALIVE, 1); err != nil {
  67. return newError("failed to set SO_KEEPALIVE", err)
  68. }
  69. }
  70. }
  71. return nil
  72. }
  73. func bindAddr(fd uintptr, address []byte, port uint32) error {
  74. return nil
  75. }
  76. func setReuseAddr(fd uintptr) error {
  77. return nil
  78. }
  79. func setReusePort(fd uintptr) error {
  80. return nil
  81. }