Kernel - Netzwerk-Subsystem - Treiber

T

toex

Grünschnabel
Hallo,

ich muss für die Uni ein Tool programmieren, mit dem man gezielt eine Netzwerkkarte (der eigenen Wahl) im Rechner ansprechen kann und sie dazu bringen kann, ein Paket zu verschicken.

Nachdem ich mir jetzt schon seitenweise Dokumentationen und Tutorial zum Treiber programmieren durchgelesen habe, bin ich nicht wirklich schlauer geworden.

Ich hatte mir gedacht, ich schreibe ein kleines Programm, was alle registrierten Netzwerkkarten ausliest und den Nutzer dann eine Karte zu senden der Daten auswählen lässt. Das Programm ruft dann den entsprechenden Treiber unter Umgehung des Netzwerk-Subsystems auf und übergibt mein Datenpaket.

Würde so was funktionieren?

Ich hoffe, hier kann mir jemand helfen.

Gruß, toex
 
Hi,

deine Beschreibung der Aufgabenstellung ist leider ein bisschen vage. Sollst du ein Kernelmodul schreiben, dass wirklich ein Netzwerkpaket auf Treiberebene verschickt? Oder vielleicht nur ein Programm, das über einen Socket Nachrichten versenden kann? Soll Client und Server programmiert werden?

Falls eine Socketverbindung gemeint sein sollte, kann dir
Code:
man socket
weiterhelfen.
 
Hallo,

also wenn es mit einem Programm machbar wäre, würde das natürlich ausreichen.
Ich nehme aber an, dass es schon ein Kernelmodul sein muss, weil ich die sonst immer an die definierten Protokolle gebunden bin (TCP/IP...)

Das Problem ist, dass ich das Netzwerk-Subsystem von Linux nicht so richtig verstehe und ich daher auch nicht genau weiß, wo ich ansetzen muss.

Meine Aufgabenstellung lautet: Schreibe ein Programm/Modul, irgendwas..., dem man ein paar Daten gibt und dann sagt "Verschicke die Daten über Netzwerkkarte so und so"

Im Moment habe ich mir das so gedacht:
-Ich schreibe ein Modul, was die Informationen bezüglich der im Subsystem angemeldeten Netzwerkkarten ausliest. Besonders die Pointer zu den einzelnen Netzwerkkarten (bzw. deren Sendefunktionen)
-Das Modul stellt die Informationen einem Programm zur Verfügung, in welchem der Benutzer die Netzwerkkarte auswählen kann.
-Wenn der Benutzer eine Karte gewählt hat, gibt er den Befehl zum senden: Das Programm übergibt dem Modul dann ein Datenpaket und die Information, welche Netzwerkkarte verwendet werden soll.
-Das Modul spricht dann direkt den jeweiligen Treiber an und übergibt dem dann das Paket zum senden.

Das Problem mit den Sockets ist, dass ich zum Versenden eine Adresse brauche.
Das Subsystem würde dann der Adresse eine Netzwerkkarte zuordnen. Wenn es allerdings eine Möglichkeit gäbe, im Socket direkt die gewünschte Karte anzugeben, wäre ich damit natürlich auch zufrieden.

Ich hoffe, es ist etwa verständlicher geworden. Da ich mich mit der ganzen Kernelgeschichte noch nicht so auskenne, weiß ich auch nicht, ob dass so funktionieren kann, wie ich mir das denke.

Grüße, teox
 
Ja, so hab ich das verstanden. Deswegen will ich das Subsystem umgehen.

Den Link kenne ich schon. Leider kann ich da nur rauslesen, wie sich ein Treiber im Subsystem anmeldet und nicht wie das System die Daten verwaltet.

Wenn ich das richtig verstanden haben, ruft das Subsystem die Funktion

hard_start_xmit (struct sk_buff *skb, struct net_device *dev)

auf um ein Paket zu senden. Wenn ich der Funktion statt dem Pointer *skb mein Datenpaket mitgebe und bei *dev den entsprechenden pointer für meine Netzwerkkarte, könnte das doch funktionieren?
Ich weiß nur nicht, woher ich die Adressen *dev der einzelnen Netzwerkkarten bekommen soll. Irgendwo muss das ja im System hinterlegt sein.

Außerdem weiß ich nicht, in welchem Kontext ich die Funktion hard_start_xmit aufrufen kann, weil dass ja eigentlich auch nur ein pointer auf eine entsprechende Funktion in der struct net_device meines Treibers zu sein scheint.

Eventuell müsste mein Eintrag in *skb noch eine spezielle Form haben, je nachdem was der Treiber selber noch damit macht, aber damit wollte ich mich später noch beschäftigen.

Grüße, toex
 
Theoretisch sollte sich aus dem sysfs auslesen lassen welche Netzwerk-Devices vorhanden sind (/sys/class/net). Darüber lässt sich dann auch ifindex für das Device auslesen und mit __dev_get_by_index bekommst du dann die net_device-Struktur. Vermutlich ist aber für deine Fragen die Kernel-Mailingliste und ********** der bessere Anlaufpunkt. Da sind die Jungs, die sich richtig mit dem Netzwerk-Layer auskennen. ;)
 
Da ich die genaue Aufgabenstellung nicht kenne werfe ich einfach mal netcat in den Raum ?
Allerdings hat das dann nicht mehr viel mit Programmieren zu tun ;)
 
Zurück
Oben