diff --git a/cmd/sing-box/cmd_tools_fetch_http3.go b/cmd/sing-box/cmd_tools_fetch_http3.go index 3caa1e88..f87450b5 100644 --- a/cmd/sing-box/cmd_tools_fetch_http3.go +++ b/cmd/sing-box/cmd_tools_fetch_http3.go @@ -10,7 +10,6 @@ import ( "github.com/sagernet/quic-go" "github.com/sagernet/quic-go/http3" box "github.com/sagernet/sing-box" - "github.com/sagernet/sing/common/bufio" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" ) @@ -28,7 +27,16 @@ func initializeHTTP3Client(instance *box.Box) error { if dErr != nil { return nil, dErr } - return quic.DialEarly(ctx, bufio.NewUnbindPacketConn(udpConn), udpConn.RemoteAddr(), tlsCfg, cfg) + quicConn, dErr := quic.DialEarlyConn(ctx, udpConn, tlsCfg, cfg) + if dErr != nil { + udpConn.Close() + return nil, dErr + } + go func() { + <-quicConn.Context().Done() + udpConn.Close() + }() + return quicConn, nil }, }, } diff --git a/common/httpclient/http3_transport.go b/common/httpclient/http3_transport.go index d3eb5bc1..7b94560c 100644 --- a/common/httpclient/http3_transport.go +++ b/common/httpclient/http3_transport.go @@ -14,7 +14,6 @@ import ( "github.com/sagernet/quic-go/http3" "github.com/sagernet/sing-box/common/tls" "github.com/sagernet/sing-box/option" - "github.com/sagernet/sing/common/bufio" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -86,11 +85,15 @@ func newHTTP3RoundTripper( if err != nil { return nil, err } - quicConn, err := quic.DialEarly(ctx, bufio.NewUnbindPacketConn(conn), conn.RemoteAddr(), tlsConfig, quicConfig) + quicConn, err := quic.DialEarlyConn(ctx, conn, tlsConfig, quicConfig) if err != nil { conn.Close() return nil, err } + go func() { + <-quicConn.Context().Done() + conn.Close() + }() return quicConn, nil }, } diff --git a/common/networkquality/http3.go b/common/networkquality/http3.go index 0e907821..61a109f2 100644 --- a/common/networkquality/http3.go +++ b/common/networkquality/http3.go @@ -10,6 +10,7 @@ import ( "github.com/sagernet/quic-go" "github.com/sagernet/quic-go/http3" + qtls "github.com/sagernet/sing-quic" sBufio "github.com/sagernet/sing/common/bufio" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -40,13 +41,17 @@ func NewHTTP3MeasurementClientFactory(dialer N.Dialer) (MeasurementClientFactory wrappedConn := udpConn if len(readCounters) > 0 || len(writeCounters) > 0 { wrappedConn = sBufio.NewCounterConn(udpConn, readCounters, writeCounters) + qtls.SetDesiredBufferSizes(udpConn) } - packetConn := sBufio.NewUnbindPacketConn(wrappedConn) - quicConn, dialErr := quic.DialEarly(ctx, packetConn, udpConn.RemoteAddr(), tlsCfg, cfg) + quicConn, dialErr := quic.DialEarlyConn(ctx, wrappedConn, tlsCfg, cfg) if dialErr != nil { udpConn.Close() return nil, dialErr } + go func() { + <-quicConn.Context().Done() + udpConn.Close() + }() return quicConn, nil }, } diff --git a/dns/transport/quic/http3.go b/dns/transport/quic/http3.go index 3a6c3fc1..ca7d49d0 100644 --- a/dns/transport/quic/http3.go +++ b/dns/transport/quic/http3.go @@ -22,7 +22,6 @@ import ( "github.com/sagernet/sing-box/option" "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/buf" - "github.com/sagernet/sing/common/bufio" E "github.com/sagernet/sing/common/exceptions" "github.com/sagernet/sing/common/logger" M "github.com/sagernet/sing/common/metadata" @@ -121,7 +120,7 @@ func (t *HTTP3Transport) newTransport() *http3.Transport { if dialErr != nil { return nil, dialErr } - quicConn, dialErr := quic.DialEarly(ctx, bufio.NewUnbindPacketConn(conn), conn.RemoteAddr(), tlsCfg, cfg) + quicConn, dialErr := quic.DialEarlyConn(ctx, conn, tlsCfg, cfg) if dialErr != nil { conn.Close() return nil, dialErr diff --git a/dns/transport/quic/quic.go b/dns/transport/quic/quic.go index dc2e22fc..0b641bb3 100644 --- a/dns/transport/quic/quic.go +++ b/dns/transport/quic/quic.go @@ -17,7 +17,6 @@ import ( "github.com/sagernet/sing-box/option" sQUIC "github.com/sagernet/sing-quic" "github.com/sagernet/sing/common" - "github.com/sagernet/sing/common/bufio" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -109,8 +108,7 @@ func (t *Transport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, } earlyConnection, err := sQUIC.DialEarly( ctx, - bufio.NewUnbindPacketConn(rawConn), - t.serverAddr.UDPAddr(), + rawConn, t.tlsConfig, nil, ) diff --git a/go.mod b/go.mod index 41cfb502..fdd4e3bb 100644 --- a/go.mod +++ b/go.mod @@ -43,13 +43,13 @@ require ( github.com/sagernet/gvisor v0.0.0-20260727.0-sing-box-mod.1 github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a github.com/sagernet/nftables v0.3.0-mod.4 - github.com/sagernet/quic-go v0.61.0-sing-box-mod.1 + github.com/sagernet/quic-go v0.61.0-sing-box-mod.1.0.20260806031718-a7bffd4a4f4b github.com/sagernet/sing v0.9.0-beta.3 github.com/sagernet/sing-cloudflared v0.1.3-0.20260706062323-d9787e794aa3 github.com/sagernet/sing-mux v0.3.5 github.com/sagernet/sing-openconnect v0.0.0-20260722140139-e0c977659ca2 github.com/sagernet/sing-openvpn v0.0.0-20260729104525-103eb5fe5eb6 - github.com/sagernet/sing-quic v0.6.4 + github.com/sagernet/sing-quic v0.6.5-0.20260806031751-735cc76896e2 github.com/sagernet/sing-shadowsocks v0.2.8 github.com/sagernet/sing-shadowsocks2 v0.2.1 github.com/sagernet/sing-shadowtls v0.2.1 diff --git a/go.sum b/go.sum index 66e4fc7e..25246763 100644 --- a/go.sum +++ b/go.sum @@ -314,8 +314,8 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/sagernet/nftables v0.3.0-mod.4 h1:vnOtcDYeSXv2e5RoRuGH0lrpttQFJ8iC4ICS2nhlDSo= github.com/sagernet/nftables v0.3.0-mod.4/go.mod h1:8kslHG4VvYNihcco+i6uxIX7qbT8A56T0y5q7U44ZaQ= -github.com/sagernet/quic-go v0.61.0-sing-box-mod.1 h1:ER31GLdh9u/06s1NmZ7zAL4hQK2bUlT4UInFdlikORE= -github.com/sagernet/quic-go v0.61.0-sing-box-mod.1/go.mod h1:hmLC8GJPp+BrpBgrgJnacvI4fZGIhasuy1ROJJ8GR4E= +github.com/sagernet/quic-go v0.61.0-sing-box-mod.1.0.20260806031718-a7bffd4a4f4b h1:MqirCxiM6A2RWKZIdmoMjtBdhp3q4z3GYdcEgmycO0o= +github.com/sagernet/quic-go v0.61.0-sing-box-mod.1.0.20260806031718-a7bffd4a4f4b/go.mod h1:hmLC8GJPp+BrpBgrgJnacvI4fZGIhasuy1ROJJ8GR4E= github.com/sagernet/sing v0.9.0-beta.3 h1:DH9B94S82daJyJHz2oeirLwa/zh03AJ3xiXLJrM95Fo= github.com/sagernet/sing v0.9.0-beta.3/go.mod h1:K3Owt3xPhHugvlnlPPxZJ/exXdaJfEPOTNorGk4AXjo= github.com/sagernet/sing-cloudflared v0.1.3-0.20260706062323-d9787e794aa3 h1:3y6++yIa8XlDhxPkpR4p+7RUHVY2KTP9CPIGnWmOlO8= @@ -326,8 +326,8 @@ github.com/sagernet/sing-openconnect v0.0.0-20260722140139-e0c977659ca2 h1:IOzb7 github.com/sagernet/sing-openconnect v0.0.0-20260722140139-e0c977659ca2/go.mod h1:4AKZLVcvY3r54UaK2Gbnm7aN8pOwdLz+y4EP0QFZ5Eg= github.com/sagernet/sing-openvpn v0.0.0-20260729104525-103eb5fe5eb6 h1:ZAvhkor0prJ8KEX9EmTEH+gJ1WlA3ffjS8GZT6KKq9c= github.com/sagernet/sing-openvpn v0.0.0-20260729104525-103eb5fe5eb6/go.mod h1:PWX7WygD8jpwfqfaGNySXpJYTn0SOwjBI1BKHHC2+Bw= -github.com/sagernet/sing-quic v0.6.4 h1:BmGPebxcVICOkyBkn8a+fAfAB41zU9i83SMzObiu9bo= -github.com/sagernet/sing-quic v0.6.4/go.mod h1:+1lz5Rdw0+kAxRoJ9FW5RIott5OOAlS3QXKkwN6hR64= +github.com/sagernet/sing-quic v0.6.5-0.20260806031751-735cc76896e2 h1:TFSDcPU6iHPuC+PhHgDyPunC2m0pqo0VQzWXpOQuCCk= +github.com/sagernet/sing-quic v0.6.5-0.20260806031751-735cc76896e2/go.mod h1:Zg65Tkn/cHzVG/s0vDUcf3HTEQsRBtVVji9DWWNgF60= github.com/sagernet/sing-shadowsocks v0.2.8 h1:PURj5PRoAkqeHh2ZW205RWzN9E9RtKCVCzByXruQWfE= github.com/sagernet/sing-shadowsocks v0.2.8/go.mod h1:lo7TWEMDcN5/h5B8S0ew+r78ZODn6SwVaFhvB6H+PTI= github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnqqs2gQ2/Qioo= diff --git a/transport/v2rayquic/client.go b/transport/v2rayquic/client.go index c4e0b102..4e70e818 100644 --- a/transport/v2rayquic/client.go +++ b/transport/v2rayquic/client.go @@ -15,7 +15,6 @@ import ( "github.com/sagernet/sing-box/option" "github.com/sagernet/sing-quic" "github.com/sagernet/sing/common" - "github.com/sagernet/sing/common/bufio" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" ) @@ -72,17 +71,16 @@ func (c *Client) offerNew() (*quic.Conn, error) { if err != nil { return nil, err } - packetConn := bufio.NewUnbindPacketConn(udpConn) - quicConn, err := qtls.Dial(c.ctx, packetConn, udpConn.RemoteAddr(), c.tlsConfig, c.quicConfig) + quicConn, err := qtls.Dial(c.ctx, udpConn, c.tlsConfig, c.quicConfig) if err != nil { - packetConn.Close() + udpConn.Close() return nil, err } - // quic-go does not take ownership of the packet conn passed to Dial: + // quic-go does not take ownership of the conn passed to Dial: // when the connection ends it only stops reading. go func() { <-quicConn.Context().Done() - packetConn.Close() + udpConn.Close() }() c.conn.Store(quicConn) c.rawConn = udpConn