diff --git a/pkg/common/bufpool/pool.go b/pkg/common/bufpool/pool.go index dca6468..d9b6fcc 100644 --- a/pkg/common/bufpool/pool.go +++ b/pkg/common/bufpool/pool.go @@ -11,7 +11,8 @@ var ( size: 128, pool: sync.Pool{ New: func() interface{} { - return make([]byte, 128) + b := make([]byte, 128) + return &b }, }, }, @@ -19,7 +20,8 @@ var ( size: 512, pool: sync.Pool{ New: func() interface{} { - return make([]byte, 512) + b := make([]byte, 512) + return &b }, }, }, @@ -27,7 +29,8 @@ var ( size: 1024, pool: sync.Pool{ New: func() interface{} { - return make([]byte, 1024) + b := make([]byte, 1024) + return &b }, }, }, @@ -35,7 +38,8 @@ var ( size: 4096, pool: sync.Pool{ New: func() interface{} { - return make([]byte, 4096) + b := make([]byte, 4096) + return &b }, }, }, @@ -43,7 +47,8 @@ var ( size: 8192, pool: sync.Pool{ New: func() interface{} { - return make([]byte, 8192) + b := make([]byte, 8192) + return &b }, }, }, @@ -51,7 +56,8 @@ var ( size: 16 * 1024, pool: sync.Pool{ New: func() interface{} { - return make([]byte, 16*1024) + b := make([]byte, 16*1024) + return &b }, }, }, @@ -59,7 +65,8 @@ var ( size: 32 * 1024, pool: sync.Pool{ New: func() interface{} { - return make([]byte, 32*1024) + b := make([]byte, 32*1024) + return &b }, }, }, @@ -67,7 +74,8 @@ var ( size: 64 * 1024, pool: sync.Pool{ New: func() interface{} { - return make([]byte, 64*1024) + b := make([]byte, 64*1024) + return &b }, }, }, @@ -75,27 +83,31 @@ var ( size: 65 * 1024, pool: sync.Pool{ New: func() interface{} { - return make([]byte, 65*1024) + b := make([]byte, 65*1024) + return &b }, }, }, } ) -// Get returns a buffer size. -func Get(size int) []byte { +// Get returns a buffer of specified size. +func Get(size int) *[]byte { for i := range pools { if size <= pools[i].size { - return pools[i].pool.Get().([]byte)[:size] + b := pools[i].pool.Get().(*[]byte) + *b = (*b)[:size] + return b } } - return make([]byte, size) + b := make([]byte, size) + return &b } -func Put(b []byte) { +func Put(b *[]byte) { for i := range pools { - if cap(b) == pools[i].size { - pools[i].pool.Put(b[:cap(b)]) + if cap(*b) == pools[i].size { + pools[i].pool.Put(b) } } } diff --git a/pkg/common/util/socks/conn.go b/pkg/common/util/socks/conn.go index 12e977d..1af18a9 100644 --- a/pkg/common/util/socks/conn.go +++ b/pkg/common/util/socks/conn.go @@ -110,7 +110,7 @@ func (c *udpConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) { rbuf := bufpool.Get(c.bufferSize) defer bufpool.Put(rbuf) - n, c.raddr, err = c.PacketConn.ReadFrom(rbuf) + n, c.raddr, err = c.PacketConn.ReadFrom(*rbuf) if err != nil { return } @@ -119,11 +119,11 @@ func (c *udpConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) { header := gosocks5.UDPHeader{ Addr: &socksAddr, } - hlen, err := header.ReadFrom(bytes.NewReader(rbuf[:n])) + hlen, err := header.ReadFrom(bytes.NewReader((*rbuf)[:n])) if err != nil { return } - n = copy(b, rbuf[hlen:n]) + n = copy(b, (*rbuf)[hlen:n]) addr, err = net.ResolveUDPAddr("udp", socksAddr.String()) return @@ -151,7 +151,7 @@ func (c *udpConn) WriteTo(b []byte, addr net.Addr) (n int, err error) { Data: b, } - buf := bytes.NewBuffer(wbuf[:0]) + buf := bytes.NewBuffer((*wbuf)[:0]) _, err = dgram.WriteTo(buf) if err != nil { return diff --git a/pkg/common/util/ss/conn.go b/pkg/common/util/ss/conn.go index 7304146..c67326b 100644 --- a/pkg/common/util/ss/conn.go +++ b/pkg/common/util/ss/conn.go @@ -45,18 +45,18 @@ func (c *UDPConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) { rbuf := bufpool.Get(c.bufferSize) defer bufpool.Put(rbuf) - n, _, err = c.PacketConn.ReadFrom(rbuf) + n, _, err = c.PacketConn.ReadFrom(*rbuf) if err != nil { return } saddr := gosocks5.Addr{} - addrLen, err := saddr.ReadFrom(bytes.NewReader(rbuf[:n])) + addrLen, err := saddr.ReadFrom(bytes.NewReader((*rbuf)[:n])) if err != nil { return } - n = copy(b, rbuf[addrLen:n]) + n = copy(b, (*rbuf)[addrLen:n]) addr, err = net.ResolveUDPAddr("udp", saddr.String()) return @@ -76,13 +76,13 @@ func (c *UDPConn) WriteTo(b []byte, addr net.Addr) (n int, err error) { return } - addrLen, err := socksAddr.Encode(wbuf) + addrLen, err := socksAddr.Encode(*wbuf) if err != nil { return } - n = copy(wbuf[addrLen:], b) - _, err = c.PacketConn.WriteTo(wbuf[:addrLen+n], c.raddr) + n = copy((*wbuf)[addrLen:], b) + _, err = c.PacketConn.WriteTo((*wbuf)[:addrLen+n], c.raddr) return } diff --git a/pkg/common/util/udp/conn.go b/pkg/common/util/udp/conn.go index 184c995..2119932 100644 --- a/pkg/common/util/udp/conn.go +++ b/pkg/common/util/udp/conn.go @@ -35,7 +35,7 @@ func (c *Conn) ReadFrom(b []byte) (n int, addr net.Addr, err error) { case bb := <-c.rc: n = copy(b, bb) c.SetIdle(false) - bufpool.Put(bb) + bufpool.Put(&bb) case <-c.closed: err = net.ErrClosed diff --git a/pkg/common/util/udp/listener.go b/pkg/common/util/udp/listener.go index 022e32d..ce89d3e 100644 --- a/pkg/common/util/udp/listener.go +++ b/pkg/common/util/udp/listener.go @@ -56,7 +56,7 @@ func (ln *listener) listenLoop() { b := bufpool.Get(ln.readBufferSize) - n, raddr, err := ln.conn.ReadFrom(b) + n, raddr, err := ln.conn.ReadFrom(*b) if err != nil { return } @@ -67,7 +67,7 @@ func (ln *listener) listenLoop() { continue } - if err := c.WriteQueue(b[:n]); err != nil { + if err := c.WriteQueue((*b)[:n]); err != nil { ln.logger.Warn("data discarded: ", err) } } diff --git a/pkg/connector/ss/connector.go b/pkg/connector/ss/connector.go index 148f61a..864334f 100644 --- a/pkg/connector/ss/connector.go +++ b/pkg/connector/ss/connector.go @@ -83,7 +83,7 @@ func (c *ssConnector) Connect(ctx context.Context, conn net.Conn, network, addre rawaddr := bufpool.Get(512) defer bufpool.Put(rawaddr) - n, err := addr.Encode(rawaddr) + n, err := addr.Encode(*rawaddr) if err != nil { c.logger.Error("encoding addr: ", err) return nil, err @@ -102,12 +102,12 @@ func (c *ssConnector) Connect(ctx context.Context, conn net.Conn, network, addre if c.md.noDelay { sc = ss.ShadowConn(conn, nil) // write the addr at once. - if _, err := sc.Write(rawaddr[:n]); err != nil { + if _, err := sc.Write((*rawaddr)[:n]); err != nil { return nil, err } } else { // cache the header - sc = ss.ShadowConn(conn, rawaddr[:n]) + sc = ss.ShadowConn(conn, (*rawaddr)[:n]) } return sc, nil diff --git a/pkg/handler/dns/handler.go b/pkg/handler/dns/handler.go index dc81f8e..d49d19d 100644 --- a/pkg/handler/dns/handler.go +++ b/pkg/handler/dns/handler.go @@ -116,14 +116,14 @@ func (h *dnsHandler) Handle(ctx context.Context, conn net.Conn) { b := bufpool.Get(4096) defer bufpool.Put(b) - n, err := conn.Read(b) + n, err := conn.Read(*b) if err != nil { h.logger.Error(err) return } h.logger.Info("read data: ", n) - reply, err := h.exchange(ctx, b[:n]) + reply, err := h.exchange(ctx, (*b)[:n]) if err != nil { return } diff --git a/pkg/handler/relay.go b/pkg/handler/relay.go index 9cb82c4..5dd0af5 100644 --- a/pkg/handler/relay.go +++ b/pkg/handler/relay.go @@ -52,7 +52,7 @@ func (r *UDPRelay) Run() (err 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 } @@ -64,7 +64,7 @@ func (r *UDPRelay) Run() (err error) { return nil } - if _, err := r.pc2.WriteTo(b[:n], raddr); err != nil { + if _, err := r.pc2.WriteTo((*b)[:n], raddr); err != nil { return err } @@ -90,7 +90,7 @@ func (r *UDPRelay) Run() (err 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 } @@ -102,7 +102,7 @@ func (r *UDPRelay) Run() (err error) { return nil } - if _, err := r.pc1.WriteTo(b[:n], raddr); err != nil { + if _, err := r.pc1.WriteTo((*b)[:n], raddr); err != nil { return err } diff --git a/pkg/handler/relay/bind.go b/pkg/handler/relay/bind.go index f821774..4df850a 100644 --- a/pkg/handler/relay/bind.go +++ b/pkg/handler/relay/bind.go @@ -196,7 +196,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) { b := bufpool.Get(bufSize) defer bufpool.Put(b) - n, raddr, err := tunnel.ReadFrom(b) + n, raddr, err := tunnel.ReadFrom(*b) if err != nil { return err } @@ -206,7 +206,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) { return nil } - if _, err := c.WriteTo(b[:n], raddr); err != nil { + if _, err := c.WriteTo((*b)[:n], raddr); err != nil { return err } @@ -229,7 +229,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) { b := bufpool.Get(bufSize) defer bufpool.Put(b) - n, raddr, err := c.ReadFrom(b) + n, raddr, err := c.ReadFrom(*b) if err != nil { return err } @@ -239,7 +239,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) { return nil } - if _, err := tunnel.WriteTo(b[:n], raddr); err != nil { + if _, err := tunnel.WriteTo((*b)[:n], raddr); err != nil { return err } h.logger.Debugf("%s <<< %s data: %d", diff --git a/pkg/handler/sni/handler.go b/pkg/handler/sni/handler.go index ff396da..5181446 100644 --- a/pkg/handler/sni/handler.go +++ b/pkg/handler/sni/handler.go @@ -120,13 +120,13 @@ func (h *sniHandler) Handle(ctx context.Context, conn net.Conn) { buf := bufpool.Get(int(length) + dissector.RecordHeaderLen) defer bufpool.Put(buf) - if _, err := io.ReadFull(conn, buf[dissector.RecordHeaderLen:]); err != nil { + if _, err := io.ReadFull(conn, (*buf)[dissector.RecordHeaderLen:]); err != nil { h.logger.Error(err) return } - copy(buf, hdr[:]) + copy(*buf, hdr[:]) - buf, host, err := h.decodeHost(bytes.NewReader(buf)) + opaque, host, err := h.decodeHost(bytes.NewReader(*buf)) if err != nil { h.logger.Error(err) return @@ -149,7 +149,7 @@ func (h *sniHandler) Handle(ctx context.Context, conn net.Conn) { } defer cc.Close() - if _, err := cc.Write(buf); err != nil { + if _, err := cc.Write(opaque); err != nil { h.logger.Error(err) return } diff --git a/pkg/handler/ss/udp/handler.go b/pkg/handler/ss/udp/handler.go index d861c2a..0ecc956 100644 --- a/pkg/handler/ss/udp/handler.go +++ b/pkg/handler/ss/udp/handler.go @@ -128,7 +128,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err 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 } @@ -138,7 +138,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err error) { return nil } - if _, err = pc2.WriteTo(b[:n], addr); err != nil { + if _, err = pc2.WriteTo((*b)[:n], addr); err != nil { return err } @@ -160,7 +160,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err 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 } @@ -170,7 +170,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err error) { return nil } - if _, err = pc1.WriteTo(b[:n], raddr); err != nil { + if _, err = pc1.WriteTo((*b)[:n], raddr); err != nil { return err } diff --git a/pkg/handler/tap/handler.go b/pkg/handler/tap/handler.go index 5861543..8a5d223 100644 --- a/pkg/handler/tap/handler.go +++ b/pkg/handler/tap/handler.go @@ -192,7 +192,7 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr 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{}{}: @@ -201,22 +201,22 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr return err } - src := waterutil.MACSource(b[:n]) - dst := waterutil.MACDestination(b[:n]) - eType := etherType(waterutil.MACEthertype(b[:n])) + src := waterutil.MACSource((*b)[:n]) + dst := waterutil.MACDestination((*b)[:n]) + eType := etherType(waterutil.MACEthertype((*b)[:n])) h.logger.Debugf("%s >> %s %s %d", src, dst, eType, n) // client side, deliver frame directly. if raddr != nil { - _, err := conn.WriteTo(b[:n], raddr) + _, err := conn.WriteTo((*b)[:n], raddr) return err } // server side, broadcast. if waterutil.IsBroadcast(dst) { go h.routes.Range(func(k, v interface{}) bool { - conn.WriteTo(b[:n], v.(net.Addr)) + conn.WriteTo((*b)[:n], v.(net.Addr)) return true }) return nil @@ -231,7 +231,7 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr return nil } - if _, err := conn.WriteTo(b[:n], addr); err != nil { + if _, err := conn.WriteTo((*b)[:n], addr); err != nil { return err } @@ -251,21 +251,21 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr 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 } - src := waterutil.MACSource(b[:n]) - dst := waterutil.MACDestination(b[:n]) - eType := etherType(waterutil.MACEthertype(b[:n])) + src := waterutil.MACSource((*b)[:n]) + dst := waterutil.MACDestination((*b)[:n]) + eType := etherType(waterutil.MACEthertype((*b)[:n])) h.logger.Debugf("%s >> %s %s %d", src, dst, eType, n) // client side, deliver frame to tap device. if raddr != nil { - _, err := tap.Write(b[:n]) + _, err := tap.Write((*b)[:n]) return err } @@ -284,7 +284,7 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr if waterutil.IsBroadcast(dst) { go h.routes.Range(func(k, v interface{}) bool { if k.(tapRouteKey) != rkey { - conn.WriteTo(b[:n], v.(net.Addr)) + conn.WriteTo((*b)[:n], v.(net.Addr)) } return true }) @@ -292,11 +292,11 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr if v, ok := h.routes.Load(hwAddrToTapRouteKey(dst)); ok { h.logger.Debugf("find route: %s -> %s", dst, v) - _, err := conn.WriteTo(b[:n], v.(net.Addr)) + _, err := conn.WriteTo((*b)[:n], v.(net.Addr)) return err } - if _, err := tap.Write(b[:n]); err != nil { + if _, err := tap.Write((*b)[:n]); err != nil { select { case h.exit <- struct{}{}: default: diff --git a/pkg/handler/transport.go b/pkg/handler/transport.go index daea0f6..9ab42f5 100644 --- a/pkg/handler/transport.go +++ b/pkg/handler/transport.go @@ -29,7 +29,7 @@ func copyBuffer(dst io.Writer, src io.Reader) error { buf := bufpool.Get(16 * 1024) defer bufpool.Put(buf) - _, err := io.CopyBuffer(dst, src, buf) + _, err := io.CopyBuffer(dst, src, *buf) return err } diff --git a/pkg/handler/tun/handler.go b/pkg/handler/tun/handler.go index 0c7cb7e..eb0af13 100644 --- a/pkg/handler/tun/handler.go +++ b/pkg/handler/tun/handler.go @@ -193,7 +193,7 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr b := bufpool.Get(h.md.bufferSize) defer bufpool.Put(b) - n, err := tun.Read(b) + n, err := tun.Read(*b) if err != nil { select { case h.exit <- struct{}{}: @@ -203,19 +203,19 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr } var src, dst net.IP - if waterutil.IsIPv4(b[:n]) { - header, err := ipv4.ParseHeader(b[:n]) + if waterutil.IsIPv4((*b)[:n]) { + header, err := ipv4.ParseHeader((*b)[:n]) if err != nil { h.logger.Error(err) return nil } h.logger.Debugf("%s >> %s %-4s %d/%-4d %-4x %d", - header.Src, header.Dst, ipProtocol(waterutil.IPv4Protocol(b[:n])), + header.Src, header.Dst, ipProtocol(waterutil.IPv4Protocol((*b)[:n])), header.Len, header.TotalLen, header.ID, header.Flags) src, dst = header.Src, header.Dst - } else if waterutil.IsIPv6(b[:n]) { - header, err := ipv6.ParseHeader(b[:n]) + } else if waterutil.IsIPv6((*b)[:n]) { + header, err := ipv6.ParseHeader((*b)[:n]) if err != nil { h.logger.Warn(err) return nil @@ -233,7 +233,7 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr // client side, deliver packet directly. if raddr != nil { - _, err := conn.WriteTo(b[:n], raddr) + _, err := conn.WriteTo((*b)[:n], raddr) return err } @@ -245,7 +245,7 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr h.logger.Debugf("find route: %s -> %s", dst, addr) - if _, err := conn.WriteTo(b[:n], addr); err != nil { + if _, err := conn.WriteTo((*b)[:n], addr); err != nil { return err } return nil @@ -264,27 +264,27 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr 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 } var src, dst net.IP - if waterutil.IsIPv4(b[:n]) { - header, err := ipv4.ParseHeader(b[:n]) + if waterutil.IsIPv4((*b)[:n]) { + header, err := ipv4.ParseHeader((*b)[:n]) if err != nil { h.logger.Warn(err) return nil } h.logger.Debugf("%s >> %s %-4s %d/%-4d %-4x %d", - header.Src, header.Dst, ipProtocol(waterutil.IPv4Protocol(b[:n])), + header.Src, header.Dst, ipProtocol(waterutil.IPv4Protocol((*b)[:n])), header.Len, header.TotalLen, header.ID, header.Flags) src, dst = header.Src, header.Dst - } else if waterutil.IsIPv6(b[:n]) { - header, err := ipv6.ParseHeader(b[:n]) + } else if waterutil.IsIPv6((*b)[:n]) { + header, err := ipv6.ParseHeader((*b)[:n]) if err != nil { h.logger.Warn(err) return nil @@ -303,7 +303,7 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr // client side, deliver packet to tun device. if raddr != nil { - _, err := tun.Write(b[:n]) + _, err := tun.Write((*b)[:n]) return err } @@ -321,11 +321,11 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr if addr := h.findRouteFor(dst); addr != nil { h.logger.Debugf("find route: %s -> %s", dst, addr) - _, err := conn.WriteTo(b[:n], addr) + _, err := conn.WriteTo((*b)[:n], addr) return err } - if _, err := tun.Write(b[:n]); err != nil { + if _, err := tun.Write((*b)[:n]); err != nil { select { case h.exit <- struct{}{}: default: diff --git a/pkg/listener/redirect/udp/conn.go b/pkg/listener/redirect/udp/conn.go index 585f98f..873a829 100644 --- a/pkg/listener/redirect/udp/conn.go +++ b/pkg/listener/redirect/udp/conn.go @@ -23,7 +23,7 @@ func (c *redirConn) Read(b []byte) (n int, err error) { c.once.Do(func() { n = copy(b, c.buf) - bufpool.Put(c.buf) + bufpool.Put(&c.buf) c.buf = nil }) diff --git a/pkg/listener/redirect/udp/listener_linux.go b/pkg/listener/redirect/udp/listener_linux.go index 9989af2..d300842 100644 --- a/pkg/listener/redirect/udp/listener_linux.go +++ b/pkg/listener/redirect/udp/listener_linux.go @@ -14,7 +14,7 @@ func (l *redirectListener) listenUDP(addr *net.UDPAddr) (*net.UDPConn, error) { func (l *redirectListener) accept() (conn net.Conn, err error) { b := bufpool.Get(l.md.readBufferSize) - n, raddr, dstAddr, err := tproxy.ReadFromUDP(l.ln, b) + n, raddr, dstAddr, err := tproxy.ReadFromUDP(l.ln, *b) if err != nil { l.logger.Error(err) return @@ -30,7 +30,7 @@ func (l *redirectListener) accept() (conn net.Conn, err error) { conn = &redirConn{ Conn: c, - buf: b[:n], + buf: (*b)[:n], ttl: l.md.ttl, } return