From 398f6722fca0b3cdc96f50c806c9c4c1260c1c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fin=20Maa=C3=9F?= Date: Mon, 3 Feb 2025 18:49:37 +0100 Subject: [PATCH] mac: LiteEthMACPaddingChecker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit implement LiteEthMACPaddingChecker, to drop packet when payload size < minimum ethernet payload size Signed-off-by: Fin Maaß --- liteeth/mac/padding.py | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/liteeth/mac/padding.py b/liteeth/mac/padding.py index 9ea37a0c..44ceab46 100644 --- a/liteeth/mac/padding.py +++ b/liteeth/mac/padding.py @@ -5,6 +5,7 @@ # Copyright (c) 2021 David Sawatzke # Copyright (c) 2015 Sebastien Bourdeauducq # Copyright (c) 2018 whitequark +# Copyright (c) 2025 Fin Maaß # SPDX-License-Identifier: BSD-2-Clause import math @@ -74,7 +75,40 @@ def __init__(self, dw, packet_min_length): # # # - # TODO: see if we should drop the packet when + # drop the packet when # payload size < minimum ethernet payload size - self.comb += sink.connect(source) + length = Signal(max=eth_mtu) + length_inc = Signal(4) + + # Decode Length increment from from last_be. + self.comb += Case(sink.last_be, { + 0b00000001 : length_inc.eq(1), + 0b00000010 : length_inc.eq(2), + 0b00000100 : length_inc.eq(3), + 0b00001000 : length_inc.eq(4), + 0b00010000 : length_inc.eq(5), + 0b00100000 : length_inc.eq(6), + 0b01000000 : length_inc.eq(7), + "default" : length_inc.eq(dw//8) + }) + + self.sync += [ + If(sink.valid & sink.ready, + If(sink.last, + length.eq(0), + ).Else( + length.eq(length + length_inc) + ) + ) + ] + + self.comb += [ + sink.connect(source, omit={"error"}), + + If(sink.valid & sink.last & ((length + length_inc) < packet_min_length), + source.error.eq(Replicate(1, dw//8)), + ).Else( + source.error.eq(sink.error), + ) + ]