sockopt_linux.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package internet
  2. import (
  3. "strings"
  4. "syscall"
  5. )
  6. const (
  7. // For incoming connections.
  8. TCP_FASTOPEN = 23
  9. // For out-going connections.
  10. TCP_FASTOPEN_CONNECT = 30
  11. )
  12. func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error {
  13. if config.Mark != 0 {
  14. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_MARK, int(config.Mark)); err != nil {
  15. return err
  16. }
  17. }
  18. if strings.HasPrefix(network, "tcp") {
  19. switch config.Tfo {
  20. case SocketConfig_Enable:
  21. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN_CONNECT, 1); err != nil {
  22. return err
  23. }
  24. case SocketConfig_Disable:
  25. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN_CONNECT, 0); err != nil {
  26. return err
  27. }
  28. }
  29. }
  30. return nil
  31. }
  32. func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig) error {
  33. if strings.HasPrefix(network, "tcp") {
  34. switch config.Tfo {
  35. case SocketConfig_Enable:
  36. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN, 1); err != nil {
  37. return err
  38. }
  39. case SocketConfig_Disable:
  40. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN, 0); err != nil {
  41. return err
  42. }
  43. }
  44. }
  45. return nil
  46. }