eth_over_uart/eth_tcp.py

72 lines
1.6 KiB
Python
Raw Normal View History

2021-08-21 21:51:57 +02:00
#!/usr/bin/env python
import sys
import socket
import threading
import socket
import time
import os
class MacDevReceiver(threading.Thread):
def __init__(self, macdev, ipdev):
self.macdev = macdev
self.ipdev = ipdev
threading.Thread.__init__(self)
def run(self):
while True:
r=self.macdev.recv(2000)
sys.stdout.write("[TCP] TX %d bytes.\n"%len(r))
self.ipdev.sendall(r)
class IpDevReceiver(threading.Thread):
def __init__(self, macdev, ipdev):
self.macdev = macdev
self.ipdev = ipdev
threading.Thread.__init__(self)
def run(self):
while True:
r = self.ipdev.recv(10000)
if (len(r) <= 1518):
sys.stdout.write("[MAC] TX %d bytes.\n"%len(r))
self.macdev.send(r)
else:
sys.stdout.write("[MAC] Dropping %d bytes long frame.\n"%len(r))
mode = sys.argv[1]
dev = sys.argv[2]
port = int(sys.argv[3])
print("Setting IF to promisc mode...")
os.system("sudo ip link set promisc on dev {}".format(dev))
ETH_P_ALL=3
m=socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL))
m.bind((dev, 0))
# TODO: IP Frames w/ MTU > 1500
# Make sure to disable TCP segmentation offloading to use this:
# https://www.baeldung.com/linux/tcp-offload-disable
2021-08-21 21:51:57 +02:00
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if (mode == "s"):
s.bind(('localhost', port))
s.listen(1)
print("Waiting for TCP connection on port {}...".format(port))
conn, addr = s.accept()
else:
s.connect(("localhost", port))
conn = s
print("Forwarding data...")
macdev_r = MacDevReceiver(m, conn)
macdev_r.start()
macdev_s = IpDevReceiver(m, conn)
macdev_s.start()
while True:
time.sleep(1)