Autor Thema: Netzwerk-Zugriff aus VirtualBox (AMD PCnet)  (Gelesen 3858 mal)

AlgorithMan

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« am: 22. September 2014, 17:25 »
Hallo Leute,
ich bastele an einem C++ Kernel und hab schon ein paar Sachen ans laufen gebracht (gdt, idt, konsole, tastatur, maus, uhr, PCI)

Jetzt versuche ich seit Tagen, auf's Netzwerk zuzugreifen. Ich erzeuge zZ einen hartkodierten Ethernet Frame II, mit hartkodierten IP und ICMP-Ping Daten und
schicke den (wie in http://www.lowlevel.eu/wiki/AMD_PCnet beschrieben) an den virtuellen AMD am79c973 chip (PCnet FAST III ethernet), den VirtualBox bietet.
Ich bekomme auch ein paar Antworten (z.B. den Interrupt mit CSR0 | 0x0100 - der vermeldet, dass der Chip jetzt initialisiert ist), aber die Daten, die ich schicke, gehen
einfach nicht raus. Vor allem kommt der Interrupt mit (CSR0 | 0x0200) nicht, der vermelden würde, dass die Daten raus geschickt wurden, also kann es m.E. schon nicht
an fehlerhaften Inhalten im IP, ICMP oÄ liegen.

In http://www.lowlevel.eu/wiki/Datei:Am79C973.pdf finde ich auch keine Anhaltspunkte, was ich falsch mache.
Ich bin so langsam echt am Ende mit meinem Latein. :cry:

Hat von Euch jemand Erfahrung mit dem Chip?
Muss ich vielleicht die CRC32 vom Ethernet Frame manuell anfügen? Die sollte mE vom chip angefügt werden, so wie die OSI Layer 1 Geschichten - Preamble,
start-of-frame delimiter, inter packet gap... vor lauter Verzweiflung hab ich schon versucht, die ganzen Sachen auch noch manuell mit zu schicken...

Ich bin kurz davor, auf QEMU zu wechseln, weil man da einen virtuellen RTL 8139 chip hat, der (anscheinend) sehr viel angenehmer anzusteuern ist...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 22. September 2014, 18:07 »
Bei Netzwerksachen liegt das Problem auch oft einfach an der VM-Konfiguration. Wie hast du denn das Netzwerk in VBox konfiguriert, und welche IP- und MAC-Adresse versuchst du zu pingen? Falls es dein Host ist, bist du dir sicher, dass der im virtuellen Netzwerk auftaucht? Wie stellst du außerdem fest, ob ein Paket gesendet worden ist? Wireshark oder sowas, und wenn ja, auf welchem Interface?

Falls du Code vergleichen willst: Ich glaube, der pcnet-Treiber in CDI funktioniert auf VBox (könnte man mit einem tyndur-Image auch schnell ausprobieren).

qemu ist natürlich sowieso viel tollerer und überhaupt, aber soweit wären meine Frage auch bei qemu noch die gleichen gewesen. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

AlgorithMan

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 23. September 2014, 11:41 »
Hallo kevin,
erst mal vielen Dank für die Antwort :-)
Mir war gar nicht aufgefallen, dass CDI einen pcnet Treiber hat, ich hatte da nach am79c973 gesucht und nicht gefunden.
Da gucke ich auf jeden Fall mal rein, das hilft mir schon mal sehr weiter, danke :-)

---

Wenn ich in der selben VM eine Linux Live-CD laufen lasse, funktioniert das problemlos. Da kann ich zB 10.0.2.3 pingen. Deshalb kann es m.E. nicht an der VM-Konfiguration liegen.

Dass keine Daten raus gehen, mache ich daran fest, dass der Chip keinen Interrupt mit (CSR0 & 0x0200)==0x0200 auslöst. (Der "Initialization Done" Interrupt kommt aber, also sind Interrupts eingeschaltet, also müsste der Interrupt kommen, wenn die Daten raus gehen würden). Solange der Ethernet-Frame nicht raus geht, ist es auch sinnlos, an den IP und ICMP Daten herum zu schrauben. Es kann also nur an der Ansteuerung oder dem Ethernet-Frame liegen.

Die MAC Adresse vom Gast-Rechner lese ich vom Chip aus (die stimmt auch mit der MAC Adresse überein, die in der VirtualBox Netzwerk-Konfiguration eingestellt ist). Die MAC Adresse von 10.0.2.3 habe ich in der Live-CD resolved und im Ethernet Frame hartkodiert, um vorerst kein ARP machen zu müssen. Ich bin allerdings nicht 100% sicher, ob die MAC Adresse richtig herum im Ethernet-Frame steht. Ich habe da keine Angabe drüber gefunden, ob die in little oder big endian kodiert sein muss (ich hab eh beides probiert...) - ich vermute, dass das least-significant byte an der niedrigsten Adresse stehen muss (little endian) und ifconfig schreibt die MAC Adresse ja auch von least significant byte zu most significant byte... Also wenn ich den Ethernet-Frame von niedrigster zu höchster Adresse dumpe, dann steht die MAC Adresse so da, wie ifconfig sie auch schreibt...
Der EtherType = 8 muss AFAIK little endian sein, also müsste das 08 00 im dump auch stimmen. Am Ethernet Frame könnte es jetzt also nur noch liegen, wenn die CRC32 manuell angefügt werden muss. Das versuche ich dann jetzt auch mal. :roll:

Die Ethernet-Frame Layer 1 Sachen (Preamble, Start-of-Frame Delimiter, Inter-Packet Gap) lasse ich wie gesagt weg - die sollten bei heutiger Netzwerk-Hardware eh überflüssig sein bzw. anderenfalls vom Chip übernommen werden (das sollte ich vielleicht mal in der Spezifikation nachlesen, ob er das tatsächlich tut...)

Ich bastele dann mal weiter...

AlgorithMan

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 23. September 2014, 16:23 »
JAAAAAAAAAAAAAAAAA!!!!!!!!!!!!!!
Die Daten werden verschickt!  :-D :-D :-D :-D :-D

Das Problem bestand in einem Fehler in der Anleitung http://www.lowlevel.eu/wiki/AMD_PCnet
im Codebeispiel zum Versenden steht, man müsste die Flags des Descriptors auf 0x8030F000 | ... setzen.
Korrekt ist aber, dass die auf 0x8300F000 | ... gesetzt werden müssen.

So, Feierabend für heute 8-) :mrgreen:

gale

  • Beiträge: 10
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 04. December 2014, 15:28 »
Da bin ich ebenfalls schon drauf reingefallen hehehehe....
Signaturen werden unter jedem Beitrag und jeder Privaten Mitteilung angezeigt. In der Signatur können Smileys und BBCode verwendet werden.

 

Einloggen