fix race condition
This commit is contained in:
@ -196,7 +196,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{}{}:
|
||||
@ -208,22 +208,22 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
|
||||
return nil
|
||||
}
|
||||
|
||||
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]))
|
||||
|
||||
log.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 any) bool {
|
||||
conn.WriteTo((*b)[:n], v.(net.Addr))
|
||||
conn.WriteTo(b[:n], v.(net.Addr))
|
||||
return true
|
||||
})
|
||||
return nil
|
||||
@ -238,7 +238,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
|
||||
}
|
||||
|
||||
@ -258,7 +258,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, addr, err := conn.ReadFrom(*b)
|
||||
n, addr, err := conn.ReadFrom(b)
|
||||
if err != nil &&
|
||||
err != shadowaead.ErrShortPacket {
|
||||
return err
|
||||
@ -267,15 +267,15 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
|
||||
return nil
|
||||
}
|
||||
|
||||
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]))
|
||||
|
||||
log.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
|
||||
}
|
||||
|
||||
@ -294,7 +294,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 any) bool {
|
||||
if k.(tapRouteKey) != rkey {
|
||||
conn.WriteTo((*b)[:n], v.(net.Addr))
|
||||
conn.WriteTo(b[:n], v.(net.Addr))
|
||||
}
|
||||
return true
|
||||
})
|
||||
@ -302,11 +302,11 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
|
||||
|
||||
if v, ok := h.routes.Load(hwAddrToTapRouteKey(dst)); ok {
|
||||
log.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:
|
||||
|
Reference in New Issue
Block a user