diff --git a/connector/ss/udp/connector.go b/connector/ss/udp/connector.go index f89531a6..ae98b999 100644 --- a/connector/ss/udp/connector.go +++ b/connector/ss/udp/connector.go @@ -85,7 +85,7 @@ func (c *ssuConnector) Connect(ctx context.Context, conn net.Conn, network, addr } // standard UDP relay - return ss.UDPClientConn(pc, conn.RemoteAddr(), taddr, c.md.bufferSize), nil + return ss.UDPClientConn(pc, conn.RemoteAddr(), taddr), nil } if c.cipher != nil { diff --git a/connector/ss/udp/metadata.go b/connector/ss/udp/metadata.go index 16378875..5227b1a5 100644 --- a/connector/ss/udp/metadata.go +++ b/connector/ss/udp/metadata.go @@ -1,7 +1,6 @@ package ss import ( - "math" "time" mdata "github.com/go-gost/core/metadata" @@ -11,24 +10,16 @@ import ( type metadata struct { key string connectTimeout time.Duration - bufferSize int } func (c *ssuConnector) parseMetadata(md mdata.Metadata) (err error) { const ( key = "key" connectTimeout = "timeout" - bufferSize = "bufferSize" // udp buffer size ) c.md.key = mdutil.GetString(md, key) c.md.connectTimeout = mdutil.GetDuration(md, connectTimeout) - if bs := mdutil.GetInt(md, bufferSize); bs > 0 { - c.md.bufferSize = int(math.Min(math.Max(float64(bs), 512), 64*1024)) - } else { - c.md.bufferSize = 4096 - } - return } diff --git a/handler/http/handler.go b/handler/http/handler.go index 89b0b98e..4a9dd461 100644 --- a/handler/http/handler.go +++ b/handler/http/handler.go @@ -288,9 +288,6 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt return errors.New("authentication failed") } - if resp.Header == nil { - resp.Header = http.Header{} - } if resp.Header.Get("Proxy-Agent") == "" { resp.Header.Set("Proxy-Agent", h.md.proxyAgent) } diff --git a/handler/ss/udp/handler.go b/handler/ss/udp/handler.go index 7395d570..f00693b0 100644 --- a/handler/ss/udp/handler.go +++ b/handler/ss/udp/handler.go @@ -7,7 +7,6 @@ import ( "net" "time" - "github.com/go-gost/core/common/bufpool" "github.com/go-gost/core/handler" "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" @@ -111,7 +110,7 @@ func (h *ssuHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler. pc = h.cipher.PacketConn(pc) } // standard UDP relay. - pc = ss.UDPServerConn(pc, conn.RemoteAddr(), h.md.bufferSize) + pc = ss.UDPServerConn(pc, conn.RemoteAddr()) } else { if h.cipher != nil { conn = ss.ShadowConn(h.cipher.StreamConn(conn), nil) @@ -147,16 +146,13 @@ func (h *ssuHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler. } func (h *ssuHandler) relayPacket(ctx context.Context, pc1, pc2 net.PacketConn, ro *xrecorder.HandlerRecorderObject, log logger.Logger) (err error) { - bufSize := h.md.bufferSize errc := make(chan error, 2) go func() { + var b [MaxMessageSize]byte for { err := func() error { - b := bufpool.Get(bufSize) - defer bufpool.Put(b) - - n, addr, err := pc1.ReadFrom(b) + n, addr, err := pc1.ReadFrom(b[:]) if err != nil { return err } @@ -187,12 +183,10 @@ func (h *ssuHandler) relayPacket(ctx context.Context, pc1, pc2 net.PacketConn, r }() go func() { + var b [MaxMessageSize]byte for { err := func() error { - b := bufpool.Get(bufSize) - defer bufpool.Put(b) - - n, raddr, err := pc2.ReadFrom(b) + n, raddr, err := pc2.ReadFrom(b[:]) if err != nil { return err } diff --git a/handler/ss/udp/metadata.go b/handler/ss/udp/metadata.go index 76408bd3..33145e84 100644 --- a/handler/ss/udp/metadata.go +++ b/handler/ss/udp/metadata.go @@ -8,26 +8,23 @@ import ( mdutil "github.com/go-gost/x/metadata/util" ) +const ( + MaxMessageSize = math.MaxUint16 +) + type metadata struct { key string readTimeout time.Duration - bufferSize int } func (h *ssuHandler) parseMetadata(md mdata.Metadata) (err error) { const ( key = "key" readTimeout = "readTimeout" - bufferSize = "bufferSize" ) h.md.key = mdutil.GetString(md, key) h.md.readTimeout = mdutil.GetDuration(md, readTimeout) - if bs := mdutil.GetInt(md, bufferSize); bs > 0 { - h.md.bufferSize = int(math.Min(math.Max(float64(bs), 512), 64*1024)) - } else { - h.md.bufferSize = 4096 - } return } diff --git a/handler/tap/handler.go b/handler/tap/handler.go index e1ab956e..79785732 100644 --- a/handler/tap/handler.go +++ b/handler/tap/handler.go @@ -11,17 +11,16 @@ import ( "time" "github.com/go-gost/core/chain" - "github.com/go-gost/core/common/bufpool" "github.com/go-gost/core/handler" "github.com/go-gost/core/hop" "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" + ctxvalue "github.com/go-gost/x/ctx" "github.com/go-gost/x/internal/util/ss" tap_util "github.com/go-gost/x/internal/util/tap" "github.com/go-gost/x/registry" "github.com/shadowsocks/go-shadowsocks2/core" "github.com/shadowsocks/go-shadowsocks2/shadowaead" - ctxvalue "github.com/go-gost/x/ctx" "github.com/songgao/water/waterutil" ) @@ -187,12 +186,10 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr errc := make(chan error, 1) go func() { + var b [MaxMessageSize]byte for { err := func() error { - b := bufpool.Get(h.md.bufferSize) - defer bufpool.Put(b) - - n, err := tap.Read(b) + n, err := tap.Read(b[:]) if err != nil { select { case h.exit <- struct{}{}: @@ -249,12 +246,10 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr }() go func() { + var b [MaxMessageSize]byte for { err := func() error { - b := bufpool.Get(h.md.bufferSize) - defer bufpool.Put(b) - - n, addr, err := conn.ReadFrom(b) + n, addr, err := conn.ReadFrom(b[:]) if err != nil && err != shadowaead.ErrShortPacket { return err diff --git a/handler/tap/metadata.go b/handler/tap/metadata.go index 11125fba..262d4e19 100644 --- a/handler/tap/metadata.go +++ b/handler/tap/metadata.go @@ -1,25 +1,25 @@ package tap import ( + "math" + mdata "github.com/go-gost/core/metadata" mdutil "github.com/go-gost/x/metadata/util" ) +const ( + MaxMessageSize = math.MaxUint16 +) + type metadata struct { - key string - bufferSize int + key string } func (h *tapHandler) parseMetadata(md mdata.Metadata) (err error) { const ( - key = "key" - bufferSize = "bufferSize" + key = "key" ) h.md.key = mdutil.GetString(md, key) - h.md.bufferSize = mdutil.GetInt(md, bufferSize) - if h.md.bufferSize <= 0 { - h.md.bufferSize = 4096 - } return } diff --git a/handler/tun/client.go b/handler/tun/client.go index af281584..7b8250fa 100644 --- a/handler/tun/client.go +++ b/handler/tun/client.go @@ -103,12 +103,10 @@ func (h *tunHandler) transportClient(ctx context.Context, tun io.ReadWriter, con errc := make(chan error, 2) go func() { + var b [MaxMessageSize]byte for { err := func() error { - b := bufpool.Get(h.md.bufferSize) - defer bufpool.Put(b) - - n, err := tun.Read(b) + n, err := tun.Read(b[:]) if err != nil { return fmt.Errorf("%w: read: %s", ErrTun, err.Error()) } @@ -155,12 +153,10 @@ func (h *tunHandler) transportClient(ctx context.Context, tun io.ReadWriter, con }() go func() { + var b [MaxMessageSize]byte for { err := func() error { - b := bufpool.Get(h.md.bufferSize) - defer bufpool.Put(b) - - n, err := conn.Read(b) + n, err := conn.Read(b[:]) if err != nil { return err } @@ -175,7 +171,7 @@ func (h *tunHandler) transportClient(ctx context.Context, tun io.ReadWriter, con return nil } - if waterutil.IsIPv4(b) { + if waterutil.IsIPv4(b[:n]) { header, err := ipv4.ParseHeader(b[:n]) if err != nil { log.Warn(err) diff --git a/handler/tun/metadata.go b/handler/tun/metadata.go index 926ae165..06186ff4 100644 --- a/handler/tun/metadata.go +++ b/handler/tun/metadata.go @@ -1,6 +1,7 @@ package tun import ( + "math" "time" mdata "github.com/go-gost/core/metadata" @@ -9,22 +10,16 @@ import ( const ( defaultKeepAlivePeriod = 10 * time.Second - defaultBufferSize = 4096 + MaxMessageSize = math.MaxUint16 ) type metadata struct { - bufferSize int keepAlivePeriod time.Duration passphrase string p2p bool } func (h *tunHandler) parseMetadata(md mdata.Metadata) (err error) { - h.md.bufferSize = mdutil.GetInt(md, "tun.bufsize", "bufsize", "buffersize") - if h.md.bufferSize <= 0 { - h.md.bufferSize = defaultBufferSize - } - if mdutil.GetBool(md, "tun.keepalive", "keepalive") { h.md.keepAlivePeriod = mdutil.GetDuration(md, "tun.ttl", "ttl") if h.md.keepAlivePeriod <= 0 { diff --git a/handler/tun/server.go b/handler/tun/server.go index 9c23cc3e..659718d9 100644 --- a/handler/tun/server.go +++ b/handler/tun/server.go @@ -8,7 +8,6 @@ import ( "net/netip" "time" - "github.com/go-gost/core/common/bufpool" "github.com/go-gost/core/logger" "github.com/go-gost/core/router" xip "github.com/go-gost/x/internal/net/ip" @@ -42,12 +41,10 @@ func (h *tunHandler) transportServer(ctx context.Context, tun io.ReadWriter, con errc := make(chan error, 1) go func() { + var b [MaxMessageSize]byte for { err := func() error { - b := bufpool.Get(h.md.bufferSize) - defer bufpool.Put(b) - - n, err := tun.Read(b) + n, err := tun.Read(b[:]) if err != nil { return ErrTun } @@ -110,12 +107,10 @@ func (h *tunHandler) transportServer(ctx context.Context, tun io.ReadWriter, con }() go func() { + var b [MaxMessageSize]byte for { err := func() error { - b := bufpool.Get(h.md.bufferSize) - defer bufpool.Put(b) - - n, addr, err := conn.ReadFrom(b) + n, addr, err := conn.ReadFrom(b[:]) if err != nil { return err } diff --git a/internal/net/udp/relay.go b/internal/net/udp/relay.go index 1694ba36..c14124ab 100644 --- a/internal/net/udp/relay.go +++ b/internal/net/udp/relay.go @@ -2,20 +2,23 @@ package udp import ( "context" + "math" "net" "github.com/go-gost/core/bypass" - "github.com/go-gost/core/common/bufpool" "github.com/go-gost/core/logger" ) +const ( + MaxMessageSize = math.MaxUint16 +) + type Relay struct { pc1 net.PacketConn pc2 net.PacketConn - bypass bypass.Bypass - bufferSize int - logger logger.Logger + bypass bypass.Bypass + logger logger.Logger } func NewRelay(pc1, pc2 net.PacketConn) *Relay { @@ -35,25 +38,14 @@ func (r *Relay) WithLogger(logger logger.Logger) *Relay { return r } -func (r *Relay) SetBufferSize(n int) { - r.bufferSize = n -} - func (r *Relay) Run(ctx context.Context) (err error) { - bufSize := r.bufferSize - if bufSize <= 0 { - bufSize = 4096 - } - errc := make(chan error, 2) go func() { + var b [MaxMessageSize]byte for { err := func() error { - b := bufpool.Get(bufSize) - defer bufpool.Put(b) - - n, raddr, err := r.pc1.ReadFrom(b) + n, raddr, err := r.pc1.ReadFrom(b[:]) if err != nil { return err } @@ -86,12 +78,10 @@ func (r *Relay) Run(ctx context.Context) (err error) { }() go func() { + var b [MaxMessageSize]byte for { err := func() error { - b := bufpool.Get(bufSize) - defer bufpool.Put(b) - - n, raddr, err := r.pc2.ReadFrom(b) + n, raddr, err := r.pc2.ReadFrom(b[:]) if err != nil { return err } diff --git a/internal/util/socks/conn.go b/internal/util/socks/conn.go index 205b5859..49a91702 100644 --- a/internal/util/socks/conn.go +++ b/internal/util/socks/conn.go @@ -2,9 +2,9 @@ package socks import ( "bytes" + "math" "net" - "github.com/go-gost/core/common/bufpool" "github.com/go-gost/gosocks5" ) @@ -85,21 +85,19 @@ func (c *udpTunConn) Write(b []byte) (n int, err error) { return c.WriteTo(b, c.taddr) } -var ( - DefaultBufferSize = 4096 +const ( + MaxMessageSize = math.MaxUint16 ) type udpConn struct { net.PacketConn - raddr net.Addr - taddr net.Addr - bufferSize int + raddr net.Addr + taddr net.Addr } -func UDPConn(c net.PacketConn, bufferSize int) net.PacketConn { +func UDPConn(c net.PacketConn) net.PacketConn { return &udpConn{ PacketConn: c, - bufferSize: bufferSize, } } @@ -107,10 +105,9 @@ func UDPConn(c net.PacketConn, bufferSize int) net.PacketConn { // NOTE: for server side, // the returned addr is the target address the client want to relay to. func (c *udpConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) { - rbuf := bufpool.Get(c.bufferSize) - defer bufpool.Put(rbuf) + var rbuf [MaxMessageSize]byte - n, c.raddr, err = c.PacketConn.ReadFrom(rbuf) + n, c.raddr, err = c.PacketConn.ReadFrom(rbuf[:]) if err != nil { return } @@ -135,8 +132,6 @@ func (c *udpConn) Read(b []byte) (n int, err error) { } func (c *udpConn) WriteTo(b []byte, addr net.Addr) (n int, err error) { - wbuf := bufpool.Get(c.bufferSize) - defer bufpool.Put(wbuf) socksAddr := gosocks5.Addr{} if err = socksAddr.ParseFrom(addr.String()); err != nil { @@ -151,7 +146,8 @@ func (c *udpConn) WriteTo(b []byte, addr net.Addr) (n int, err error) { Data: b, } - buf := bytes.NewBuffer(wbuf[:0]) + var wbuf [MaxMessageSize]byte + buf := bytes.NewBuffer(wbuf[:][:0]) _, err = dgram.WriteTo(buf) if err != nil { return diff --git a/internal/util/ss/conn.go b/internal/util/ss/conn.go index c07cd10c..8627590c 100644 --- a/internal/util/ss/conn.go +++ b/internal/util/ss/conn.go @@ -2,14 +2,14 @@ package ss import ( "bytes" + "math" "net" - "github.com/go-gost/core/common/bufpool" "github.com/go-gost/gosocks5" ) -var ( - DefaultBufferSize = 4096 +const ( + MaxMessageSize = math.MaxUint16 ) var ( @@ -19,33 +19,29 @@ var ( type UDPConn struct { net.PacketConn - raddr net.Addr - taddr net.Addr - bufferSize int + raddr net.Addr + taddr net.Addr } -func UDPClientConn(c net.PacketConn, remoteAddr, targetAddr net.Addr, bufferSize int) *UDPConn { +func UDPClientConn(c net.PacketConn, remoteAddr, targetAddr net.Addr) *UDPConn { return &UDPConn{ PacketConn: c, raddr: remoteAddr, taddr: targetAddr, - bufferSize: bufferSize, } } -func UDPServerConn(c net.PacketConn, remoteAddr net.Addr, bufferSize int) *UDPConn { +func UDPServerConn(c net.PacketConn, remoteAddr net.Addr) *UDPConn { return &UDPConn{ PacketConn: c, raddr: remoteAddr, - bufferSize: bufferSize, } } func (c *UDPConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) { - rbuf := bufpool.Get(c.bufferSize) - defer bufpool.Put(rbuf) + var rbuf [MaxMessageSize]byte - n, _, err = c.PacketConn.ReadFrom(rbuf) + n, _, err = c.PacketConn.ReadFrom(rbuf[:]) if err != nil { return } @@ -68,15 +64,14 @@ func (c *UDPConn) Read(b []byte) (n int, err error) { } func (c *UDPConn) WriteTo(b []byte, addr net.Addr) (n int, err error) { - wbuf := bufpool.Get(c.bufferSize) - defer bufpool.Put(wbuf) + var wbuf [MaxMessageSize]byte socksAddr := gosocks5.Addr{} if err = socksAddr.ParseFrom(addr.String()); err != nil { return } - addrLen, err := socksAddr.Encode(wbuf) + addrLen, err := socksAddr.Encode(wbuf[:]) if err != nil { return } diff --git a/listener/tap/metadata.go b/listener/tap/metadata.go index dd2ecfc8..4d826c06 100644 --- a/listener/tap/metadata.go +++ b/listener/tap/metadata.go @@ -10,7 +10,7 @@ import ( ) const ( - DefaultMTU = 1350 + DefaultMTU = 1420 ) type metadata struct {