fix race condition

This commit is contained in:
ginuerzh
2023-10-19 23:47:47 +08:00
parent f2fd6554ad
commit cc4310106b
29 changed files with 157 additions and 156 deletions

View File

@ -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: