Frage

Ich möchte a schreiben Linux 2.6 netfilter module, was das Eingang überprüfen kann IP Paketinformationen wie Dest-IP, Quell-IP. Danach weitergeben diese Informationen an an user space App was (dh Socket App) wird diese Informationen behandeln, sobald das Paket die Haken erreicht.

Ich möchte zwei Möglichkeiten ausprobieren:

1. Im Inneren netfilter Modul, machen a fifo Strukturlinie, jedes Mal, wenn das Paket das erreicht hook, Legen Sie die Paketinformationen an das FIFO. und mit Hilfe von /proc/example Dateisystem . Jedes Mal, wenn die Benutzerraum -App die Lesen Sie die /proc/example Datei erhalten eine Paketinformation vom FIFO -Kopf.

Ich bin ein Neuling von kernel Programm, dieses Programm stürzt mein Kernel mehrmals ab. -_-! Ich frage mich, dass es so möglich ist.

2. Machen Sie im NetFilter -Modul ein Zeichengerät, die Benutzerspace -App -Paketinformationen von diesem Zeichengerät. Ich weiß jedoch immer noch nicht, wie ich sicherstellen kann, dass das Paket so schnell wie möglich bekommt. Gibt es eine Möglichkeit, wenn das Paket den NetFilter -Hook erreicht, Kernel sendet ein Signal an die Info -Benutzerraum -App, dann kommt die Benutzerraum -App -App zu Die Paketinformationen auswählen?

Vielen Dank.

War es hilfreich?

Lösung

Was meinst du so schnell wie möglich? Haben Sie einige tatsächliche harte/weiche Echtzeitanforderungen?

Wenn Sie Option 2 auswählen, sollten Sie in der Lage sein, neue Daten ziemlich schnell abzurufen, indem Sie das Zeichen des Zeichengeräts nicht blockieren und auf der Lesedose FD auswählen. Ich habe etwas Ähnliches mit einem Kernel -Level -Socket gemacht, bei dem Socket -Daten über einen Charakter -Treiber einem Benutzerebeneprozess präsentiert wurden. Ich sah sehr wenig Latenz, solange ich die Steckdose rechtzeitig gewartet habe. Der Fahrer wurde in einer Umgebung verwendet, die einige weiche Echtzeitanforderungen hatte, und wir hatten kein Problem damit, diese Anforderungen mit gewöhnlichen Kerneleinrichtungen zu erfüllen.

Schauen Sie sich Linux -Gerätetreiber an, 3. Auflage.

Andere Tipps

Meine Art, dies zu tun: Erstellen Sie ein Kernel -Modul, um sich an Ihre Netzwerkaktivität zu verwandeln. Verwenden Sie dann NetLink, der mit dem Benutzerraum vom Kernel mit dem Daten -IPC übertragen werden kann.

Option 1 ist möglich und praktikabel Was ist das Problem? Aber ich kommuniziere normalerweise zwischen dem user-space und kernel space Verwendung netlink

netlink_kernel_create

netlink_kernel_release

nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);

netlink_kernel_release(nl_sk);

netlink_unicast

Ich bin mir nicht sicher über die erste Methode, aber mit der zweiten Verwendung kann Ihre Benutzerspace -App mit dem char -Gerät einen Select () -Anruf als einziges Ziel verwenden - sobald Select () zurückgibt, haben Sie Daten zum Lesen zum Lesen . Lesen Sie einfach alles und nehmen Sie nicht nur die Daten eines Pakets an.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top