Chore: Use buf.NewWithSize() (#5941)

This commit is contained in:
LjhAUMEM
2026-04-15 20:11:51 +08:00
committed by GitHub
parent 7c56b7beea
commit 5c3d639c09
5 changed files with 37 additions and 50 deletions
+3 -2
View File
@@ -244,11 +244,12 @@ type UDPReader struct {
func (r *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error) { func (r *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
if r.firstMsg != nil { if r.firstMsg != nil {
buffer := buf.New() buffer := buf.NewWithSize(int32(len(r.firstMsg.Data)))
buffer.Write(r.firstMsg.Data) buffer.Write(r.firstMsg.Data)
buffer.UDP = r.firstDest buffer.UDP = r.firstDest
r.firstMsg = nil r.firstMsg = nil
r.firstDest = nil
return buf.MultiBuffer{buffer}, nil return buf.MultiBuffer{buffer}, nil
} }
@@ -274,7 +275,7 @@ func (r *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
continue continue
} }
buffer := buf.New() buffer := buf.NewWithSize(int32(len(dfMsg.Data)))
buffer.Write(dfMsg.Data) buffer.Write(dfMsg.Data)
buffer.UDP = &dest buffer.UDP = &dest
+1 -2
View File
@@ -110,8 +110,7 @@ func (t *stackGVisor) Start() error {
srcIP := net.IPAddress(id.RemoteAddress.AsSlice()) srcIP := net.IPAddress(id.RemoteAddress.AsSlice())
dstIP := net.IPAddress(id.LocalAddress.AsSlice()) dstIP := net.IPAddress(id.LocalAddress.AsSlice())
if srcIP == nil || dstIP == nil { if srcIP == nil || dstIP == nil {
errors.LogDebug(context.Background(), "drop udp with size ", len(data), " > invalid ip address ", id.RemoteAddress.AsSlice(), " ", id.LocalAddress.AsSlice()) panic(id)
return true
} }
src := net.UDPDestination(srcIP, net.Port(id.RemotePort)) src := net.UDPDestination(srcIP, net.Port(id.RemotePort))
dst := net.UDPDestination(dstIP, net.Port(id.LocalPort)) dst := net.UDPDestination(dstIP, net.Port(id.LocalPort))
+10 -19
View File
@@ -74,7 +74,7 @@ func (u *udpConnectionHandler) HandlePacket(src net.Destination, dst net.Destina
dest: &dst, dest: &dst,
}: }:
default: default:
errors.LogDebug(context.Background(), "drop udp with size ", len(data), " to ", dst.NetAddr(), " original ", conn.dst.NetAddr(), " > queue full") errors.LogDebug(context.Background(), "drop udp with size ", len(data), " to ", dst.NetAddr(), " original ", conn.dst.NetAddr(), " > queue full 2")
} }
} }
@@ -98,25 +98,16 @@ type udpConn struct {
} }
func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) { func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) {
for { e, ok := <-c.egress
e, ok := <-c.egress if !ok {
if !ok { return nil, io.EOF
return nil, io.EOF
}
b := buf.New()
_, err := b.Write(e.data)
if err != nil {
errors.LogDebugInner(context.Background(), err, "drop udp with size ", len(e.data), " to ", e.dest.NetAddr(), " original ", c.dst.NetAddr())
b.Release()
continue
}
b.UDP = e.dest
return buf.MultiBuffer{b}, nil
} }
b := buf.NewWithSize(int32(len(e.data)))
b.Write(e.data)
b.UDP = e.dest
return buf.MultiBuffer{b}, nil
} }
// Read packets from the connection // Read packets from the connection
+11 -21
View File
@@ -192,8 +192,7 @@ func createGVisorTun(localAddresses []netip.Addr, mtu int, handler promiscuousMo
srcIP := net.IPAddress(id.RemoteAddress.AsSlice()) srcIP := net.IPAddress(id.RemoteAddress.AsSlice())
dstIP := net.IPAddress(id.LocalAddress.AsSlice()) dstIP := net.IPAddress(id.LocalAddress.AsSlice())
if srcIP == nil || dstIP == nil { if srcIP == nil || dstIP == nil {
errors.LogDebug(context.Background(), "drop udp with size ", len(data), " > invalid ip address ", id.RemoteAddress.AsSlice(), " ", id.LocalAddress.AsSlice()) panic(id)
return true
} }
src := net.UDPDestination(srcIP, net.Port(id.RemotePort)) src := net.UDPDestination(srcIP, net.Port(id.RemotePort))
dst := net.UDPDestination(dstIP, net.Port(id.LocalPort)) dst := net.UDPDestination(dstIP, net.Port(id.LocalPort))
@@ -256,7 +255,7 @@ func (m *udpManager) feed(src net.Destination, dst net.Destination, data []byte)
dest: &dst, dest: &dst,
}: }:
default: default:
errors.LogDebug(context.Background(), "drop udp with size ", len(data), " to ", dst.NetAddr(), " original ", uc.dst.NetAddr(), " > queue full") errors.LogDebug(context.Background(), "drop udp with size ", len(data), " to ", dst.NetAddr(), " original ", uc.dst.NetAddr(), " > queue full 2")
} }
} }
@@ -346,25 +345,16 @@ type udpConn struct {
} }
func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) { func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) {
for { q, ok := <-c.queue
q, ok := <-c.queue if !ok {
if !ok { return nil, io.EOF
return nil, io.EOF
}
b := buf.New()
_, err := b.Write(q.p)
if err != nil {
errors.LogDebugInner(context.Background(), err, "drop udp with size ", len(q.p), " to ", q.dest.NetAddr(), " original ", c.dst.NetAddr())
b.Release()
continue
}
b.UDP = q.dest
return buf.MultiBuffer{b}, nil
} }
b := buf.NewWithSize(int32(len(q.p)))
b.Write(q.p)
b.UDP = q.dest
return buf.MultiBuffer{b}, nil
} }
func (c *udpConn) Read(p []byte) (int, error) { func (c *udpConn) Read(p []byte) (int, error) {
+12 -6
View File
@@ -5,6 +5,7 @@ import (
"net" "net"
"sync" "sync"
xbuf "github.com/xtls/xray-core/common/buf"
"github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/errors"
) )
@@ -104,17 +105,22 @@ type headerSize interface {
} }
type headerManagerConn struct { type headerManagerConn struct {
sizes []int sync.Mutex
conns []net.PacketConn
net.PacketConn net.PacketConn
m sync.Mutex
sizes []int
conns []net.PacketConn
writeBuf [UDPSize]byte writeBuf [UDPSize]byte
} }
func (c *headerManagerConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { func (c *headerManagerConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
buf := p buf := p
if len(buf) < UDPSize { if len(buf) < UDPSize {
buf = make([]byte, UDPSize) b := xbuf.NewWithSize(UDPSize)
defer b.Release()
b.Resize(0, UDPSize)
buf = b.Bytes()
} }
n, addr, err = c.PacketConn.ReadFrom(buf) n, addr, err = c.PacketConn.ReadFrom(buf)
@@ -153,8 +159,8 @@ func (c *headerManagerConn) ReadFrom(p []byte) (n int, addr net.Addr, err error)
} }
func (c *headerManagerConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { func (c *headerManagerConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
c.m.Lock() c.Lock()
defer c.m.Unlock() defer c.Unlock()
sum := 0 sum := 0
for _, size := range c.sizes { for _, size := range c.sizes {