72 lines
1.6 KiB
Python
Executable File
72 lines
1.6 KiB
Python
Executable File
#!/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
|
|
|
|
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)
|