sockopt_linux.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package internet
  2. import (
  3. "syscall"
  4. "v2ray.com/core/common/net"
  5. )
  6. const (
  7. // For incoming connections.
  8. TCP_FASTOPEN = 23
  9. // For out-going connections.
  10. TCP_FASTOPEN_CONNECT = 30
  11. )
  12. func bindAddr(fd uintptr, address net.Address, port net.Port) error {
  13. var sockaddr syscall.Sockaddr
  14. switch address.Family() {
  15. case net.AddressFamilyIPv4:
  16. a4 := &syscall.SockaddrInet4{
  17. Port: int(port),
  18. }
  19. copy(a4.Addr[:], address.IP())
  20. sockaddr = a4
  21. case net.AddressFamilyIPv6:
  22. a6 := &syscall.SockaddrInet6{
  23. Port: int(port),
  24. }
  25. copy(a6.Addr[:], address.IP())
  26. sockaddr = a6
  27. default:
  28. return newError("unsupported address family: ", address.Family())
  29. }
  30. return syscall.Bind(int(fd), sockaddr)
  31. }
  32. func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error {
  33. if config.Mark != 0 {
  34. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_MARK, int(config.Mark)); err != nil {
  35. return newError("failed to set SO_MARK").Base(err)
  36. }
  37. }
  38. if isTCPSocket(network) {
  39. switch config.Tfo {
  40. case SocketConfig_Enable:
  41. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN_CONNECT, 1); err != nil {
  42. return newError("failed to set TCP_FASTOPEN_CONNECT=1").Base(err)
  43. }
  44. case SocketConfig_Disable:
  45. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN_CONNECT, 0); err != nil {
  46. return newError("failed to set TCP_FASTOPEN_CONNECT=0").Base(err)
  47. }
  48. }
  49. }
  50. if config.Tproxy.IsEnabled() {
  51. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_IP, syscall.IP_TRANSPARENT, 1); err != nil {
  52. return newError("failed to set IP_TRANSPARENT").Base(err)
  53. }
  54. }
  55. return nil
  56. }
  57. func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig) error {
  58. if isTCPSocket(network) {
  59. switch config.Tfo {
  60. case SocketConfig_Enable:
  61. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN, 1); err != nil {
  62. return newError("failed to set TCP_FASTOPEN=1").Base(err)
  63. }
  64. case SocketConfig_Disable:
  65. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN, 0); err != nil {
  66. return newError("failed to set TCP_FASTOPEN=0").Base(err)
  67. }
  68. }
  69. }
  70. if config.Tproxy.IsEnabled() {
  71. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_IP, syscall.IP_TRANSPARENT, 1); err != nil {
  72. return newError("failed to set IP_TRANSPARENT").Base(err)
  73. }
  74. }
  75. if config.ReceiveOriginalDestAddress && isUDPSocket(network) {
  76. if err := syscall.SetsockoptInt(int(fd), syscall.SOL_IP, syscall.IP_RECVORIGDSTADDR, 1); err != nil {
  77. return err
  78. }
  79. }
  80. return nil
  81. }