diff --git a/common/dialer/default.go b/common/dialer/default.go index 992b3a89b..f3481439b 100644 --- a/common/dialer/default.go +++ b/common/dialer/default.go @@ -20,6 +20,8 @@ import ( M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" "github.com/sagernet/sing/service" + + "github.com/metacubex/tfo-go" ) var ( @@ -28,8 +30,8 @@ var ( ) type DefaultDialer struct { - dialer4 tcpDialer - dialer6 tcpDialer + dialer4 tfo.Dialer + dialer6 tfo.Dialer udpDialer4 net.Dialer udpDialer6 net.Dialer udpListener net.ListenConfig @@ -177,19 +179,10 @@ func NewDefault(ctx context.Context, options option.DialerOptions) (*DefaultDial udpAddr6 = M.SocksaddrFrom(bindAddr, 0).String() } if options.TCPMultiPath { - if !go121Available { - return nil, E.New("MultiPath TCP requires go1.21, please recompile your binary.") - } - setMultiPathTCP(&dialer4) - } - tcpDialer4, err := newTCPDialer(dialer4, options.TCPFastOpen) - if err != nil { - return nil, err - } - tcpDialer6, err := newTCPDialer(dialer6, options.TCPFastOpen) - if err != nil { - return nil, err + dialer4.SetMultipathTCP(true) } + tcpDialer4 := tfo.Dialer{Dialer: dialer4, DisableTFO: !options.TCPFastOpen} + tcpDialer6 := tfo.Dialer{Dialer: dialer6, DisableTFO: !options.TCPFastOpen} return &DefaultDialer{ dialer4: tcpDialer4, dialer6: tcpDialer6, @@ -269,7 +262,7 @@ func (d *DefaultDialer) DialParallelInterface(ctx context.Context, network strin } var dialer net.Dialer if N.NetworkName(network) == N.NetworkTCP { - dialer = dialerFromTCPDialer(d.dialer4) + dialer = d.dialer4.Dialer } else { dialer = d.udpDialer4 } @@ -317,9 +310,9 @@ func (d *DefaultDialer) ListenPacket(ctx context.Context, destination M.Socksadd func (d *DefaultDialer) DialerForICMPDestination(destination netip.Addr) net.Dialer { if !destination.Is6() { - return dialerFromTCPDialer(d.dialer6) + return d.dialer6.Dialer } else { - return dialerFromTCPDialer(d.dialer4) + return d.dialer4.Dialer } } diff --git a/common/dialer/default_go1.20.go b/common/dialer/default_go1.20.go deleted file mode 100644 index 9dde955f8..000000000 --- a/common/dialer/default_go1.20.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build go1.20 - -package dialer - -import ( - "net" - - "github.com/metacubex/tfo-go" -) - -type tcpDialer = tfo.Dialer - -func newTCPDialer(dialer net.Dialer, tfoEnabled bool) (tcpDialer, error) { - return tfo.Dialer{Dialer: dialer, DisableTFO: !tfoEnabled}, nil -} - -func dialerFromTCPDialer(dialer tcpDialer) net.Dialer { - return dialer.Dialer -} diff --git a/common/dialer/default_go1.21.go b/common/dialer/default_go1.21.go deleted file mode 100644 index 6ecb5b257..000000000 --- a/common/dialer/default_go1.21.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build go1.21 - -package dialer - -import "net" - -const go121Available = true - -func setMultiPathTCP(dialer *net.Dialer) { - dialer.SetMultipathTCP(true) -} diff --git a/common/dialer/default_nongo1.20.go b/common/dialer/default_nongo1.20.go deleted file mode 100644 index b2e4638d1..000000000 --- a/common/dialer/default_nongo1.20.go +++ /dev/null @@ -1,22 +0,0 @@ -//go:build !go1.20 - -package dialer - -import ( - "net" - - E "github.com/sagernet/sing/common/exceptions" -) - -type tcpDialer = net.Dialer - -func newTCPDialer(dialer net.Dialer, tfoEnabled bool) (tcpDialer, error) { - if tfoEnabled { - return dialer, E.New("TCP Fast Open requires go1.20, please recompile your binary.") - } - return dialer, nil -} - -func dialerFromTCPDialer(dialer tcpDialer) net.Dialer { - return dialer -} diff --git a/common/dialer/default_nongo1.21.go b/common/dialer/default_nongo1.21.go deleted file mode 100644 index 386d50dd0..000000000 --- a/common/dialer/default_nongo1.21.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build !go1.21 - -package dialer - -import ( - "net" -) - -const go121Available = false - -func setMultiPathTCP(dialer *net.Dialer) { -} diff --git a/common/dialer/tfo.go b/common/dialer/tfo.go index 4832c12da..ae04e71ff 100644 --- a/common/dialer/tfo.go +++ b/common/dialer/tfo.go @@ -1,5 +1,3 @@ -//go:build go1.20 - package dialer import ( @@ -32,7 +30,7 @@ type slowOpenConn struct { err error } -func DialSlowContext(dialer *tcpDialer, ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) { +func DialSlowContext(dialer *tfo.Dialer, ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) { if dialer.DisableTFO || N.NetworkName(network) != N.NetworkTCP { switch N.NetworkName(network) { case N.NetworkTCP, N.NetworkUDP: diff --git a/common/dialer/tfo_stub.go b/common/dialer/tfo_stub.go deleted file mode 100644 index 144902e5b..000000000 --- a/common/dialer/tfo_stub.go +++ /dev/null @@ -1,20 +0,0 @@ -//go:build !go1.20 - -package dialer - -import ( - "context" - "net" - - M "github.com/sagernet/sing/common/metadata" - N "github.com/sagernet/sing/common/network" -) - -func DialSlowContext(dialer *tcpDialer, ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) { - switch N.NetworkName(network) { - case N.NetworkTCP, N.NetworkUDP: - return dialer.DialContext(ctx, network, destination.String()) - default: - return dialer.DialContext(ctx, network, destination.AddrString()) - } -} diff --git a/common/listener/listener_go121.go b/common/listener/listener_go121.go deleted file mode 100644 index 5af1b05a3..000000000 --- a/common/listener/listener_go121.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build go1.21 - -package listener - -import "net" - -const go121Available = true - -func setMultiPathTCP(listenConfig *net.ListenConfig) { - listenConfig.SetMultipathTCP(true) -} diff --git a/common/listener/listener_go123.go b/common/listener/listener_go123.go deleted file mode 100644 index 2e1f4cf43..000000000 --- a/common/listener/listener_go123.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build go1.23 - -package listener - -import ( - "net" - "time" -) - -func setKeepAliveConfig(listener *net.ListenConfig, idle time.Duration, interval time.Duration) { - listener.KeepAliveConfig = net.KeepAliveConfig{ - Enable: true, - Idle: idle, - Interval: interval, - } -} diff --git a/common/listener/listener_nongo121.go b/common/listener/listener_nongo121.go deleted file mode 100644 index 36073afe3..000000000 --- a/common/listener/listener_nongo121.go +++ /dev/null @@ -1,10 +0,0 @@ -//go:build !go1.21 - -package listener - -import "net" - -const go121Available = false - -func setMultiPathTCP(listenConfig *net.ListenConfig) { -} diff --git a/common/listener/listener_nongo123.go b/common/listener/listener_nongo123.go deleted file mode 100644 index e1582981c..000000000 --- a/common/listener/listener_nongo123.go +++ /dev/null @@ -1,15 +0,0 @@ -//go:build !go1.23 - -package listener - -import ( - "net" - "time" - - "github.com/sagernet/sing/common/control" -) - -func setKeepAliveConfig(listener *net.ListenConfig, idle time.Duration, interval time.Duration) { - listener.KeepAlive = idle - listener.Control = control.Append(listener.Control, control.SetKeepAlivePeriod(idle, interval)) -} diff --git a/common/listener/listener_tcp.go b/common/listener/listener_tcp.go index 53d7bc86d..7ac7bbba9 100644 --- a/common/listener/listener_tcp.go +++ b/common/listener/listener_tcp.go @@ -46,13 +46,14 @@ func (l *Listener) ListenTCP() (net.Listener, error) { if keepInterval == 0 { keepInterval = C.TCPKeepAliveInterval } - setKeepAliveConfig(&listenConfig, keepIdle, keepInterval) + listenConfig.KeepAliveConfig = net.KeepAliveConfig{ + Enable: true, + Idle: keepIdle, + Interval: keepInterval, + } } if l.listenOptions.TCPMultiPath { - if !go121Available { - return nil, E.New("MultiPath TCP requires go1.21, please recompile your binary.") - } - setMultiPathTCP(&listenConfig) + listenConfig.SetMultipathTCP(true) } if l.tproxy { listenConfig.Control = control.Append(listenConfig.Control, func(network, address string, conn syscall.RawConn) error { diff --git a/common/tls/ech_stub.go b/common/tls/ech_stub.go deleted file mode 100644 index 357466c07..000000000 --- a/common/tls/ech_stub.go +++ /dev/null @@ -1,23 +0,0 @@ -//go:build !go1.24 - -package tls - -import ( - "context" - "crypto/tls" - - "github.com/sagernet/sing-box/option" - E "github.com/sagernet/sing/common/exceptions" -) - -func parseECHClientConfig(ctx context.Context, clientConfig ECHCapableConfig, options option.OutboundTLSOptions) (Config, error) { - return nil, E.New("ECH requires go1.24, please recompile your binary.") -} - -func parseECHServerConfig(ctx context.Context, options option.InboundTLSOptions, tlsConfig *tls.Config, echKeyPath *string) error { - return E.New("ECH requires go1.24, please recompile your binary.") -} - -func (c *STDServerConfig) setECHServerConfig(echKey []byte) error { - panic("unreachable") -}