Transparente Layer2 Bridge programmieren
-
Hallo!
Ich würde mir gerne eine transparente Bridge auf Layer2 Ebene (Ethernet) programmieren. Diese soll einfach von eth0 nach eth2 alle Pakete weiterleiten und dabei nach gewissen Kriterien auswerten. Dabei (bei der Weiterleitung) dürfen keine Verzögerungen entstehen und auch keine Pakete verloren gehen!
Ich habe mir überlegt das alles mit zwei RAW-Sockets (je einer pro Interface) zu realisieren, wobei ich jedes ankommende Paket am Socket über select() erkennen lassen will. Den Socket erstelle ich mit:
socket ( PF_PACKET, SOCK_RAW, htons ( ETH_P_ALL ) );
Aber wie sieht das aus wenn da dann 100MBit oder mehr über die Interfaces laufen? Werden dann durch das select() nicht zu viele Interrupts ausgelöst?
Eine andere Möglichkeit wäre natürlich das alles über Polling zu machen. Also so schnell wie der Prozessor es zulässt alle Sockets nacheinander nach Paketen zu fragen. Das würde natürlich eine sehr hohe Prozessorlast verursachen.
Was vor allem sehr wichtig ist, ist das die Timestamps in den Paketen stimmen zu denen diese empfangen wurden. Hab irgendwo gelesen das die Empfangszeit der Pakete nicht mit der übereinstimmen muss die der Kernel liefert weil erst alles in den Puffer gelegt wird und erst beim Auslesen der Zeitpunkt bestimmt wird. Je voller der Puffer also desto falscher die Zeit. Ist das so? Es gibt ja nicht umsonst diese DAG-Karten (http://www.endace.com/dag-network-monitoring-cards.html).
Gruß
Thorsten
-
Schau mal in den Source von Netfilter...
Ivo
-
Ikarisan schrieb:
Dabei (bei der Weiterleitung) dürfen keine Verzögerungen entstehen [...]
Verzögerungen gibt es immer
Alex