From c384641b7c61358a3f65f7f600c342c658939493 Mon Sep 17 00:00:00 2001 From: Patricio Whittingslow Date: Sat, 21 Feb 2026 23:52:27 -0300 Subject: [PATCH] arp: fix runt frames by extending at ethernet level; discard blocking ARP queries after success/failure --- internet/stack-ethernet.go | 8 ++++++++ x/xnet/stack-blocking.go | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/internet/stack-ethernet.go b/internet/stack-ethernet.go index 3c0f4f3..6e1dad6 100644 --- a/internet/stack-ethernet.go +++ b/internet/stack-ethernet.go @@ -166,6 +166,14 @@ func (ls *StackEthernet) Encapsulate(carrierData []byte, offsetToIP, offsetToFra *efrm.SourceHardwareAddr() = ls.mac efrm.SetEtherType(ethernet.Type(h.proto)) n += 14 + // Pad to minimum Ethernet frame size (60 bytes without CRC, 64 with). + // Frames shorter than this are "runt frames" and may be dropped by switches/routers + // according to 802.3 minimum length of 64 octets. + const minFrameSize = 60 + for n < minFrameSize { + dst[n] = 0 + n++ + } if ls.crcupdate != nil { crc := ls.crcupdate(0, carrierData[offsetToFrame:offsetToFrame+n]) binary.LittleEndian.PutUint32(carrierData[offsetToFrame+n:], crc) diff --git a/x/xnet/stack-blocking.go b/x/xnet/stack-blocking.go index f4fc389..916191f 100644 --- a/x/xnet/stack-blocking.go +++ b/x/xnet/stack-blocking.go @@ -90,11 +90,13 @@ func (s StackBlocking) DoResolveHardwareAddress6(addr netip.Addr, timeout time.D if err == nil { break } else if err = s.checkDeadline(deadline); err != nil { - return hw, err + break } time.Sleep(sleep) err = errDeadlineExceed // Ensure that if iterations done error is returned. } + ip4 := addr.As4() + s.async.arp.DiscardQuery(ip4[:]) return hw, err }