Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Netzwerk-Interface (net_device) Problem! Zugriff?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.07.2009, 19:04 Uhr
Mike1985



Hallo liebe Gemeinde,

mein Ziel ist es auf eine bestehende net_device Struktur zuzugreifen (z.B. meines eth0 Interfaces).

Mit Hilfe eines SocketBuffs & der net_device Struktur möchte ich über eine send-Funktion Pakete über dieses Device schicken.

Das ganze soll auf unterster Ebene statt finden, also auch noch ein gutes Stück weit unter Sockets. Ich habe heraus gefunden dass es eine Kernel Variable "dev_base" gibt, die ein Pointer auf das erste net_device in einer Liste darstellt!

Mir fehlt aber das Verständnis wie ich an die Sache ran gehe. Das ganze ist völliges Neuland für mich.

Gibt es jmd. der mir dafür einen Ansatz geben kann wie ich so etwas programmier-technisch angehe, da ich mir noch nicht so ganz im Klaren bin, was das Zusammenspiel zwischen Interfaces, Devices und den verschiedenen Headern Dateien (netdevice.h, if.h) etc.pp ist.

Danke für alle Antworten & Hilfen!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.07.2009, 21:47 Uhr
0xdeadbeef
Gott
(Operator)


Naja, zunächst mal gehst du da, wenn du das mit Kernelinterna machen willst, nicht als Programm, sondern als Kernelmodul ran. Wenn Netzwerkprogrammierung völliges Neuland für dich ist, würde ich davon an deiner Stelle aber erstmal Abstand nehmen und mit konventionelleren Mitteln (d.h. Sockets) rangehen.

Der Zusammenhang zwischen Geräten (Devices) und Schnittstellen (Interfaces) ist, dass Schnittstellen einen (möglichst) einheitlichen Zugriff auf Geräte ermöglichen. Ein Gerät mag beispielsweise eine PCI-Bus-ID und einen IRQ haben, eine Schnittstelle eine IP-Adresse und eine MTU. Es ist wichtig zu verstehen, dass Schnittstellen relativ losgelöst von Geräten existieren; zum Beispiel kann ein Gerät mehrere Schnittstellen haben (etwa eth0:0, eth0:1 etc.) oder eine Schnittstelle völlig ohne Gerät funktionieren (etwa lo oder tun/tap).

Als Programmierer holst du dir üblicherweise einen Socket auf einer Schnittstelle, wartest auf eine Verbindung (bzw. Pakete, falls UDP) und arbeitest dann mit dem Socket weiter.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.07.2009, 02:35 Uhr
Mike1985



Erstmal vielen Dank für deine Antwort. Mit Sockets (TCP & UDP) kenne ich mich aus, darüber habe ich schon einige diverse Server-Client Programme geschrieben.

Die Sache ist die, dass es sich bei der Aufgabe um ein Projekt handelt und die Ebene zwischen Device <--> Interface angegangen werden soll.

Ich habe schon einige Bücher (Linux Network oder auch dieses Kapitel hier www.oreilly.de/german/freebooks/linuxdrive2ger/net.html) durchgeackert und bin auf viele Informationen und auch Funktionen gestoßen mit denen ja schon das aufgezeigt wird was ich machen möchte.

Wie z.B. diese Beispielfunktion:

int snull_tx(struct sk_buff *skb, struct net_device *dev)

mit welcher ich dann im Endeffekt Pakete in Form eines Socketpakets über ein net_device schicken kann.

Nur leider fehlt mir der Ansatz das praktisch umzusetzen weil ich kein neues Device erstellen soll (erstmal) und zweitens aber auch nicht weiß wie ich auf ein bestehendes net_device "zugreifen" kann, z.b. von meiner eth0 Schnittstelle.

In einem Buch ist mir z.B. diese "dev_base" Variable zugeflogen die den Anfang einer verketteten Liste von net_devices darstellt (die im System eingerichtet worden sind). Doch wie ich den Zugriff drauf realisieren soll oder wo die vorhandenen net_devices halt abgelegt sind ---> Kein Plan!

Ich denke mal das theoretische Verständnis ist einigermaßen da, doch bei der technischen Umsetzung mangelt es ein wenig und ich seh den Wald vor lauter Bäumen nicht mehr und weiß nicht genau WIE ich nun den ersten Schritt zu gehen habe.

Falls du noch einen Vorschlag, eine Idee oder einen gut verständlichen Beispielcode hast, wäre ich dir sehr dankbar dafür .
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.07.2009, 15:02 Uhr
0xdeadbeef
Gott
(Operator)


Äh...nein, nein, eth0 hat seine eigene, treiberspezifische tx-Funktion. Du musst dem snull-Treiber schon eigene Interfaces stellen (bei O'Reilly heißen die sn0 und sn1).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.07.2009, 15:12 Uhr
Mike1985



Heißt das nun es besteht keine Möglichkeit ein Paket über das vorhandene Interface eth0 zu senden?
Ich will der ganzen Sache, eigene Interfaces zu erstellen erstmal umgehen und das vorhandene dazu benutzen.

Wenn die Treiber & Funktionen für das eth0 Interface schon existieren, müsste es doch auch möglich sein damit zu arbeiten?!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.07.2009, 16:07 Uhr
0xdeadbeef
Gott
(Operator)


Du kannst (wenn der Prozess CAP_NET_RAW hat) ein raw packet socket aufmachen, damit kommst du runter bis zum data link. Das ist aber auch nichts, was du für alltägliche Dinge zur Gewohnheit machen willst.

Dafür, Layer 1 zusammenzusetzen, ist der Treiber da, der die Schnittstelle betreibt. Die Schnittstelle selber ist eigentlich dazu gedacht, über Sockets benutzt zu werden. Das ist im Grunde die Schnittstelle.

In einem Treiber die Schnittstelle eines anderen Treibers zu betreiben, halte ich für ausgesprochen gewagt (bzw. wahnsinnig), selbst wenn du an die Handles kommst. Dass du dich mit dem in die Haare kriegst, ist nur eine Frage der Zeit, es sei denn, du schreibst den vorhandenen Treiber so um, dass er über einen Mutex oder Semaphor mit deinem Treiber kommuniziert und sie ggf. aufeinander warten.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: