change []byte bufpool to *[]byte
This commit is contained in:
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
})
|
||||
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user