59ea5cfd79c97adc2714edb74cbf2850a73707d0
1 from liteeth
.common
import *
2 from liteeth
.generic
.depacketizer
import LiteEthDepacketizer
3 from liteeth
.generic
.packetizer
import LiteEthPacketizer
5 class LiteEthUDPDepacketizer(LiteEthDepacketizer
):
7 LiteEthDepacketizer
.__init
__(self
,
8 eth_ipv4_user_description(8),
9 eth_udp_description(8),
13 class LiteEthUDPPacketizer(LiteEthPacketizer
):
15 LiteEthPacketizer
.__init
__(self
,
16 eth_udp_description(8),
17 eth_ipv4_user_description(8),
21 class LiteEthUDPTX(Module
):
22 def __init__(self
, ip_address
):
23 self
.sink
= Sink(eth_udp_user_description(8))
24 self
.source
= Source(eth_ipv4_user_description(8))
26 packetizer
= LiteEthUDPPacketizer()
27 self
.submodules
+= packetizer
29 packetizer
.sink
.stb
.eq(self
.sink
.stb
),
30 packetizer
.sink
.sop
.eq(self
.sink
.sop
),
31 packetizer
.sink
.eop
.eq(self
.sink
.eop
),
32 self
.sink
.ack
.eq(packetizer
.sink
.ack
),
33 packetizer
.sink
.src_port
.eq(self
.sink
.src_port
),
34 packetizer
.sink
.dst_port
.eq(self
.sink
.dst_port
),
35 packetizer
.sink
.length
.eq(self
.sink
.length
+ udp_header_len
),
36 packetizer
.sink
.checksum
.eq(0),
37 packetizer
.sink
.data
.eq(self
.sink
.data
)
39 sink
= packetizer
.source
41 self
.submodules
.fsm
= fsm
= FSM(reset_state
="IDLE")
44 If(sink
.stb
& sink
.sop
,
50 Record
.connect(packetizer
.source
, self
.source
),
51 self
.source
.length
.eq(packetizer
.sink
.length
+ ipv4_header_len
),
52 self
.source
.protocol
.eq(udp_protocol
),
53 self
.source
.ip_address
.eq(self
.sink
.ip_address
),
54 If(self
.source
.stb
& self
.source
.eop
& self
.source
.ack
,
59 class LiteEthUDPRX(Module
):
60 def __init__(self
, ip_address
):
61 self
.sink
= Sink(eth_ipv4_user_description(8))
62 self
.source
= source
= Source(eth_udp_user_description(8))
64 depacketizer
= LiteEthUDPDepacketizer()
65 self
.submodules
+= depacketizer
66 self
.comb
+= Record
.connect(self
.sink
, depacketizer
.sink
)
67 sink
= depacketizer
.source
69 self
.submodules
.fsm
= fsm
= FSM(reset_state
="IDLE")
72 If(sink
.stb
& sink
.sop
,
78 self
.comb
+= valid
.eq(
80 (self
.sink
.protocol
== udp_protocol
) &
81 (self
.sink
.ip_address
== ip_address
)
92 source
.sop
.eq(sink
.sop
),
93 source
.eop
.eq(sink
.eop
),
94 source
.src_port
.eq(sink
.src_port
),
95 source
.dst_port
.eq(sink
.dst_port
),
96 source
.ip_address
.eq(0),
97 source
.length
.eq(sink
.length
- udp_header_len
),
98 source
.data
.eq(sink
.data
),
99 source
.error
.eq(sink
.error
)
102 source
.stb
.eq(sink
.stb
),
103 sink
.ack
.eq(source
.ack
),
104 If(source
.stb
& source
.eop
& source
.ack
,
110 If(source
.stb
& source
.eop
& source
.ack
,
115 class LiteEthUDP(Module
):
116 def __init__(self
, ip
, ip_address
):
117 self
.submodules
.tx
= LiteEthUDPTX(ip_address
)
118 self
.submodules
.rx
= LiteEthUDPRX(ip_address
)
119 ip_port
= ip
.crossbar
.get_port(udp_protocol
)
121 Record
.connect(self
.tx
.source
, ip_port
.sink
),
122 Record
.connect(ip_port
.source
, self
.rx
.sink
)
124 self
.sink
, self
.source
= self
.tx
.sink
, self
.rx
.source