4a8c18750f3b2f278d644b2477be522b393aad94
3 from liteeth
.common
import *
4 from liteeth
.mac
.common
import *
5 from liteeth
.test
.common
import *
7 from liteeth
.test
.model
import mac
10 print_with_prefix(s
, "[IP]")
12 preamble
= split_bytes(eth_preamble
, 8)
15 class IPPacket(Packet
):
16 def __init__(self
, init
=[]):
17 Packet
.__init
__(self
, init
)
21 for byte
in self
[:ipv4_header_len
]:
22 header
.append(self
.pop(0))
23 for k
, v
in sorted(ipv4_header
.items()):
24 setattr(self
, k
, get_field_data(v
, header
))
28 for k
, v
in sorted(ipv4_header
.items()):
29 value
= merge_bytes(split_bytes(getattr(self
, k
), math
.ceil(v
.width
/8)), "little")
30 header
+= (value
<< v
.offset
+(v
.byte
*8))
31 for d
in split_bytes(header
, ipv4_header_len
):
36 for k
in sorted(ipv4_header
.keys()):
37 r
+= k
+ " : 0x%x" %getattr
(self
,k
) + "\n"
44 def __init__(self
, mac
, mac_address
, ip_address
, debug
=False, loopback
=False):
46 self
.mac_address
= mac_address
47 self
.ip_address
= ip_address
49 self
.loopback
= loopback
51 self
.tx_packet
= IPPacket()
52 self
.rx_packet
= IPPacket()
54 self
.request_pending
= False
56 self
.mac
.set_ip_callback(self
.callback
)
58 def send(self
, packet
):
63 mac_packet
= mac
.MACPacket(packet
)
64 mac_packet
.destination_mac_address
= 0x12345678abcd # XXX
65 mac_packet
.source_mac_address
= self
.mac_address
66 mac_packet
.ethernet_type
= ethernet_type_ip
67 self
.mac
.send(mac_packet
)
69 def callback(self
, packet
):
70 packet
= IPPacket(packet
)
80 def process(self
, packet
):
83 if __name__
== "__main__":
84 from liteeth
.test
.model
.dumps
import *
85 from liteeth
.test
.model
.mac
import *
88 packet
= MACPacket(udp
)
89 packet
.decode_remove_header()
91 packet
= IPPacket(packet
)
95 errors
+= verify_packet(packet
, {})
100 errors
+= verify_packet(packet
, {})
102 print("ip errors " + str(errors
))