diff --git a/transport/internet/sockopt_linux_test.go b/transport/internet/sockopt_linux_test.go new file mode 100644 index 000000000..1d2cfc4ce --- /dev/null +++ b/transport/internet/sockopt_linux_test.go @@ -0,0 +1,48 @@ +package internet_test + +import ( + "context" + "syscall" + "testing" + + "v2ray.com/core/common" + "v2ray.com/core/common/net" + "v2ray.com/core/testing/servers/tcp" + . "v2ray.com/core/transport/internet" +) + +func TestSockOptMark(t *testing.T) { + t.Skip("requires CAP_NET_ADMIN") + + tcpServer := tcp.Server{ + MsgProcessor: func(b []byte) []byte { + return b + }, + } + dest, err := tcpServer.Start() + common.Must(err) + defer tcpServer.Close() + + const mark = 1 + ctx := context.Background() + ctx = ContextWithStreamSettings(ctx, &MemoryStreamConfig{ + SocketSettings: &SocketConfig{ + Mark: mark, + }, + }) + dialer := DefaultSystemDialer{} + conn, err := dialer.Dial(ctx, nil, dest) + common.Must(err) + defer conn.Close() + + rawConn, err := conn.(*net.TCPConn).SyscallConn() + common.Must(err) + err = rawConn.Control(func(fd uintptr) { + m, err := syscall.GetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_MARK) + common.Must(err) + if mark != m { + t.Fatal("unexpected conneciton mark", m, " want ", mark) + } + }) + common.Must(err) +} diff --git a/transport/internet/sockopt_test.go b/transport/internet/sockopt_test.go index 504c6a208..13487b7a7 100644 --- a/transport/internet/sockopt_test.go +++ b/transport/internet/sockopt_test.go @@ -2,13 +2,11 @@ package internet_test import ( "context" - "syscall" "testing" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/compare" - "v2ray.com/core/common/net" "v2ray.com/core/testing/servers/tcp" . "v2ray.com/core/transport/internet" ) @@ -43,39 +41,3 @@ func TestTCPFastOpen(t *testing.T) { t.Fatal(err) } } - -func TestSockOptMark(t *testing.T) { - t.Skip("requires CAP_NET_ADMIN") - - tcpServer := tcp.Server{ - MsgProcessor: func(b []byte) []byte { - return b - }, - } - dest, err := tcpServer.Start() - common.Must(err) - defer tcpServer.Close() - - const mark = 1 - ctx := context.Background() - ctx = ContextWithStreamSettings(ctx, &MemoryStreamConfig{ - SocketSettings: &SocketConfig{ - Mark: mark, - }, - }) - dialer := DefaultSystemDialer{} - conn, err := dialer.Dial(ctx, nil, dest) - common.Must(err) - defer conn.Close() - - rawConn, err := conn.(*net.TCPConn).SyscallConn() - common.Must(err) - err = rawConn.Control(func(fd uintptr) { - m, err := syscall.GetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_MARK) - common.Must(err) - if mark != m { - t.Fatal("unexpected conneciton mark", m, " want ", mark) - } - }) - common.Must(err) -} diff --git a/transport/internet/sockopt_unix.go b/transport/internet/sockopt_unix.go index c5e768a7c..bfc5a992a 100644 --- a/transport/internet/sockopt_unix.go +++ b/transport/internet/sockopt_unix.go @@ -8,21 +8,18 @@ import ( ) const ( - // For incoming connections. - TCP_FASTOPEN = 23 - // For out-going connections. - TCP_FASTOPEN_CONNECT = 30 + TCP_FASTOPEN = 0x105 ) func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error { if strings.HasPrefix(network, "tcp") { switch config.Tfo { case SocketConfig_Enable: - if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, TCP_FASTOPEN_CONNECT, 1); err != nil { + if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, TCP_FASTOPEN, 1); err != nil { return err } case SocketConfig_Disable: - if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, TCP_FASTOPEN_CONNECT, 0); err != nil { + if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, TCP_FASTOPEN, 0); err != nil { return err } }