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 }