core/udp: Simplify LiteEthUDPRX and make sure to drop exceeding payload.

This commit is contained in:
Florent Kermarrec 2021-09-22 16:32:47 +02:00
parent 393158f2a5
commit bee34ee955
1 changed files with 32 additions and 32 deletions

View File

@ -155,46 +155,46 @@ class LiteEthUDPRX(Module):
# # # # # #
# Depacketizer.
self.submodules.depacketizer = depacketizer = LiteEthUDPDepacketizer(dw) self.submodules.depacketizer = depacketizer = LiteEthUDPDepacketizer(dw)
self.comb += sink.connect(depacketizer.sink)
# Data-Path.
self.comb += [
sink.connect(depacketizer.sink),
depacketizer.source.connect(source, keep={
"src_port",
"dst_port",
"data",
"error"}),
source.ip_address.eq(sink.ip_address),
source.length.eq(depacketizer.source.length - udp_header.length),
]
# Control-Path (FSM).
count = Signal(16)
self.submodules.fsm = fsm = FSM(reset_state="IDLE") self.submodules.fsm = fsm = FSM(reset_state="IDLE")
fsm.act("IDLE", fsm.act("IDLE",
depacketizer.source.ready.eq(1), NextValue(count, 0),
If(depacketizer.source.valid, If(depacketizer.source.valid,
depacketizer.source.ready.eq(0), NextState("DROP"),
NextState("CHECK") If(sink.protocol == udp_protocol,
NextState("RECEIVE")
) )
) )
valid = Signal(reset_less=True)
self.sync += valid.eq(
depacketizer.source.valid &
(sink.protocol == udp_protocol)
) )
fsm.act("RECEIVE",
fsm.act("CHECK", depacketizer.source.connect(source, keep={"valid", "ready"}),
If(valid, source.last.eq(depacketizer.source.last | (count == (source.length - dw//8))),
NextState("PRESENT") If(source.valid & source.ready,
).Else( NextValue(count, count + dw//8),
If(depacketizer.source.last,
NextState("IDLE")
).Elif(source.last,
NextState("DROP") NextState("DROP")
) )
) )
self.comb += [
source.last.eq(depacketizer.source.last),
source.src_port.eq(depacketizer.source.src_port),
source.dst_port.eq(depacketizer.source.dst_port),
source.ip_address.eq(sink.ip_address),
source.length.eq(depacketizer.source.length - udp_header.length),
source.data.eq(depacketizer.source.data),
source.error.eq(depacketizer.source.error)
]
fsm.act("PRESENT",
source.valid.eq(depacketizer.source.valid),
depacketizer.source.ready.eq(source.ready),
If(source.valid & source.last & source.ready,
NextState("IDLE")
)
) )
fsm.act("DROP", fsm.act("DROP",
depacketizer.source.ready.eq(1), depacketizer.source.ready.eq(1),
If(depacketizer.source.valid & If(depacketizer.source.valid &