change []byte bufpool to *[]byte
This commit is contained in:
@ -11,7 +11,8 @@ var (
|
|||||||
size: 128,
|
size: 128,
|
||||||
pool: sync.Pool{
|
pool: sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return make([]byte, 128)
|
b := make([]byte, 128)
|
||||||
|
return &b
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -19,7 +20,8 @@ var (
|
|||||||
size: 512,
|
size: 512,
|
||||||
pool: sync.Pool{
|
pool: sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return make([]byte, 512)
|
b := make([]byte, 512)
|
||||||
|
return &b
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -27,7 +29,8 @@ var (
|
|||||||
size: 1024,
|
size: 1024,
|
||||||
pool: sync.Pool{
|
pool: sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return make([]byte, 1024)
|
b := make([]byte, 1024)
|
||||||
|
return &b
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -35,7 +38,8 @@ var (
|
|||||||
size: 4096,
|
size: 4096,
|
||||||
pool: sync.Pool{
|
pool: sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return make([]byte, 4096)
|
b := make([]byte, 4096)
|
||||||
|
return &b
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -43,7 +47,8 @@ var (
|
|||||||
size: 8192,
|
size: 8192,
|
||||||
pool: sync.Pool{
|
pool: sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return make([]byte, 8192)
|
b := make([]byte, 8192)
|
||||||
|
return &b
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -51,7 +56,8 @@ var (
|
|||||||
size: 16 * 1024,
|
size: 16 * 1024,
|
||||||
pool: sync.Pool{
|
pool: sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return make([]byte, 16*1024)
|
b := make([]byte, 16*1024)
|
||||||
|
return &b
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -59,7 +65,8 @@ var (
|
|||||||
size: 32 * 1024,
|
size: 32 * 1024,
|
||||||
pool: sync.Pool{
|
pool: sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return make([]byte, 32*1024)
|
b := make([]byte, 32*1024)
|
||||||
|
return &b
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -67,7 +74,8 @@ var (
|
|||||||
size: 64 * 1024,
|
size: 64 * 1024,
|
||||||
pool: sync.Pool{
|
pool: sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return make([]byte, 64*1024)
|
b := make([]byte, 64*1024)
|
||||||
|
return &b
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -75,27 +83,31 @@ var (
|
|||||||
size: 65 * 1024,
|
size: 65 * 1024,
|
||||||
pool: sync.Pool{
|
pool: sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return make([]byte, 65*1024)
|
b := make([]byte, 65*1024)
|
||||||
|
return &b
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Get returns a buffer size.
|
// Get returns a buffer of specified size.
|
||||||
func Get(size int) []byte {
|
func Get(size int) *[]byte {
|
||||||
for i := range pools {
|
for i := range pools {
|
||||||
if size <= pools[i].size {
|
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 {
|
for i := range pools {
|
||||||
if cap(b) == pools[i].size {
|
if cap(*b) == pools[i].size {
|
||||||
pools[i].pool.Put(b[:cap(b)])
|
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)
|
rbuf := bufpool.Get(c.bufferSize)
|
||||||
defer bufpool.Put(rbuf)
|
defer bufpool.Put(rbuf)
|
||||||
|
|
||||||
n, c.raddr, err = c.PacketConn.ReadFrom(rbuf)
|
n, c.raddr, err = c.PacketConn.ReadFrom(*rbuf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -119,11 +119,11 @@ func (c *udpConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
|||||||
header := gosocks5.UDPHeader{
|
header := gosocks5.UDPHeader{
|
||||||
Addr: &socksAddr,
|
Addr: &socksAddr,
|
||||||
}
|
}
|
||||||
hlen, err := header.ReadFrom(bytes.NewReader(rbuf[:n]))
|
hlen, err := header.ReadFrom(bytes.NewReader((*rbuf)[:n]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
n = copy(b, rbuf[hlen:n])
|
n = copy(b, (*rbuf)[hlen:n])
|
||||||
|
|
||||||
addr, err = net.ResolveUDPAddr("udp", socksAddr.String())
|
addr, err = net.ResolveUDPAddr("udp", socksAddr.String())
|
||||||
return
|
return
|
||||||
@ -151,7 +151,7 @@ func (c *udpConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
|
|||||||
Data: b,
|
Data: b,
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := bytes.NewBuffer(wbuf[:0])
|
buf := bytes.NewBuffer((*wbuf)[:0])
|
||||||
_, err = dgram.WriteTo(buf)
|
_, err = dgram.WriteTo(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
@ -45,18 +45,18 @@ func (c *UDPConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
|||||||
rbuf := bufpool.Get(c.bufferSize)
|
rbuf := bufpool.Get(c.bufferSize)
|
||||||
defer bufpool.Put(rbuf)
|
defer bufpool.Put(rbuf)
|
||||||
|
|
||||||
n, _, err = c.PacketConn.ReadFrom(rbuf)
|
n, _, err = c.PacketConn.ReadFrom(*rbuf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
saddr := gosocks5.Addr{}
|
saddr := gosocks5.Addr{}
|
||||||
addrLen, err := saddr.ReadFrom(bytes.NewReader(rbuf[:n]))
|
addrLen, err := saddr.ReadFrom(bytes.NewReader((*rbuf)[:n]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
n = copy(b, rbuf[addrLen:n])
|
n = copy(b, (*rbuf)[addrLen:n])
|
||||||
addr, err = net.ResolveUDPAddr("udp", saddr.String())
|
addr, err = net.ResolveUDPAddr("udp", saddr.String())
|
||||||
|
|
||||||
return
|
return
|
||||||
@ -76,13 +76,13 @@ func (c *UDPConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
addrLen, err := socksAddr.Encode(wbuf)
|
addrLen, err := socksAddr.Encode(*wbuf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
n = copy(wbuf[addrLen:], b)
|
n = copy((*wbuf)[addrLen:], b)
|
||||||
_, err = c.PacketConn.WriteTo(wbuf[:addrLen+n], c.raddr)
|
_, err = c.PacketConn.WriteTo((*wbuf)[:addrLen+n], c.raddr)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ func (c *Conn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
|||||||
case bb := <-c.rc:
|
case bb := <-c.rc:
|
||||||
n = copy(b, bb)
|
n = copy(b, bb)
|
||||||
c.SetIdle(false)
|
c.SetIdle(false)
|
||||||
bufpool.Put(bb)
|
bufpool.Put(&bb)
|
||||||
|
|
||||||
case <-c.closed:
|
case <-c.closed:
|
||||||
err = net.ErrClosed
|
err = net.ErrClosed
|
||||||
|
@ -56,7 +56,7 @@ func (ln *listener) listenLoop() {
|
|||||||
|
|
||||||
b := bufpool.Get(ln.readBufferSize)
|
b := bufpool.Get(ln.readBufferSize)
|
||||||
|
|
||||||
n, raddr, err := ln.conn.ReadFrom(b)
|
n, raddr, err := ln.conn.ReadFrom(*b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -67,7 +67,7 @@ func (ln *listener) listenLoop() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := c.WriteQueue(b[:n]); err != nil {
|
if err := c.WriteQueue((*b)[:n]); err != nil {
|
||||||
ln.logger.Warn("data discarded: ", err)
|
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)
|
rawaddr := bufpool.Get(512)
|
||||||
defer bufpool.Put(rawaddr)
|
defer bufpool.Put(rawaddr)
|
||||||
|
|
||||||
n, err := addr.Encode(rawaddr)
|
n, err := addr.Encode(*rawaddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error("encoding addr: ", err)
|
c.logger.Error("encoding addr: ", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -102,12 +102,12 @@ func (c *ssConnector) Connect(ctx context.Context, conn net.Conn, network, addre
|
|||||||
if c.md.noDelay {
|
if c.md.noDelay {
|
||||||
sc = ss.ShadowConn(conn, nil)
|
sc = ss.ShadowConn(conn, nil)
|
||||||
// write the addr at once.
|
// write the addr at once.
|
||||||
if _, err := sc.Write(rawaddr[:n]); err != nil {
|
if _, err := sc.Write((*rawaddr)[:n]); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// cache the header
|
// cache the header
|
||||||
sc = ss.ShadowConn(conn, rawaddr[:n])
|
sc = ss.ShadowConn(conn, (*rawaddr)[:n])
|
||||||
}
|
}
|
||||||
|
|
||||||
return sc, nil
|
return sc, nil
|
||||||
|
@ -116,14 +116,14 @@ func (h *dnsHandler) Handle(ctx context.Context, conn net.Conn) {
|
|||||||
b := bufpool.Get(4096)
|
b := bufpool.Get(4096)
|
||||||
defer bufpool.Put(b)
|
defer bufpool.Put(b)
|
||||||
|
|
||||||
n, err := conn.Read(b)
|
n, err := conn.Read(*b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.logger.Error(err)
|
h.logger.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
h.logger.Info("read data: ", n)
|
h.logger.Info("read data: ", n)
|
||||||
|
|
||||||
reply, err := h.exchange(ctx, b[:n])
|
reply, err := h.exchange(ctx, (*b)[:n])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ func (r *UDPRelay) Run() (err error) {
|
|||||||
b := bufpool.Get(bufSize)
|
b := bufpool.Get(bufSize)
|
||||||
defer bufpool.Put(b)
|
defer bufpool.Put(b)
|
||||||
|
|
||||||
n, raddr, err := r.pc1.ReadFrom(b)
|
n, raddr, err := r.pc1.ReadFrom(*b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -64,7 +64,7 @@ func (r *UDPRelay) Run() (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := r.pc2.WriteTo(b[:n], raddr); err != nil {
|
if _, err := r.pc2.WriteTo((*b)[:n], raddr); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ func (r *UDPRelay) Run() (err error) {
|
|||||||
b := bufpool.Get(bufSize)
|
b := bufpool.Get(bufSize)
|
||||||
defer bufpool.Put(b)
|
defer bufpool.Put(b)
|
||||||
|
|
||||||
n, raddr, err := r.pc2.ReadFrom(b)
|
n, raddr, err := r.pc2.ReadFrom(*b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -102,7 +102,7 @@ func (r *UDPRelay) Run() (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := r.pc1.WriteTo(b[:n], raddr); err != nil {
|
if _, err := r.pc1.WriteTo((*b)[:n], raddr); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) {
|
|||||||
b := bufpool.Get(bufSize)
|
b := bufpool.Get(bufSize)
|
||||||
defer bufpool.Put(b)
|
defer bufpool.Put(b)
|
||||||
|
|
||||||
n, raddr, err := tunnel.ReadFrom(b)
|
n, raddr, err := tunnel.ReadFrom(*b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -206,7 +206,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := c.WriteTo(b[:n], raddr); err != nil {
|
if _, err := c.WriteTo((*b)[:n], raddr); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,7 +229,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) {
|
|||||||
b := bufpool.Get(bufSize)
|
b := bufpool.Get(bufSize)
|
||||||
defer bufpool.Put(b)
|
defer bufpool.Put(b)
|
||||||
|
|
||||||
n, raddr, err := c.ReadFrom(b)
|
n, raddr, err := c.ReadFrom(*b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -239,7 +239,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := tunnel.WriteTo(b[:n], raddr); err != nil {
|
if _, err := tunnel.WriteTo((*b)[:n], raddr); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
h.logger.Debugf("%s <<< %s data: %d",
|
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)
|
buf := bufpool.Get(int(length) + dissector.RecordHeaderLen)
|
||||||
defer bufpool.Put(buf)
|
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)
|
h.logger.Error(err)
|
||||||
return
|
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 {
|
if err != nil {
|
||||||
h.logger.Error(err)
|
h.logger.Error(err)
|
||||||
return
|
return
|
||||||
@ -149,7 +149,7 @@ func (h *sniHandler) Handle(ctx context.Context, conn net.Conn) {
|
|||||||
}
|
}
|
||||||
defer cc.Close()
|
defer cc.Close()
|
||||||
|
|
||||||
if _, err := cc.Write(buf); err != nil {
|
if _, err := cc.Write(opaque); err != nil {
|
||||||
h.logger.Error(err)
|
h.logger.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err error) {
|
|||||||
b := bufpool.Get(bufSize)
|
b := bufpool.Get(bufSize)
|
||||||
defer bufpool.Put(b)
|
defer bufpool.Put(b)
|
||||||
|
|
||||||
n, addr, err := pc1.ReadFrom(b)
|
n, addr, err := pc1.ReadFrom(*b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -138,7 +138,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err = pc2.WriteTo(b[:n], addr); err != nil {
|
if _, err = pc2.WriteTo((*b)[:n], addr); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,7 +160,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err error) {
|
|||||||
b := bufpool.Get(bufSize)
|
b := bufpool.Get(bufSize)
|
||||||
defer bufpool.Put(b)
|
defer bufpool.Put(b)
|
||||||
|
|
||||||
n, raddr, err := pc2.ReadFrom(b)
|
n, raddr, err := pc2.ReadFrom(*b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -170,7 +170,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err = pc1.WriteTo(b[:n], raddr); err != nil {
|
if _, err = pc1.WriteTo((*b)[:n], raddr); err != nil {
|
||||||
return err
|
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)
|
b := bufpool.Get(h.md.bufferSize)
|
||||||
defer bufpool.Put(b)
|
defer bufpool.Put(b)
|
||||||
|
|
||||||
n, err := tap.Read(b)
|
n, err := tap.Read(*b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
select {
|
select {
|
||||||
case h.exit <- struct{}{}:
|
case h.exit <- struct{}{}:
|
||||||
@ -201,22 +201,22 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
src := waterutil.MACSource(b[:n])
|
src := waterutil.MACSource((*b)[:n])
|
||||||
dst := waterutil.MACDestination(b[:n])
|
dst := waterutil.MACDestination((*b)[:n])
|
||||||
eType := etherType(waterutil.MACEthertype(b[:n]))
|
eType := etherType(waterutil.MACEthertype((*b)[:n]))
|
||||||
|
|
||||||
h.logger.Debugf("%s >> %s %s %d", src, dst, eType, n)
|
h.logger.Debugf("%s >> %s %s %d", src, dst, eType, n)
|
||||||
|
|
||||||
// client side, deliver frame directly.
|
// client side, deliver frame directly.
|
||||||
if raddr != nil {
|
if raddr != nil {
|
||||||
_, err := conn.WriteTo(b[:n], raddr)
|
_, err := conn.WriteTo((*b)[:n], raddr)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// server side, broadcast.
|
// server side, broadcast.
|
||||||
if waterutil.IsBroadcast(dst) {
|
if waterutil.IsBroadcast(dst) {
|
||||||
go h.routes.Range(func(k, v interface{}) bool {
|
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 true
|
||||||
})
|
})
|
||||||
return nil
|
return nil
|
||||||
@ -231,7 +231,7 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := conn.WriteTo(b[:n], addr); err != nil {
|
if _, err := conn.WriteTo((*b)[:n], addr); err != nil {
|
||||||
return err
|
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)
|
b := bufpool.Get(h.md.bufferSize)
|
||||||
defer bufpool.Put(b)
|
defer bufpool.Put(b)
|
||||||
|
|
||||||
n, addr, err := conn.ReadFrom(b)
|
n, addr, err := conn.ReadFrom(*b)
|
||||||
if err != nil &&
|
if err != nil &&
|
||||||
err != shadowaead.ErrShortPacket {
|
err != shadowaead.ErrShortPacket {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
src := waterutil.MACSource(b[:n])
|
src := waterutil.MACSource((*b)[:n])
|
||||||
dst := waterutil.MACDestination(b[:n])
|
dst := waterutil.MACDestination((*b)[:n])
|
||||||
eType := etherType(waterutil.MACEthertype(b[:n]))
|
eType := etherType(waterutil.MACEthertype((*b)[:n]))
|
||||||
|
|
||||||
h.logger.Debugf("%s >> %s %s %d", src, dst, eType, n)
|
h.logger.Debugf("%s >> %s %s %d", src, dst, eType, n)
|
||||||
|
|
||||||
// client side, deliver frame to tap device.
|
// client side, deliver frame to tap device.
|
||||||
if raddr != nil {
|
if raddr != nil {
|
||||||
_, err := tap.Write(b[:n])
|
_, err := tap.Write((*b)[:n])
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -284,7 +284,7 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
|
|||||||
if waterutil.IsBroadcast(dst) {
|
if waterutil.IsBroadcast(dst) {
|
||||||
go h.routes.Range(func(k, v interface{}) bool {
|
go h.routes.Range(func(k, v interface{}) bool {
|
||||||
if k.(tapRouteKey) != rkey {
|
if k.(tapRouteKey) != rkey {
|
||||||
conn.WriteTo(b[:n], v.(net.Addr))
|
conn.WriteTo((*b)[:n], v.(net.Addr))
|
||||||
}
|
}
|
||||||
return true
|
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 {
|
if v, ok := h.routes.Load(hwAddrToTapRouteKey(dst)); ok {
|
||||||
h.logger.Debugf("find route: %s -> %s", dst, v)
|
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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := tap.Write(b[:n]); err != nil {
|
if _, err := tap.Write((*b)[:n]); err != nil {
|
||||||
select {
|
select {
|
||||||
case h.exit <- struct{}{}:
|
case h.exit <- struct{}{}:
|
||||||
default:
|
default:
|
||||||
|
@ -29,7 +29,7 @@ func copyBuffer(dst io.Writer, src io.Reader) error {
|
|||||||
buf := bufpool.Get(16 * 1024)
|
buf := bufpool.Get(16 * 1024)
|
||||||
defer bufpool.Put(buf)
|
defer bufpool.Put(buf)
|
||||||
|
|
||||||
_, err := io.CopyBuffer(dst, src, buf)
|
_, err := io.CopyBuffer(dst, src, *buf)
|
||||||
return err
|
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)
|
b := bufpool.Get(h.md.bufferSize)
|
||||||
defer bufpool.Put(b)
|
defer bufpool.Put(b)
|
||||||
|
|
||||||
n, err := tun.Read(b)
|
n, err := tun.Read(*b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
select {
|
select {
|
||||||
case h.exit <- struct{}{}:
|
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
|
var src, dst net.IP
|
||||||
if waterutil.IsIPv4(b[:n]) {
|
if waterutil.IsIPv4((*b)[:n]) {
|
||||||
header, err := ipv4.ParseHeader(b[:n])
|
header, err := ipv4.ParseHeader((*b)[:n])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.logger.Error(err)
|
h.logger.Error(err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
h.logger.Debugf("%s >> %s %-4s %d/%-4d %-4x %d",
|
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)
|
header.Len, header.TotalLen, header.ID, header.Flags)
|
||||||
|
|
||||||
src, dst = header.Src, header.Dst
|
src, dst = header.Src, header.Dst
|
||||||
} else if waterutil.IsIPv6(b[:n]) {
|
} else if waterutil.IsIPv6((*b)[:n]) {
|
||||||
header, err := ipv6.ParseHeader(b[:n])
|
header, err := ipv6.ParseHeader((*b)[:n])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.logger.Warn(err)
|
h.logger.Warn(err)
|
||||||
return nil
|
return nil
|
||||||
@ -233,7 +233,7 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr
|
|||||||
|
|
||||||
// client side, deliver packet directly.
|
// client side, deliver packet directly.
|
||||||
if raddr != nil {
|
if raddr != nil {
|
||||||
_, err := conn.WriteTo(b[:n], raddr)
|
_, err := conn.WriteTo((*b)[:n], raddr)
|
||||||
return err
|
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)
|
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 err
|
||||||
}
|
}
|
||||||
return nil
|
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)
|
b := bufpool.Get(h.md.bufferSize)
|
||||||
defer bufpool.Put(b)
|
defer bufpool.Put(b)
|
||||||
|
|
||||||
n, addr, err := conn.ReadFrom(b)
|
n, addr, err := conn.ReadFrom(*b)
|
||||||
if err != nil &&
|
if err != nil &&
|
||||||
err != shadowaead.ErrShortPacket {
|
err != shadowaead.ErrShortPacket {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var src, dst net.IP
|
var src, dst net.IP
|
||||||
if waterutil.IsIPv4(b[:n]) {
|
if waterutil.IsIPv4((*b)[:n]) {
|
||||||
header, err := ipv4.ParseHeader(b[:n])
|
header, err := ipv4.ParseHeader((*b)[:n])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.logger.Warn(err)
|
h.logger.Warn(err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
h.logger.Debugf("%s >> %s %-4s %d/%-4d %-4x %d",
|
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)
|
header.Len, header.TotalLen, header.ID, header.Flags)
|
||||||
|
|
||||||
src, dst = header.Src, header.Dst
|
src, dst = header.Src, header.Dst
|
||||||
} else if waterutil.IsIPv6(b[:n]) {
|
} else if waterutil.IsIPv6((*b)[:n]) {
|
||||||
header, err := ipv6.ParseHeader(b[:n])
|
header, err := ipv6.ParseHeader((*b)[:n])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.logger.Warn(err)
|
h.logger.Warn(err)
|
||||||
return nil
|
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.
|
// client side, deliver packet to tun device.
|
||||||
if raddr != nil {
|
if raddr != nil {
|
||||||
_, err := tun.Write(b[:n])
|
_, err := tun.Write((*b)[:n])
|
||||||
return err
|
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 {
|
if addr := h.findRouteFor(dst); addr != nil {
|
||||||
h.logger.Debugf("find route: %s -> %s", dst, addr)
|
h.logger.Debugf("find route: %s -> %s", dst, addr)
|
||||||
|
|
||||||
_, err := conn.WriteTo(b[:n], addr)
|
_, err := conn.WriteTo((*b)[:n], addr)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := tun.Write(b[:n]); err != nil {
|
if _, err := tun.Write((*b)[:n]); err != nil {
|
||||||
select {
|
select {
|
||||||
case h.exit <- struct{}{}:
|
case h.exit <- struct{}{}:
|
||||||
default:
|
default:
|
||||||
|
@ -23,7 +23,7 @@ func (c *redirConn) Read(b []byte) (n int, err error) {
|
|||||||
|
|
||||||
c.once.Do(func() {
|
c.once.Do(func() {
|
||||||
n = copy(b, c.buf)
|
n = copy(b, c.buf)
|
||||||
bufpool.Put(c.buf)
|
bufpool.Put(&c.buf)
|
||||||
c.buf = nil
|
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) {
|
func (l *redirectListener) accept() (conn net.Conn, err error) {
|
||||||
b := bufpool.Get(l.md.readBufferSize)
|
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 {
|
if err != nil {
|
||||||
l.logger.Error(err)
|
l.logger.Error(err)
|
||||||
return
|
return
|
||||||
@ -30,7 +30,7 @@ func (l *redirectListener) accept() (conn net.Conn, err error) {
|
|||||||
|
|
||||||
conn = &redirConn{
|
conn = &redirConn{
|
||||||
Conn: c,
|
Conn: c,
|
||||||
buf: b[:n],
|
buf: (*b)[:n],
|
||||||
ttl: l.md.ttl,
|
ttl: l.md.ttl,
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
Reference in New Issue
Block a user