Ich möchte skb zu prerouting
point des Linux-Netzwerk-Stacks schieben. Gibt es eine Möglichkeit, dies zu tun?
Ich habe die Funktionen dev_queue_xmit()
und netif_rx()
verwendet, aber ich glaube nicht, dass sie skb in prerouting
point des Linux-Netzwerk-Stacks pushen können.
Ich bin nicht ganz klar wo dieses skb herkommt. Im Benutzerland gibt es zwei Möglichkeiten, dies zu tun. Eine besteht darin, ein tun
-Gerät zu verwenden (und das Paket einfach hineinzuschreiben). Das andere ist libpcap
zu benutzen (was die wenig bekannte Eigenschaft hat, rohe Pakete zu verschicken, die unter allen empfangenen Daten verborgen sind).
Sie sagen, dass Sie dies tun möchten, indem Sie ein ioctl
registrieren (was vermutlich bedeutet, dass Sie Ihr eigenes ioctl
hinzufügen) und dann ioctl
from user space aufrufen. Es ist nicht sofort offensichtlich, warum Sie das tun möchten, wenn Sie dies bereits ohne Änderung des Kernels erreichen können. Wenn Sie dies jedoch tun wollten, folgen Sie dem Pfad, den der tun
-Treiber verwendet, und machen Sie das Äquivalent von write()
-ing zum tun
-Gerät in Ihrem neuen ioctl
. Das könnte bedeuten, dass eine tun
-ähnliche Schnittstelle vorhanden ist, die als Quelle für die Pakete fungiert. Ich vermute, Pakete im System brauchen eine Art Source-Interface.
Ich vermute, dass Sie libpcap oder libnetfilter_queue im Folgenden zusammen als Userland Queuing bezeichnet werden wollen. Die Userland-Warteschleife leitet alle Pakete, die mit einer Regel übereinstimmen (die Sie definieren), an Ihre Benutzerlandanwendung weiter. Die Funktionen dev_queue_ * und netif_ * gelten für das Routing auf Kernel-Ebene und sind nicht relevant für Benutzerlandanwendungen.
Userland-Queuing hat Auswirkungen auf die Leistung und abhängig von der verwendeten Bibliothek müssen Sie eine bestimmte Methode verwenden, um Ihr Paket wieder in die Netfilter-Warteschlangen zu injizieren.
Tags und Links c kernel linux-device-driver linux-kernel network-programming