From d6c5293c78ed7a3d331c80d803c759f5729ed3b5 Mon Sep 17 00:00:00 2001 From: Fangliding Date: Mon, 28 Sep 2026 12:51:16 +0800 Subject: [PATCH] Move PacketConnWrapper to common/net --- common/net/packet.go | 20 +++++++++++++++++ proxy/freedom/freedom.go | 8 +++---- proxy/masque/client.go | 2 +- proxy/wireguard/client.go | 7 +++--- proxy/wireguard/netstack.go | 4 ++-- proxy/wireguard/tun_linux.go | 4 ++-- transport/internet/finalmask/finalmask.go | 24 ++++----------------- transport/internet/finalmask/udp_test.go | 2 +- transport/internet/finalmask/udphop/conn.go | 4 ++-- transport/internet/hysteria/dialer.go | 4 ++-- transport/internet/masque/dialer.go | 5 ++--- transport/internet/memory_settings.go | 2 +- transport/internet/splithttp/dialer.go | 5 ++--- transport/internet/system_dialer.go | 20 +---------------- 14 files changed, 47 insertions(+), 64 deletions(-) create mode 100644 common/net/packet.go diff --git a/common/net/packet.go b/common/net/packet.go new file mode 100644 index 000000000..10fbaa6e9 --- /dev/null +++ b/common/net/packet.go @@ -0,0 +1,20 @@ +package net + +// PacketConnWrapper wraps a PacketConn into a Conn with a fixed destination address. +type PacketConnWrapper struct { + PacketConn + Dest Addr +} + +func (c *PacketConnWrapper) Read(p []byte) (int, error) { + n, _, err := c.PacketConn.ReadFrom(p) + return n, err +} + +func (c *PacketConnWrapper) Write(p []byte) (int, error) { + return c.PacketConn.WriteTo(p, c.Dest) +} + +func (c *PacketConnWrapper) RemoteAddr() Addr { + return c.Dest +} diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index 47a33b560..59973594a 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -467,7 +467,7 @@ func NewPacketReader(conn net.Conn, h *Handler, defaultRule *FinalRule, UDPOverr if statConn != nil { counter = statConn.ReadCounter } - if c, ok := iConn.(*internet.PacketConnWrapper); ok { + if c, ok := iConn.(*net.PacketConnWrapper); ok { isOverridden := false if UDPOverride.Address != nil || UDPOverride.Port != 0 { isOverridden = true @@ -487,7 +487,7 @@ func NewPacketReader(conn net.Conn, h *Handler, defaultRule *FinalRule, UDPOverr } type PacketReader struct { - *internet.PacketConnWrapper + *net.PacketConnWrapper stats.Counter Handler *Handler DefaultRule *FinalRule @@ -542,7 +542,7 @@ func NewPacketWriter(conn net.Conn, h *Handler, defaultRule *FinalRule, UDPOverr if statConn != nil { counter = statConn.WriteCounter } - if c, ok := iConn.(*internet.PacketConnWrapper); ok { + if c, ok := iConn.(*net.PacketConnWrapper); ok { // If DialDest is a domain, it will be resolved in dialer // check this behavior and add it to map resolvedUDPAddr := utils.NewTypedSyncMap[string, net.Address]() @@ -563,7 +563,7 @@ func NewPacketWriter(conn net.Conn, h *Handler, defaultRule *FinalRule, UDPOverr } type PacketWriter struct { - *internet.PacketConnWrapper + *net.PacketConnWrapper stats.Counter *Handler DefaultRule *FinalRule diff --git a/proxy/masque/client.go b/proxy/masque/client.go index 9700943f7..161542f6b 100644 --- a/proxy/masque/client.go +++ b/proxy/masque/client.go @@ -151,7 +151,7 @@ func (c *Client) Process(ctx context.Context, link *transport.Link, dialer inter } defer conn.Close() uc := &wireguard.UDPConnClient{ - PacketConn: conn.(*internet.PacketConnWrapper).PacketConn, + PacketConn: conn.(*net.PacketConnWrapper).PacketConn, Dest: conn.RemoteAddr().(*net.UDPAddr), } reader = uc diff --git a/proxy/wireguard/client.go b/proxy/wireguard/client.go index 9cfff7265..2ec9d5b58 100644 --- a/proxy/wireguard/client.go +++ b/proxy/wireguard/client.go @@ -27,7 +27,6 @@ import ( "github.com/xtls/xray-core/features/stats" "github.com/xtls/xray-core/transport" "github.com/xtls/xray-core/transport/internet" - "github.com/xtls/xray-core/transport/internet/finalmask" "golang.zx2c4.com/wireguard/device" ) @@ -200,7 +199,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte } defer conn.Close() c := &UDPConnClient{ - PacketConn: conn.(*internet.PacketConnWrapper).PacketConn, + PacketConn: conn.(*net.PacketConnWrapper).PacketConn, Dest: conn.RemoteAddr().(*net.UDPAddr), } reader = c @@ -264,14 +263,14 @@ func (h *Handler) init(ctx context.Context) error { if err != nil { return nil, errors.New("failed to dial to dest").Base(err) } - pktConn = conn.(*finalmask.PacketConnWrapper).PacketConn + pktConn = conn.(*net.PacketConnWrapper).PacketConn } else { conn, err := internet.DialSystem(ctx, dest, h.streamSettings.SocketSettings) if err != nil { return nil, errors.New("failed to dial to dest").Base(err) } switch c := conn.(type) { - case *internet.PacketConnWrapper: + case *net.PacketConnWrapper: pktConn = c.PacketConn case *cnc.Connection: pktConn = &internet.FakePacketConn{Conn: c} diff --git a/proxy/wireguard/netstack.go b/proxy/wireguard/netstack.go index b54961c56..cc04f1580 100644 --- a/proxy/wireguard/netstack.go +++ b/proxy/wireguard/netstack.go @@ -21,7 +21,7 @@ import ( "syscall" "time" - "github.com/xtls/xray-core/transport/internet" + xnet "github.com/xtls/xray-core/common/net" "golang.zx2c4.com/wireguard/tun" "golang.org/x/net/dns/dnsmessage" @@ -220,7 +220,7 @@ func (tun *netTun) DialUDPAddrPort(laddr, raddr netip.AddrPort) (net.Conn, error if err != nil { return nil, err } - return &internet.PacketConnWrapper{ + return &xnet.PacketConnWrapper{ PacketConn: conn, Dest: net.UDPAddrFromAddrPort(raddr), }, nil diff --git a/proxy/wireguard/tun_linux.go b/proxy/wireguard/tun_linux.go index eb0175476..08a7e4dd5 100644 --- a/proxy/wireguard/tun_linux.go +++ b/proxy/wireguard/tun_linux.go @@ -16,7 +16,7 @@ import ( "github.com/vishvananda/netlink" "github.com/xtls/xray-core/common/errors" - "github.com/xtls/xray-core/transport/internet" + xnet "github.com/xtls/xray-core/common/net" "golang.zx2c4.com/wireguard/tun" ) @@ -263,7 +263,7 @@ func (tun *kernelTun) DialUDPAddrPort(laddr, raddr netip.AddrPort) (net.Conn, er if err != nil { return nil, err } - return &internet.PacketConnWrapper{ + return &xnet.PacketConnWrapper{ PacketConn: conn, Dest: net.UDPAddrFromAddrPort(raddr), }, nil diff --git a/transport/internet/finalmask/finalmask.go b/transport/internet/finalmask/finalmask.go index 179f958f0..618e9292c 100644 --- a/transport/internet/finalmask/finalmask.go +++ b/transport/internet/finalmask/finalmask.go @@ -81,7 +81,7 @@ func (fm *FinalMask) DialTCP(ctx context.Context, dest net.Destination) (net.Con if err != nil { return nil, err } - return &PacketConnWrapper{PacketConn: conn, udpAddr: addr}, err + return &net.PacketConnWrapper{PacketConn: conn, Dest: addr}, err }, } for i := range fm.tcpMasks { @@ -143,7 +143,7 @@ func (fm *FinalMask) DialUDP(ctx context.Context, dest net.Destination) (net.Con if err != nil { return nil, err } - return &PacketConnWrapper{PacketConn: conn, udpAddr: addr}, nil + return &net.PacketConnWrapper{PacketConn: conn, Dest: addr}, nil } for i := range fm.udpMasks { if i > 0 { @@ -170,7 +170,7 @@ func (fm *FinalMask) DialUDP(ctx context.Context, dest net.Destination) (net.Con if err != nil { return nil, err } - return &PacketConnWrapper{PacketConn: conn, udpAddr: addr}, err + return &net.PacketConnWrapper{PacketConn: conn, Dest: addr}, err }, } var sizes []int @@ -207,7 +207,7 @@ func (fm *FinalMask) DialUDP(ctx context.Context, dest net.Destination) (net.Con if addr == nil { addr = &net.UDPAddr{IP: []byte{0, 0, 0, 0}} } - return &PacketConnWrapper{PacketConn: conn, udpAddr: addr}, nil + return &net.PacketConnWrapper{PacketConn: conn, Dest: addr}, nil } func (fm *FinalMask) ListenPacket(ctx context.Context, addr net.Addr) (net.PacketConn, error) { @@ -271,23 +271,7 @@ const ( UDPSize = 4096 ) -type PacketConnWrapper struct { - net.PacketConn - udpAddr net.Addr -} -func (c *PacketConnWrapper) RemoteAddr() net.Addr { - return c.udpAddr -} - -func (c *PacketConnWrapper) Read(b []byte) (n int, err error) { - n, _, err = c.PacketConn.ReadFrom(b) - return -} - -func (c *PacketConnWrapper) Write(b []byte) (n int, err error) { - return c.PacketConn.WriteTo(b, c.udpAddr) -} type headerManagerConn struct { net.PacketConn diff --git a/transport/internet/finalmask/udp_test.go b/transport/internet/finalmask/udp_test.go index 7d5ae5e39..00751da42 100644 --- a/transport/internet/finalmask/udp_test.go +++ b/transport/internet/finalmask/udp_test.go @@ -380,7 +380,7 @@ func TestPacketConnReadWrite(t *testing.T) { t.Fatal(err) } t.Cleanup(func() { clientConn.Close() }) - client := clientConn.(*finalmask.PacketConnWrapper).PacketConn + client := clientConn.(*net.PacketConnWrapper).PacketConn _ = client.SetDeadline(time.Now().Add(time.Second)) _ = server.SetDeadline(time.Now().Add(time.Second)) diff --git a/transport/internet/finalmask/udphop/conn.go b/transport/internet/finalmask/udphop/conn.go index a71a40439..a2139a2d4 100644 --- a/transport/internet/finalmask/udphop/conn.go +++ b/transport/internet/finalmask/udphop/conn.go @@ -73,7 +73,7 @@ func NewUDPHopConn(c *Config, dest *net.Destination, dialer *finalmask.Dialer) ( if err != nil { return nil, err } - cur := conn.(*finalmask.PacketConnWrapper).PacketConn + cur := conn.(*net.PacketConnWrapper).PacketConn addr := conn.RemoteAddr().(*net.UDPAddr) client := &udpHopConn{ dialer: dialer, @@ -150,7 +150,7 @@ func (c *udpHopConn) hop() { _ = c.pre.Close() } c.pre = c.cur - c.cur = conn.(*finalmask.PacketConnWrapper).PacketConn + c.cur = conn.(*net.PacketConnWrapper).PacketConn c.wg.Add(1) go c.recv(c.cur) } diff --git a/transport/internet/hysteria/dialer.go b/transport/internet/hysteria/dialer.go index f37cdd11c..4b774c353 100644 --- a/transport/internet/hysteria/dialer.go +++ b/transport/internet/hysteria/dialer.go @@ -119,7 +119,7 @@ func (c *client) dial(ctx context.Context) error { if err != nil { return errors.New("failed to dial to dest").Base(err) } - pktConn = conn.(*finalmask.PacketConnWrapper).PacketConn + pktConn = conn.(*net.PacketConnWrapper).PacketConn udpAddr = conn.RemoteAddr() } else { conn, err := internet.DialSystem(ctx, c.dest, c.socketConfig) @@ -127,7 +127,7 @@ func (c *client) dial(ctx context.Context) error { return errors.New("failed to dial to dest").Base(err) } switch c := conn.(type) { - case *internet.PacketConnWrapper: + case *net.PacketConnWrapper: pktConn = c.PacketConn udpAddr = c.RemoteAddr() case *cnc.Connection: diff --git a/transport/internet/masque/dialer.go b/transport/internet/masque/dialer.go index aff454308..b59acd578 100644 --- a/transport/internet/masque/dialer.go +++ b/transport/internet/masque/dialer.go @@ -19,7 +19,6 @@ import ( "github.com/xtls/xray-core/common/net/cnc" "github.com/xtls/xray-core/common/utils" "github.com/xtls/xray-core/transport/internet" - "github.com/xtls/xray-core/transport/internet/finalmask" "github.com/xtls/xray-core/transport/internet/hysteria/congestion" "github.com/xtls/xray-core/transport/internet/hysteria/congestion/bbr" "github.com/xtls/xray-core/transport/internet/masque/connectip" @@ -80,7 +79,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me if err != nil { return nil, errors.New("failed to dial to dest").Base(err) } - pktConn = conn.(*finalmask.PacketConnWrapper).PacketConn + pktConn = conn.(*net.PacketConnWrapper).PacketConn udpAddr = conn.RemoteAddr() } else { conn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings) @@ -88,7 +87,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me return nil, errors.New("failed to dial to dest").Base(err) } switch c := conn.(type) { - case *internet.PacketConnWrapper: + case *net.PacketConnWrapper: pktConn = c.PacketConn udpAddr = c.RemoteAddr() case *cnc.Connection: diff --git a/transport/internet/memory_settings.go b/transport/internet/memory_settings.go index 770cf82cc..fb72b6700 100644 --- a/transport/internet/memory_settings.go +++ b/transport/internet/memory_settings.go @@ -83,7 +83,7 @@ func ToMemoryStreamConfig(s *StreamConfig) (*MemoryStreamConfig, error) { var newConn net.PacketConn var udpAddr net.Addr switch c := conn.(type) { - case *PacketConnWrapper: + case *net.PacketConnWrapper: newConn = c.PacketConn udpAddr = conn.RemoteAddr() case *cnc.Connection: diff --git a/transport/internet/splithttp/dialer.go b/transport/internet/splithttp/dialer.go index e896516ed..b52f5a71d 100644 --- a/transport/internet/splithttp/dialer.go +++ b/transport/internet/splithttp/dialer.go @@ -25,7 +25,6 @@ import ( "github.com/xtls/xray-core/common/signal/done" "github.com/xtls/xray-core/transport/internet" "github.com/xtls/xray-core/transport/internet/browser_dialer" - "github.com/xtls/xray-core/transport/internet/finalmask" "github.com/xtls/xray-core/transport/internet/hysteria/congestion" "github.com/xtls/xray-core/transport/internet/hysteria/congestion/bbr" "github.com/xtls/xray-core/transport/internet/reality" @@ -200,7 +199,7 @@ func createHTTPClient(dest net.Destination, streamSettings *internet.MemoryStrea if err != nil { return nil, errors.New("failed to dial to dest").Base(err) } - pktConn = conn.(*finalmask.PacketConnWrapper).PacketConn + pktConn = conn.(*net.PacketConnWrapper).PacketConn udpAddr = conn.RemoteAddr() } else { conn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings) @@ -208,7 +207,7 @@ func createHTTPClient(dest net.Destination, streamSettings *internet.MemoryStrea return nil, errors.New("failed to dial to dest").Base(err) } switch c := conn.(type) { - case *internet.PacketConnWrapper: + case *net.PacketConnWrapper: pktConn = c.PacketConn udpAddr = c.RemoteAddr() case *cnc.Connection: diff --git a/transport/internet/system_dialer.go b/transport/internet/system_dialer.go index 2ff7693de..bfe3fb592 100644 --- a/transport/internet/system_dialer.go +++ b/transport/internet/system_dialer.go @@ -86,7 +86,7 @@ func (d *DefaultSystemDialer) Dial(ctx context.Context, src net.Address, dest ne if err != nil { return nil, err } - return &PacketConnWrapper{ + return &net.PacketConnWrapper{ PacketConn: packetConn, Dest: destAddr, }, nil @@ -148,24 +148,6 @@ func (d *DefaultSystemDialer) DestIpAddress() net.IP { return nil } -type PacketConnWrapper struct { - net.PacketConn - Dest net.Addr -} - -func (c *PacketConnWrapper) Read(p []byte) (int, error) { - n, _, err := c.PacketConn.ReadFrom(p) - return n, err -} - -func (c *PacketConnWrapper) Write(p []byte) (int, error) { - return c.PacketConn.WriteTo(p, c.Dest) -} - -func (c *PacketConnWrapper) RemoteAddr() net.Addr { - return c.Dest -} - type SystemDialerAdapter interface { Dial(network string, address string) (net.Conn, error) }