From 44235d3de965287f6782cfadaacb2d1ed15a808f Mon Sep 17 00:00:00 2001 From: tobyxdd Date: Sat, 13 Sep 2025 16:17:59 -0700 Subject: [PATCH 1/2] feat: quic-go v0.54.0 --- .gitignore | 4 ++- app/go.mod | 5 +-- app/go.sum | 17 ++-------- .../proxymux/internal/mocks/mock_Conn.go | 8 ++--- .../proxymux/internal/mocks/mock_Listener.go | 8 ++--- core/client/client.go | 15 +++++---- core/client/mock_udpIO.go | 4 +-- core/client/udp.go | 2 +- core/go.mod | 7 +--- core/go.sum | 29 ++--------------- core/internal/congestion/bbr/bbr_sender.go | 10 ++---- core/internal/congestion/brutal/brutal.go | 2 +- core/internal/congestion/common/pacer.go | 4 +-- core/internal/congestion/utils.go | 4 +-- core/internal/integration_tests/hook_test.go | 3 +- core/internal/integration_tests/masq_test.go | 6 ++-- .../mocks/mock_Authenticator.go | 2 +- .../integration_tests/mocks/mock_Conn.go | 8 ++--- .../mocks/mock_EventLogger.go | 14 ++++---- .../integration_tests/mocks/mock_Outbound.go | 2 +- .../mocks/mock_RequestHook.go | 20 ++++++------ .../mocks/mock_TrafficLogger.go | 32 +++++++++---------- .../integration_tests/mocks/mock_UDPConn.go | 4 +-- core/internal/protocol/proxy.go | 3 +- core/internal/utils/qstream.go | 2 +- core/server/config.go | 16 ++++++++-- core/server/mock_UDPConn.go | 4 +-- core/server/mock_udpEventLogger.go | 6 ++-- core/server/mock_udpIO.go | 4 +-- core/server/server.go | 19 +++++------ core/server/udp.go | 2 +- extras/go.mod | 5 +-- extras/go.sum | 25 ++------------- extras/outbounds/mock_PluggableOutbound.go | 2 +- extras/outbounds/mock_UDPConn.go | 4 +-- extras/sniff/sniff.go | 5 ++- extras/trafficlogger/http.go | 15 ++++----- go.work.sum | 4 +++ 38 files changed, 133 insertions(+), 193 deletions(-) diff --git a/.gitignore b/.gitignore index 958549b..bdf9f0b 100644 --- a/.gitignore +++ b/.gitignore @@ -467,4 +467,6 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk -# End of https://www.toptal.com/developers/gitignore/api/goland+all,intellij+all,go,windows,linux,macos,python,pycharm+all \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/goland+all,intellij+all,go,windows,linux,macos,python,pycharm+all + +test-configs/ diff --git a/app/go.mod b/app/go.mod index 61ef449..d7b9ec6 100644 --- a/app/go.mod +++ b/app/go.mod @@ -30,16 +30,14 @@ require ( require ( github.com/andybalholm/brotli v1.1.0 // indirect - github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 // indirect + github.com/apernet/quic-go v0.54.1-0.20250907230547-eb32f8aec5e2 // indirect github.com/cloudflare/circl v1.3.9 // indirect github.com/database64128/netx-go v0.0.0-20240905055117-62795b8b054a // indirect github.com/database64128/tfo-go/v2 v2.2.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/google/go-querystring v1.1.0 // indirect - github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.6 // indirect github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect @@ -51,7 +49,6 @@ require ( github.com/magiconair/properties v1.8.7 // indirect github.com/miekg/dns v1.1.59 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/onsi/ginkgo/v2 v2.9.5 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pkg/errors v0.9.1 // indirect diff --git a/app/go.sum b/app/go.sum index 69b3367..dcb0081 100644 --- a/app/go.sum +++ b/app/go.sum @@ -42,8 +42,8 @@ github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1 github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/apernet/go-tproxy v0.0.0-20230809025308-8f4723fd742f h1:uVh0qpEslrWjgzx9vOcyCqsOY3c9kofDZ1n+qaw35ZY= github.com/apernet/go-tproxy v0.0.0-20230809025308-8f4723fd742f/go.mod h1:xkkq9D4ygcldQQhKS/w9CadiCKwCngU7K9E3DaKahpM= -github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 h1:9/jM7e+kVALd7Jfu1c27dcEpT/Fd/Gzq2OsQjKjakKI= -github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431/go.mod h1:I/47OIGG5H/IfAm+nz2c6hm6b/NkEhpvptAoiPcY7jQ= +github.com/apernet/quic-go v0.54.1-0.20250907230547-eb32f8aec5e2 h1:03y2WeGln3/QmBzm+KGQ3yej7Uz+76CqHoisdzYzf30= +github.com/apernet/quic-go v0.54.1-0.20250907230547-eb32f8aec5e2/go.mod h1:Y4cCWi64O51TRUKDPy0ShA2/pevlWiWJJnlNo2fO2ds= github.com/apernet/sing-tun v0.2.6-0.20250726070404-c99085f9af13 h1:gzets97c/u5iMj1zjanMBVkIYOdaVw+RXPzTT1xQoyM= github.com/apernet/sing-tun v0.2.6-0.20250726070404-c99085f9af13/go.mod h1:S5IydyLSN/QAfvY+r2GoomPJ6hidtXWm/Ad18sJVssk= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= @@ -83,12 +83,8 @@ github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyT github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -114,8 +110,6 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -144,8 +138,6 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -213,10 +205,6 @@ github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= -github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= @@ -263,7 +251,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= diff --git a/app/internal/proxymux/internal/mocks/mock_Conn.go b/app/internal/proxymux/internal/mocks/mock_Conn.go index 13e363e..d75f34b 100644 --- a/app/internal/proxymux/internal/mocks/mock_Conn.go +++ b/app/internal/proxymux/internal/mocks/mock_Conn.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package mocks @@ -23,7 +23,7 @@ func (_m *MockConn) EXPECT() *MockConn_Expecter { return &MockConn_Expecter{mock: &_m.Mock} } -// Close provides a mock function with given fields: +// Close provides a mock function with no fields func (_m *MockConn) Close() error { ret := _m.Called() @@ -68,7 +68,7 @@ func (_c *MockConn_Close_Call) RunAndReturn(run func() error) *MockConn_Close_Ca return _c } -// LocalAddr provides a mock function with given fields: +// LocalAddr provides a mock function with no fields func (_m *MockConn) LocalAddr() net.Addr { ret := _m.Called() @@ -171,7 +171,7 @@ func (_c *MockConn_Read_Call) RunAndReturn(run func([]byte) (int, error)) *MockC return _c } -// RemoteAddr provides a mock function with given fields: +// RemoteAddr provides a mock function with no fields func (_m *MockConn) RemoteAddr() net.Addr { ret := _m.Called() diff --git a/app/internal/proxymux/internal/mocks/mock_Listener.go b/app/internal/proxymux/internal/mocks/mock_Listener.go index 842b88f..c361a97 100644 --- a/app/internal/proxymux/internal/mocks/mock_Listener.go +++ b/app/internal/proxymux/internal/mocks/mock_Listener.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package mocks @@ -21,7 +21,7 @@ func (_m *MockListener) EXPECT() *MockListener_Expecter { return &MockListener_Expecter{mock: &_m.Mock} } -// Accept provides a mock function with given fields: +// Accept provides a mock function with no fields func (_m *MockListener) Accept() (net.Conn, error) { ret := _m.Called() @@ -78,7 +78,7 @@ func (_c *MockListener_Accept_Call) RunAndReturn(run func() (net.Conn, error)) * return _c } -// Addr provides a mock function with given fields: +// Addr provides a mock function with no fields func (_m *MockListener) Addr() net.Addr { ret := _m.Called() @@ -125,7 +125,7 @@ func (_c *MockListener_Addr_Call) RunAndReturn(run func() net.Addr) *MockListene return _c } -// Close provides a mock function with given fields: +// Close provides a mock function with no fields func (_m *MockListener) Close() error { ret := _m.Called() diff --git a/core/client/client.go b/core/client/client.go index b1326a3..5302ca7 100644 --- a/core/client/client.go +++ b/core/client/client.go @@ -58,7 +58,7 @@ type clientImpl struct { config *Config pktConn net.PacketConn - conn quic.Connection + conn *quic.Conn udpSM *udpSessionManager } @@ -85,14 +85,15 @@ func (c *clientImpl) connect() (*HandshakeInfo, error) { KeepAlivePeriod: c.config.QUICConfig.KeepAlivePeriod, DisablePathMTUDiscovery: c.config.QUICConfig.DisablePathMTUDiscovery, EnableDatagrams: true, + MaxDatagramFrameSize: protocol.MaxDatagramFrameSize, DisablePathManager: true, } // Prepare RoundTripper - var conn quic.EarlyConnection - rt := &http3.RoundTripper{ + var conn *quic.Conn + rt := &http3.Transport{ TLSClientConfig: tlsConfig, QUICConfig: quicConfig, - Dial: func(ctx context.Context, _ string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) { + Dial: func(ctx context.Context, _ string, tlsCfg *tls.Config, cfg *quic.Config) (*quic.Conn, error) { qc, err := quic.DialEarly(ctx, pktConn, c.config.ServerAddr, tlsCfg, cfg) if err != nil { return nil, err @@ -163,7 +164,7 @@ func (c *clientImpl) connect() (*HandshakeInfo, error) { } // openStream wraps the stream with QStream, which handles Close() properly -func (c *clientImpl) openStream() (quic.Stream, error) { +func (c *clientImpl) openStream() (*utils.QStream, error) { stream, err := c.conn.OpenStream() if err != nil { return nil, err @@ -242,7 +243,7 @@ func wrapIfConnectionClosed(err error) error { } type tcpConn struct { - Orig quic.Stream + Orig *utils.QStream PseudoLocalAddr net.Addr PseudoRemoteAddr net.Addr Established bool @@ -292,7 +293,7 @@ func (c *tcpConn) SetWriteDeadline(t time.Time) error { } type udpIOImpl struct { - Conn quic.Connection + Conn *quic.Conn } func (io *udpIOImpl) ReceiveMessage() (*protocol.UDPMessage, error) { diff --git a/core/client/mock_udpIO.go b/core/client/mock_udpIO.go index aa1444e..dbff53c 100644 --- a/core/client/mock_udpIO.go +++ b/core/client/mock_udpIO.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package client @@ -20,7 +20,7 @@ func (_m *mockUDPIO) EXPECT() *mockUDPIO_Expecter { return &mockUDPIO_Expecter{mock: &_m.Mock} } -// ReceiveMessage provides a mock function with given fields: +// ReceiveMessage provides a mock function with no fields func (_m *mockUDPIO) ReceiveMessage() (*protocol.UDPMessage, error) { ret := _m.Called() diff --git a/core/client/udp.go b/core/client/udp.go index ca98095..e190627 100644 --- a/core/client/udp.go +++ b/core/client/udp.go @@ -64,7 +64,7 @@ func (u *udpConn) Send(data []byte, addr string) error { if errors.As(err, &errTooLarge) { // Message too large, try fragmentation msg.PacketID = uint16(rand.Intn(0xFFFF)) + 1 - fMsgs := frag.FragUDPMessage(msg, int(errTooLarge.MaxDataLen)) + fMsgs := frag.FragUDPMessage(msg, int(errTooLarge.MaxDatagramPayloadSize)) for _, fMsg := range fMsgs { err := u.SendFunc(u.SendBuf, &fMsg) if err != nil { diff --git a/core/go.mod b/core/go.mod index a6ba575..7126d9a 100644 --- a/core/go.mod +++ b/core/go.mod @@ -5,7 +5,7 @@ go 1.23 toolchain go1.24.2 require ( - github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 + github.com/apernet/quic-go v0.54.1-0.20250907230547-eb32f8aec5e2 github.com/stretchr/testify v1.9.0 go.uber.org/goleak v1.2.1 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 @@ -14,11 +14,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/kr/pretty v0.3.1 // indirect - github.com/onsi/ginkgo/v2 v2.9.5 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/quic-go/qpack v0.5.1 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect @@ -31,7 +27,6 @@ require ( golang.org/x/sys v0.25.0 // indirect golang.org/x/text v0.17.0 // indirect golang.org/x/tools v0.22.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/core/go.sum b/core/go.sum index f44407d..97f1fb8 100644 --- a/core/go.sum +++ b/core/go.sum @@ -1,23 +1,8 @@ -github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 h1:9/jM7e+kVALd7Jfu1c27dcEpT/Fd/Gzq2OsQjKjakKI= -github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431/go.mod h1:I/47OIGG5H/IfAm+nz2c6hm6b/NkEhpvptAoiPcY7jQ= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/apernet/quic-go v0.54.1-0.20250907230547-eb32f8aec5e2 h1:03y2WeGln3/QmBzm+KGQ3yej7Uz+76CqHoisdzYzf30= +github.com/apernet/quic-go v0.54.1-0.20250907230547-eb32f8aec5e2/go.mod h1:Y4cCWi64O51TRUKDPy0ShA2/pevlWiWJJnlNo2fO2ds= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -25,10 +10,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= -github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -37,10 +18,8 @@ github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1 github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= @@ -57,7 +36,6 @@ golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= @@ -66,11 +44,8 @@ golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/core/internal/congestion/bbr/bbr_sender.go b/core/internal/congestion/bbr/bbr_sender.go index 8f58e1f..f5bf834 100644 --- a/core/internal/congestion/bbr/bbr_sender.go +++ b/core/internal/congestion/bbr/bbr_sender.go @@ -31,7 +31,7 @@ const ( // Constants based on TCP defaults. // The minimum CWND to ensure delayed acks don't reduce bandwidth measurements. // Does not inflate the pacing rate. - defaultMinimumCongestionWindow = 4 * congestion.ByteCount(congestion.InitialPacketSizeIPv4) + defaultMinimumCongestionWindow = 4 * congestion.ByteCount(congestion.InitialPacketSize) // The gain used for the STARTUP, equal to 2/ln(2). defaultHighGain = 2.885 @@ -961,12 +961,8 @@ func bdpFromRttAndBandwidth(rtt time.Duration, bandwidth Bandwidth) congestion.B func GetInitialPacketSize(addr net.Addr) congestion.ByteCount { // If this is not a UDP address, we don't know anything about the MTU. // Use the minimum size of an Initial packet as the max packet size. - if udpAddr, ok := addr.(*net.UDPAddr); ok { - if udpAddr.IP.To4() != nil { - return congestion.InitialPacketSizeIPv4 - } else { - return congestion.InitialPacketSizeIPv6 - } + if _, ok := addr.(*net.UDPAddr); ok { + return congestion.InitialPacketSize } else { return congestion.MinInitialPacketSize } diff --git a/core/internal/congestion/brutal/brutal.go b/core/internal/congestion/brutal/brutal.go index de591a9..1c9b89b 100644 --- a/core/internal/congestion/brutal/brutal.go +++ b/core/internal/congestion/brutal/brutal.go @@ -46,7 +46,7 @@ func NewBrutalSender(bps uint64) *BrutalSender { debug, _ := strconv.ParseBool(os.Getenv(debugEnv)) bs := &BrutalSender{ bps: congestion.ByteCount(bps), - maxDatagramSize: congestion.InitialPacketSizeIPv4, + maxDatagramSize: congestion.InitialPacketSize, ackRate: 1, debug: debug, } diff --git a/core/internal/congestion/common/pacer.go b/core/internal/congestion/common/pacer.go index 6adbd81..995cf4c 100644 --- a/core/internal/congestion/common/pacer.go +++ b/core/internal/congestion/common/pacer.go @@ -21,8 +21,8 @@ type Pacer struct { func NewPacer(getBandwidth func() congestion.ByteCount) *Pacer { p := &Pacer{ - budgetAtLastSent: maxBurstPackets * congestion.InitialPacketSizeIPv4, - maxDatagramSize: congestion.InitialPacketSizeIPv4, + budgetAtLastSent: maxBurstPackets * congestion.InitialPacketSize, + maxDatagramSize: congestion.InitialPacketSize, getBandwidth: getBandwidth, } return p diff --git a/core/internal/congestion/utils.go b/core/internal/congestion/utils.go index 1e06060..5337d11 100644 --- a/core/internal/congestion/utils.go +++ b/core/internal/congestion/utils.go @@ -6,13 +6,13 @@ import ( "github.com/apernet/quic-go" ) -func UseBBR(conn quic.Connection) { +func UseBBR(conn *quic.Conn) { conn.SetCongestionControl(bbr.NewBbrSender( bbr.DefaultClock{}, bbr.GetInitialPacketSize(conn.RemoteAddr()), )) } -func UseBrutal(conn quic.Connection, tx uint64) { +func UseBrutal(conn *quic.Conn, tx uint64) { conn.SetCongestionControl(brutal.NewBrutalSender(tx)) } diff --git a/core/internal/integration_tests/hook_test.go b/core/internal/integration_tests/hook_test.go index 64affe8..db95995 100644 --- a/core/internal/integration_tests/hook_test.go +++ b/core/internal/integration_tests/hook_test.go @@ -8,7 +8,6 @@ import ( "github.com/apernet/hysteria/core/v2/client" "github.com/apernet/hysteria/core/v2/internal/integration_tests/mocks" "github.com/apernet/hysteria/core/v2/server" - "github.com/apernet/quic-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) @@ -24,7 +23,7 @@ func TestClientServerHookTCP(t *testing.T) { auth.EXPECT().Authenticate(mock.Anything, mock.Anything, mock.Anything).Return(true, "nobody") hook := mocks.NewMockRequestHook(t) hook.EXPECT().Check(false, fakeEchoAddr).Return(true).Once() - hook.EXPECT().TCP(mock.Anything, mock.Anything).RunAndReturn(func(stream quic.Stream, s *string) ([]byte, error) { + hook.EXPECT().TCP(mock.Anything, mock.Anything).RunAndReturn(func(stream server.HyStream, s *string) ([]byte, error) { assert.Equal(t, fakeEchoAddr, *s) // Change the address *s = realEchoAddr diff --git a/core/internal/integration_tests/masq_test.go b/core/internal/integration_tests/masq_test.go index e3dee14..584e2f1 100644 --- a/core/internal/integration_tests/masq_test.go +++ b/core/internal/integration_tests/masq_test.go @@ -39,12 +39,12 @@ func TestServerMasquerade(t *testing.T) { go s.Serve() // QUIC connection & RoundTripper - var conn quic.EarlyConnection - rt := &http3.RoundTripper{ + var conn *quic.Conn + rt := &http3.Transport{ TLSClientConfig: &tls.Config{ InsecureSkipVerify: true, }, - Dial: func(ctx context.Context, _ string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) { + Dial: func(ctx context.Context, _ string, tlsCfg *tls.Config, cfg *quic.Config) (*quic.Conn, error) { qc, err := quic.DialAddrEarly(ctx, udpAddr.String(), tlsCfg, cfg) if err != nil { return nil, err diff --git a/core/internal/integration_tests/mocks/mock_Authenticator.go b/core/internal/integration_tests/mocks/mock_Authenticator.go index b42c737..018b499 100644 --- a/core/internal/integration_tests/mocks/mock_Authenticator.go +++ b/core/internal/integration_tests/mocks/mock_Authenticator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package mocks diff --git a/core/internal/integration_tests/mocks/mock_Conn.go b/core/internal/integration_tests/mocks/mock_Conn.go index 13e363e..d75f34b 100644 --- a/core/internal/integration_tests/mocks/mock_Conn.go +++ b/core/internal/integration_tests/mocks/mock_Conn.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package mocks @@ -23,7 +23,7 @@ func (_m *MockConn) EXPECT() *MockConn_Expecter { return &MockConn_Expecter{mock: &_m.Mock} } -// Close provides a mock function with given fields: +// Close provides a mock function with no fields func (_m *MockConn) Close() error { ret := _m.Called() @@ -68,7 +68,7 @@ func (_c *MockConn_Close_Call) RunAndReturn(run func() error) *MockConn_Close_Ca return _c } -// LocalAddr provides a mock function with given fields: +// LocalAddr provides a mock function with no fields func (_m *MockConn) LocalAddr() net.Addr { ret := _m.Called() @@ -171,7 +171,7 @@ func (_c *MockConn_Read_Call) RunAndReturn(run func([]byte) (int, error)) *MockC return _c } -// RemoteAddr provides a mock function with given fields: +// RemoteAddr provides a mock function with no fields func (_m *MockConn) RemoteAddr() net.Addr { ret := _m.Called() diff --git a/core/internal/integration_tests/mocks/mock_EventLogger.go b/core/internal/integration_tests/mocks/mock_EventLogger.go index c9f6920..14f2175 100644 --- a/core/internal/integration_tests/mocks/mock_EventLogger.go +++ b/core/internal/integration_tests/mocks/mock_EventLogger.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package mocks @@ -52,7 +52,7 @@ func (_c *MockEventLogger_Connect_Call) Return() *MockEventLogger_Connect_Call { } func (_c *MockEventLogger_Connect_Call) RunAndReturn(run func(net.Addr, string, uint64)) *MockEventLogger_Connect_Call { - _c.Call.Return(run) + _c.Run(run) return _c } @@ -87,7 +87,7 @@ func (_c *MockEventLogger_Disconnect_Call) Return() *MockEventLogger_Disconnect_ } func (_c *MockEventLogger_Disconnect_Call) RunAndReturn(run func(net.Addr, string, error)) *MockEventLogger_Disconnect_Call { - _c.Call.Return(run) + _c.Run(run) return _c } @@ -123,7 +123,7 @@ func (_c *MockEventLogger_TCPError_Call) Return() *MockEventLogger_TCPError_Call } func (_c *MockEventLogger_TCPError_Call) RunAndReturn(run func(net.Addr, string, string, error)) *MockEventLogger_TCPError_Call { - _c.Call.Return(run) + _c.Run(run) return _c } @@ -158,7 +158,7 @@ func (_c *MockEventLogger_TCPRequest_Call) Return() *MockEventLogger_TCPRequest_ } func (_c *MockEventLogger_TCPRequest_Call) RunAndReturn(run func(net.Addr, string, string)) *MockEventLogger_TCPRequest_Call { - _c.Call.Return(run) + _c.Run(run) return _c } @@ -194,7 +194,7 @@ func (_c *MockEventLogger_UDPError_Call) Return() *MockEventLogger_UDPError_Call } func (_c *MockEventLogger_UDPError_Call) RunAndReturn(run func(net.Addr, string, uint32, error)) *MockEventLogger_UDPError_Call { - _c.Call.Return(run) + _c.Run(run) return _c } @@ -230,7 +230,7 @@ func (_c *MockEventLogger_UDPRequest_Call) Return() *MockEventLogger_UDPRequest_ } func (_c *MockEventLogger_UDPRequest_Call) RunAndReturn(run func(net.Addr, string, uint32, string)) *MockEventLogger_UDPRequest_Call { - _c.Call.Return(run) + _c.Run(run) return _c } diff --git a/core/internal/integration_tests/mocks/mock_Outbound.go b/core/internal/integration_tests/mocks/mock_Outbound.go index 52f7178..6167bc5 100644 --- a/core/internal/integration_tests/mocks/mock_Outbound.go +++ b/core/internal/integration_tests/mocks/mock_Outbound.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package mocks diff --git a/core/internal/integration_tests/mocks/mock_RequestHook.go b/core/internal/integration_tests/mocks/mock_RequestHook.go index 5418eaf..49e8c6c 100644 --- a/core/internal/integration_tests/mocks/mock_RequestHook.go +++ b/core/internal/integration_tests/mocks/mock_RequestHook.go @@ -1,9 +1,9 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package mocks import ( - quic "github.com/apernet/quic-go" + server "github.com/apernet/hysteria/core/v2/server" mock "github.com/stretchr/testify/mock" ) @@ -68,7 +68,7 @@ func (_c *MockRequestHook_Check_Call) RunAndReturn(run func(bool, string) bool) } // TCP provides a mock function with given fields: stream, reqAddr -func (_m *MockRequestHook) TCP(stream quic.Stream, reqAddr *string) ([]byte, error) { +func (_m *MockRequestHook) TCP(stream server.HyStream, reqAddr *string) ([]byte, error) { ret := _m.Called(stream, reqAddr) if len(ret) == 0 { @@ -77,10 +77,10 @@ func (_m *MockRequestHook) TCP(stream quic.Stream, reqAddr *string) ([]byte, err var r0 []byte var r1 error - if rf, ok := ret.Get(0).(func(quic.Stream, *string) ([]byte, error)); ok { + if rf, ok := ret.Get(0).(func(server.HyStream, *string) ([]byte, error)); ok { return rf(stream, reqAddr) } - if rf, ok := ret.Get(0).(func(quic.Stream, *string) []byte); ok { + if rf, ok := ret.Get(0).(func(server.HyStream, *string) []byte); ok { r0 = rf(stream, reqAddr) } else { if ret.Get(0) != nil { @@ -88,7 +88,7 @@ func (_m *MockRequestHook) TCP(stream quic.Stream, reqAddr *string) ([]byte, err } } - if rf, ok := ret.Get(1).(func(quic.Stream, *string) error); ok { + if rf, ok := ret.Get(1).(func(server.HyStream, *string) error); ok { r1 = rf(stream, reqAddr) } else { r1 = ret.Error(1) @@ -103,15 +103,15 @@ type MockRequestHook_TCP_Call struct { } // TCP is a helper method to define mock.On call -// - stream quic.Stream +// - stream server.HyStream // - reqAddr *string func (_e *MockRequestHook_Expecter) TCP(stream interface{}, reqAddr interface{}) *MockRequestHook_TCP_Call { return &MockRequestHook_TCP_Call{Call: _e.mock.On("TCP", stream, reqAddr)} } -func (_c *MockRequestHook_TCP_Call) Run(run func(stream quic.Stream, reqAddr *string)) *MockRequestHook_TCP_Call { +func (_c *MockRequestHook_TCP_Call) Run(run func(stream server.HyStream, reqAddr *string)) *MockRequestHook_TCP_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(quic.Stream), args[1].(*string)) + run(args[0].(server.HyStream), args[1].(*string)) }) return _c } @@ -121,7 +121,7 @@ func (_c *MockRequestHook_TCP_Call) Return(_a0 []byte, _a1 error) *MockRequestHo return _c } -func (_c *MockRequestHook_TCP_Call) RunAndReturn(run func(quic.Stream, *string) ([]byte, error)) *MockRequestHook_TCP_Call { +func (_c *MockRequestHook_TCP_Call) RunAndReturn(run func(server.HyStream, *string) ([]byte, error)) *MockRequestHook_TCP_Call { _c.Call.Return(run) return _c } diff --git a/core/internal/integration_tests/mocks/mock_TrafficLogger.go b/core/internal/integration_tests/mocks/mock_TrafficLogger.go index 1ed977e..92ed6ed 100644 --- a/core/internal/integration_tests/mocks/mock_TrafficLogger.go +++ b/core/internal/integration_tests/mocks/mock_TrafficLogger.go @@ -1,12 +1,10 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package mocks import ( - quic "github.com/apernet/quic-go" - mock "github.com/stretchr/testify/mock" - server "github.com/apernet/hysteria/core/v2/server" + mock "github.com/stretchr/testify/mock" ) // MockTrafficLogger is an autogenerated mock type for the TrafficLogger type @@ -52,7 +50,7 @@ func (_c *MockTrafficLogger_LogOnlineState_Call) Return() *MockTrafficLogger_Log } func (_c *MockTrafficLogger_LogOnlineState_Call) RunAndReturn(run func(string, bool)) *MockTrafficLogger_LogOnlineState_Call { - _c.Call.Return(run) + _c.Run(run) return _c } @@ -105,7 +103,7 @@ func (_c *MockTrafficLogger_LogTraffic_Call) RunAndReturn(run func(string, uint6 } // TraceStream provides a mock function with given fields: stream, stats -func (_m *MockTrafficLogger) TraceStream(stream quic.Stream, stats *server.StreamStats) { +func (_m *MockTrafficLogger) TraceStream(stream server.HyStream, stats *server.StreamStats) { _m.Called(stream, stats) } @@ -115,15 +113,15 @@ type MockTrafficLogger_TraceStream_Call struct { } // TraceStream is a helper method to define mock.On call -// - stream quic.Stream +// - stream server.HyStream // - stats *server.StreamStats func (_e *MockTrafficLogger_Expecter) TraceStream(stream interface{}, stats interface{}) *MockTrafficLogger_TraceStream_Call { return &MockTrafficLogger_TraceStream_Call{Call: _e.mock.On("TraceStream", stream, stats)} } -func (_c *MockTrafficLogger_TraceStream_Call) Run(run func(stream quic.Stream, stats *server.StreamStats)) *MockTrafficLogger_TraceStream_Call { +func (_c *MockTrafficLogger_TraceStream_Call) Run(run func(stream server.HyStream, stats *server.StreamStats)) *MockTrafficLogger_TraceStream_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(quic.Stream), args[1].(*server.StreamStats)) + run(args[0].(server.HyStream), args[1].(*server.StreamStats)) }) return _c } @@ -133,13 +131,13 @@ func (_c *MockTrafficLogger_TraceStream_Call) Return() *MockTrafficLogger_TraceS return _c } -func (_c *MockTrafficLogger_TraceStream_Call) RunAndReturn(run func(quic.Stream, *server.StreamStats)) *MockTrafficLogger_TraceStream_Call { - _c.Call.Return(run) +func (_c *MockTrafficLogger_TraceStream_Call) RunAndReturn(run func(server.HyStream, *server.StreamStats)) *MockTrafficLogger_TraceStream_Call { + _c.Run(run) return _c } // UntraceStream provides a mock function with given fields: stream -func (_m *MockTrafficLogger) UntraceStream(stream quic.Stream) { +func (_m *MockTrafficLogger) UntraceStream(stream server.HyStream) { _m.Called(stream) } @@ -149,14 +147,14 @@ type MockTrafficLogger_UntraceStream_Call struct { } // UntraceStream is a helper method to define mock.On call -// - stream quic.Stream +// - stream server.HyStream func (_e *MockTrafficLogger_Expecter) UntraceStream(stream interface{}) *MockTrafficLogger_UntraceStream_Call { return &MockTrafficLogger_UntraceStream_Call{Call: _e.mock.On("UntraceStream", stream)} } -func (_c *MockTrafficLogger_UntraceStream_Call) Run(run func(stream quic.Stream)) *MockTrafficLogger_UntraceStream_Call { +func (_c *MockTrafficLogger_UntraceStream_Call) Run(run func(stream server.HyStream)) *MockTrafficLogger_UntraceStream_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(quic.Stream)) + run(args[0].(server.HyStream)) }) return _c } @@ -166,8 +164,8 @@ func (_c *MockTrafficLogger_UntraceStream_Call) Return() *MockTrafficLogger_Untr return _c } -func (_c *MockTrafficLogger_UntraceStream_Call) RunAndReturn(run func(quic.Stream)) *MockTrafficLogger_UntraceStream_Call { - _c.Call.Return(run) +func (_c *MockTrafficLogger_UntraceStream_Call) RunAndReturn(run func(server.HyStream)) *MockTrafficLogger_UntraceStream_Call { + _c.Run(run) return _c } diff --git a/core/internal/integration_tests/mocks/mock_UDPConn.go b/core/internal/integration_tests/mocks/mock_UDPConn.go index b883870..965edc0 100644 --- a/core/internal/integration_tests/mocks/mock_UDPConn.go +++ b/core/internal/integration_tests/mocks/mock_UDPConn.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package mocks @@ -17,7 +17,7 @@ func (_m *MockUDPConn) EXPECT() *MockUDPConn_Expecter { return &MockUDPConn_Expecter{mock: &_m.Mock} } -// Close provides a mock function with given fields: +// Close provides a mock function with no fields func (_m *MockUDPConn) Close() error { ret := _m.Called() diff --git a/core/internal/protocol/proxy.go b/core/internal/protocol/proxy.go index 9335c47..ede3919 100644 --- a/core/internal/protocol/proxy.go +++ b/core/internal/protocol/proxy.go @@ -20,7 +20,8 @@ const ( MaxMessageLength = 2048 MaxPaddingLength = 4096 - MaxUDPSize = 4096 + MaxDatagramFrameSize = 1200 + MaxUDPSize = 4096 maxVarInt1 = 63 maxVarInt2 = 16383 diff --git a/core/internal/utils/qstream.go b/core/internal/utils/qstream.go index a3a4833..76519b6 100644 --- a/core/internal/utils/qstream.go +++ b/core/internal/utils/qstream.go @@ -17,7 +17,7 @@ import ( // - https://github.com/quic-go/quic-go/issues/3558 // - https://github.com/quic-go/quic-go/issues/1599 type QStream struct { - Stream quic.Stream + Stream *quic.Stream } func (s *QStream) StreamID() quic.StreamID { diff --git a/core/server/config.go b/core/server/config.go index ecdfec9..9873318 100644 --- a/core/server/config.go +++ b/core/server/config.go @@ -125,7 +125,7 @@ type QUICConfig struct { // of a UDP connection. It also cannot put back any data as the first packet is always sent as-is. type RequestHook interface { Check(isUDP bool, reqAddr string) bool - TCP(stream quic.Stream, reqAddr *string) ([]byte, error) + TCP(stream HyStream, reqAddr *string) ([]byte, error) UDP(data []byte, reqAddr *string) error } @@ -205,6 +205,16 @@ type EventLogger interface { UDPError(addr net.Addr, id string, sessionID uint32, err error) } +type HyStream interface { + StreamID() quic.StreamID + Read(p []byte) (n int, err error) + Write(p []byte) (n int, err error) + Close() error + SetReadDeadline(t time.Time) error + SetWriteDeadline(t time.Time) error + SetDeadline(t time.Time) error +} + // TrafficLogger is an interface that provides traffic logging logic. // Tx/Rx in this context refers to the server-remote (proxy target) perspective. // Tx is the bytes sent from the server to the remote. @@ -216,8 +226,8 @@ type EventLogger interface { type TrafficLogger interface { LogTraffic(id string, tx, rx uint64) (ok bool) LogOnlineState(id string, online bool) - TraceStream(stream quic.Stream, stats *StreamStats) - UntraceStream(stream quic.Stream) + TraceStream(stream HyStream, stats *StreamStats) + UntraceStream(stream HyStream) } type StreamState int diff --git a/core/server/mock_UDPConn.go b/core/server/mock_UDPConn.go index 7299975..5f3d2e9 100644 --- a/core/server/mock_UDPConn.go +++ b/core/server/mock_UDPConn.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package server @@ -17,7 +17,7 @@ func (_m *mockUDPConn) EXPECT() *mockUDPConn_Expecter { return &mockUDPConn_Expecter{mock: &_m.Mock} } -// Close provides a mock function with given fields: +// Close provides a mock function with no fields func (_m *mockUDPConn) Close() error { ret := _m.Called() diff --git a/core/server/mock_udpEventLogger.go b/core/server/mock_udpEventLogger.go index 5a54b0b..e1d3db9 100644 --- a/core/server/mock_udpEventLogger.go +++ b/core/server/mock_udpEventLogger.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package server @@ -47,7 +47,7 @@ func (_c *mockUDPEventLogger_Close_Call) Return() *mockUDPEventLogger_Close_Call } func (_c *mockUDPEventLogger_Close_Call) RunAndReturn(run func(uint32, error)) *mockUDPEventLogger_Close_Call { - _c.Call.Return(run) + _c.Run(run) return _c } @@ -81,7 +81,7 @@ func (_c *mockUDPEventLogger_New_Call) Return() *mockUDPEventLogger_New_Call { } func (_c *mockUDPEventLogger_New_Call) RunAndReturn(run func(uint32, string)) *mockUDPEventLogger_New_Call { - _c.Call.Return(run) + _c.Run(run) return _c } diff --git a/core/server/mock_udpIO.go b/core/server/mock_udpIO.go index bbdcf94..a472203 100644 --- a/core/server/mock_udpIO.go +++ b/core/server/mock_udpIO.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package server @@ -67,7 +67,7 @@ func (_c *mockUDPIO_Hook_Call) RunAndReturn(run func([]byte, *string) error) *mo return _c } -// ReceiveMessage provides a mock function with given fields: +// ReceiveMessage provides a mock function with no fields func (_m *mockUDPIO) ReceiveMessage() (*protocol.UDPMessage, error) { ret := _m.Called() diff --git a/core/server/server.go b/core/server/server.go index 79c112d..e588372 100644 --- a/core/server/server.go +++ b/core/server/server.go @@ -55,6 +55,7 @@ func NewServer(config *Config) (Server, error) { MaxIncomingStreams: config.QUICConfig.MaxIncomingStreams, DisablePathMTUDiscovery: config.QUICConfig.DisablePathMTUDiscovery, EnableDatagrams: true, + MaxDatagramFrameSize: protocol.MaxDatagramFrameSize, DisablePathManager: true, } listener, err := quic.Listen(config.Conn, tlsConfig, quicConfig) @@ -89,7 +90,7 @@ func (s *serverImpl) Close() error { return err } -func (s *serverImpl) handleClient(conn quic.Connection) { +func (s *serverImpl) handleClient(conn *quic.Conn) { handler := newH3sHandler(s.config, conn) h3s := http3.Server{ Handler: handler, @@ -110,7 +111,7 @@ func (s *serverImpl) handleClient(conn quic.Connection) { type h3sHandler struct { config *Config - conn quic.Connection + conn *quic.Conn authenticated bool authMutex sync.Mutex @@ -120,7 +121,7 @@ type h3sHandler struct { udpSM *udpSessionManager // Only set after authentication } -func newH3sHandler(config *Config, conn quic.Connection) *h3sHandler { +func newH3sHandler(config *Config, conn *quic.Conn) *h3sHandler { return &h3sHandler{ config: config, conn: conn, @@ -204,24 +205,24 @@ func (h *h3sHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } } -func (h *h3sHandler) ProxyStreamHijacker(ft http3.FrameType, id quic.ConnectionTracingID, stream quic.Stream, err error) (bool, error) { +func (h *h3sHandler) ProxyStreamHijacker(ft http3.FrameType, id quic.ConnectionTracingID, stream *quic.Stream, err error) (bool, error) { if err != nil || !h.authenticated { return false, nil } // Wraps the stream with QStream, which handles Close() properly - stream = &utils.QStream{Stream: stream} + qStream := &utils.QStream{Stream: stream} switch ft { case protocol.FrameTypeTCPRequest: - go h.handleTCPRequest(stream) + go h.handleTCPRequest(qStream) return true, nil default: return false, nil } } -func (h *h3sHandler) handleTCPRequest(stream quic.Stream) { +func (h *h3sHandler) handleTCPRequest(stream *utils.QStream) { trafficLogger := h.config.TrafficLogger streamStats := &StreamStats{ AuthID: h.authID, @@ -321,7 +322,7 @@ func (h *h3sHandler) masqHandler(w http.ResponseWriter, r *http.Request) { // udpIOImpl is the IO implementation for udpSessionManager with TrafficLogger support type udpIOImpl struct { - Conn quic.Connection + Conn *quic.Conn AuthID string TrafficLogger TrafficLogger RequestHook RequestHook @@ -382,7 +383,7 @@ func (io *udpIOImpl) UDP(reqAddr string) (UDPConn, error) { } type udpEventLoggerImpl struct { - Conn quic.Connection + Conn *quic.Conn AuthID string EventLogger EventLogger } diff --git a/core/server/udp.go b/core/server/udp.go index 8ce79b4..360a8cf 100644 --- a/core/server/udp.go +++ b/core/server/udp.go @@ -192,7 +192,7 @@ func sendMessageAutoFrag(io udpIO, buf []byte, msg *protocol.UDPMessage) error { if errors.As(err, &errTooLarge) { // Message too large, try fragmentation msg.PacketID = uint16(rand.Intn(0xFFFF)) + 1 - fMsgs := frag.FragUDPMessage(msg, int(errTooLarge.MaxDataLen)) + fMsgs := frag.FragUDPMessage(msg, int(errTooLarge.MaxDatagramPayloadSize)) for _, fMsg := range fMsgs { err := io.SendMessage(buf, &fMsg) if err != nil { diff --git a/extras/go.mod b/extras/go.mod index d33bd59..00c1777 100644 --- a/extras/go.mod +++ b/extras/go.mod @@ -6,7 +6,7 @@ toolchain go1.24.2 require ( github.com/apernet/hysteria/core/v2 v2.0.0-00010101000000-000000000000 - github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 + github.com/apernet/quic-go v0.54.1-0.20250907230547-eb32f8aec5e2 github.com/database64128/tfo-go/v2 v2.2.2 github.com/hashicorp/golang-lru/v2 v2.0.5 github.com/miekg/dns v1.1.59 @@ -23,11 +23,8 @@ require ( github.com/cloudflare/circl v1.3.9 // indirect github.com/database64128/netx-go v0.0.0-20240905055117-62795b8b054a // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/klauspost/compress v1.17.9 // indirect github.com/kr/text v0.2.0 // indirect - github.com/onsi/ginkgo/v2 v2.9.5 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/quic-go/qpack v0.5.1 // indirect diff --git a/extras/go.sum b/extras/go.sum index 3daca00..ec0a1a3 100644 --- a/extras/go.sum +++ b/extras/go.sum @@ -1,10 +1,7 @@ github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 h1:9/jM7e+kVALd7Jfu1c27dcEpT/Fd/Gzq2OsQjKjakKI= -github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431/go.mod h1:I/47OIGG5H/IfAm+nz2c6hm6b/NkEhpvptAoiPcY7jQ= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/apernet/quic-go v0.54.1-0.20250907230547-eb32f8aec5e2 h1:03y2WeGln3/QmBzm+KGQ3yej7Uz+76CqHoisdzYzf30= +github.com/apernet/quic-go v0.54.1-0.20250907230547-eb32f8aec5e2/go.mod h1:Y4cCWi64O51TRUKDPy0ShA2/pevlWiWJJnlNo2fO2ds= github.com/cloudflare/circl v1.3.9 h1:QFrlgFYf2Qpi8bSpVPK1HBvWpx16v/1TZivyo7pGuBE= github.com/cloudflare/circl v1.3.9/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -12,22 +9,12 @@ github.com/database64128/netx-go v0.0.0-20240905055117-62795b8b054a h1:t4SDi0pmN github.com/database64128/netx-go v0.0.0-20240905055117-62795b8b054a/go.mod h1:7K2NQKbabB5mBl41vF6YayYl5g7YpDwc4dQ5iMpP3Lg= github.com/database64128/tfo-go/v2 v2.2.2 h1:BxynF4qGF5ct3DpPLEG62uyJZ3LQhqaf0Ken+kyy7PM= github.com/database64128/tfo-go/v2 v2.2.2/go.mod h1:2IW8jppdBwdVMjA08uEyMNnqiAHKUlqAA+J8NrsfktY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -37,10 +24,6 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/miekg/dns v1.1.51/go.mod h1:2Z9d3CP1LQWihRZUf29mQ19yDThaI4DAYzte2CaQW5c= github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= -github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= -github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -51,10 +34,8 @@ github.com/refraction-networking/utls v1.6.6 h1:igFsYBUJPYM8Rno9xUuDoM5GQrVEqY4l github.com/refraction-networking/utls v1.6.6/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/txthinking/runnergroup v0.0.0-20210608031112-152c7c4432bf h1:7PflaKRtU4np/epFxRXlFhlzLXZzKFrH5/I4so5Ove0= @@ -88,7 +69,6 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -117,6 +97,5 @@ google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHh gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/extras/outbounds/mock_PluggableOutbound.go b/extras/outbounds/mock_PluggableOutbound.go index 79b38e4..e754fa6 100644 --- a/extras/outbounds/mock_PluggableOutbound.go +++ b/extras/outbounds/mock_PluggableOutbound.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package outbounds diff --git a/extras/outbounds/mock_UDPConn.go b/extras/outbounds/mock_UDPConn.go index d450322..8aa250d 100644 --- a/extras/outbounds/mock_UDPConn.go +++ b/extras/outbounds/mock_UDPConn.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.0. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package outbounds @@ -17,7 +17,7 @@ func (_m *mockUDPConn) EXPECT() *mockUDPConn_Expecter { return &mockUDPConn_Expecter{mock: &_m.Mock} } -// Close provides a mock function with given fields: +// Close provides a mock function with no fields func (_m *mockUDPConn) Close() error { ret := _m.Called() diff --git a/extras/sniff/sniff.go b/extras/sniff/sniff.go index 9994b8a..e98dd22 100644 --- a/extras/sniff/sniff.go +++ b/extras/sniff/sniff.go @@ -9,7 +9,6 @@ import ( "strings" "time" - "github.com/apernet/quic-go" utls "github.com/refraction-networking/utls" "github.com/apernet/hysteria/core/v2/server" @@ -88,7 +87,7 @@ func (h *Sniffer) Check(isUDP bool, reqAddr string) bool { } } -func (h *Sniffer) TCP(stream quic.Stream, reqAddr *string) ([]byte, error) { +func (h *Sniffer) TCP(stream server.HyStream, reqAddr *string) ([]byte, error) { var err error if h.Timeout == 0 { err = stream.SetReadDeadline(time.Now().Add(sniffDefaultTimeout)) @@ -174,7 +173,7 @@ func (h *Sniffer) UDP(data []byte, reqAddr *string) error { } type teeReader struct { - Stream quic.Stream + Stream server.HyStream Pre []byte buf []byte diff --git a/extras/trafficlogger/http.go b/extras/trafficlogger/http.go index 8b26217..b6d9597 100644 --- a/extras/trafficlogger/http.go +++ b/extras/trafficlogger/http.go @@ -12,7 +12,6 @@ import ( "time" "github.com/apernet/hysteria/core/v2/server" - "github.com/apernet/quic-go" ) const ( @@ -31,7 +30,7 @@ func NewTrafficStatsServer(secret string) TrafficStatsServer { StatsMap: make(map[string]*trafficStatsEntry), KickMap: make(map[string]struct{}), OnlineMap: make(map[string]int), - StreamMap: make(map[quic.Stream]*server.StreamStats), + StreamMap: make(map[server.HyStream]*server.StreamStats), Secret: secret, } } @@ -40,7 +39,7 @@ type trafficStatsServerImpl struct { Mutex sync.RWMutex StatsMap map[string]*trafficStatsEntry OnlineMap map[string]int - StreamMap map[quic.Stream]*server.StreamStats + StreamMap map[server.HyStream]*server.StreamStats KickMap map[string]struct{} Secret string } @@ -86,14 +85,14 @@ func (s *trafficStatsServerImpl) LogOnlineState(id string, online bool) { } } -func (s *trafficStatsServerImpl) TraceStream(stream quic.Stream, stats *server.StreamStats) { +func (s *trafficStatsServerImpl) TraceStream(stream server.HyStream, stats *server.StreamStats) { s.Mutex.Lock() defer s.Mutex.Unlock() s.StreamMap[stream] = stats } -func (s *trafficStatsServerImpl) UntraceStream(stream quic.Stream) { +func (s *trafficStatsServerImpl) UntraceStream(stream server.HyStream) { s.Mutex.Lock() defer s.Mutex.Unlock() @@ -184,7 +183,7 @@ type dumpStreamEntry struct { lastActiveTime time.Time } -func (e *dumpStreamEntry) fromStreamStats(stream quic.Stream, s *server.StreamStats) { +func (e *dumpStreamEntry) fromStreamStats(stream server.HyStream, s *server.StreamStats) { e.State = s.State.Load().String() e.Auth = s.AuthID e.Connection = s.ConnID @@ -217,13 +216,13 @@ func (e *dumpStreamEntry) String() string { } txText := strconv.FormatUint(e.Tx, 10) rxText := strconv.FormatUint(e.Rx, 10) - lifetime := time.Now().Sub(e.initialTime) + lifetime := time.Since(e.initialTime) if lifetime < 10*time.Minute { lifetime = lifetime.Round(time.Millisecond) } else { lifetime = lifetime.Round(time.Second) } - lastActive := time.Now().Sub(e.lastActiveTime) + lastActive := time.Since(e.lastActiveTime) if lastActive < 10*time.Minute { lastActive = lastActive.Round(time.Millisecond) } else { diff --git a/go.work.sum b/go.work.sum index 95d2882..4efc210 100644 --- a/go.work.sum +++ b/go.work.sum @@ -94,6 +94,8 @@ github.com/golang/lint v0.0.0-20180702182130-06c8688daad7 h1:2hRPrmiwPrp3fQX967r github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= @@ -310,6 +312,7 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= @@ -368,6 +371,7 @@ google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3 google.golang.org/grpc v1.52.0 h1:kd48UiU7EHsV4rnLyOJRuP/Il/UHE7gdDAQ+SZI7nZk= google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= From 7d727cfeaa4c1f6da898cd3aba9e50b4263e2e59 Mon Sep 17 00:00:00 2001 From: tobyxdd Date: Sat, 13 Sep 2025 16:22:21 -0700 Subject: [PATCH 2/2] chore: update Go version to 1.25 in workflows and go.mod files --- .github/workflows/master.yml | 2 +- .github/workflows/release.yml | 2 +- app/go.mod | 2 +- core/go.mod | 2 +- extras/go.mod | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index e5689e7..a4f79cc 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -19,7 +19,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.24" + go-version: "1.25" - name: Setup Python # This is for the build script uses: actions/setup-python@v5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a966d86..2ada2d4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,7 +23,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.24" + go-version: "1.25" - name: Setup Python # This is for the build script uses: actions/setup-python@v5 diff --git a/app/go.mod b/app/go.mod index d7b9ec6..37106ea 100644 --- a/app/go.mod +++ b/app/go.mod @@ -2,7 +2,7 @@ module github.com/apernet/hysteria/app/v2 go 1.23 -toolchain go1.24.2 +toolchain go1.25.1 require ( github.com/apernet/go-tproxy v0.0.0-20230809025308-8f4723fd742f diff --git a/core/go.mod b/core/go.mod index 7126d9a..b3ccd85 100644 --- a/core/go.mod +++ b/core/go.mod @@ -2,7 +2,7 @@ module github.com/apernet/hysteria/core/v2 go 1.23 -toolchain go1.24.2 +toolchain go1.25.1 require ( github.com/apernet/quic-go v0.54.1-0.20250907230547-eb32f8aec5e2 diff --git a/extras/go.mod b/extras/go.mod index 00c1777..9d6165e 100644 --- a/extras/go.mod +++ b/extras/go.mod @@ -2,7 +2,7 @@ module github.com/apernet/hysteria/extras/v2 go 1.23 -toolchain go1.24.2 +toolchain go1.25.1 require ( github.com/apernet/hysteria/core/v2 v2.0.0-00010101000000-000000000000