7.e.Q
20-06-2005, 10:44
Hallo Leute,
eine Konzeptfrage: ich programmiere einen Netzwerk Treiber, der auf einem Dual Port RAM basiert. Also ich habe zwei Systeme, die auf den Speicher des jeweils anderen Systems über einen VME Bus zugreifen können. Das Netzwerk Interface soll jetzt folgendes tun: es soll das Paket, das es vom Kernel bekommt in einen Bereich des Speichers des Zielsystems schreiben und dem Zielsystem dann mitteilen, daß dort ein Paket liegt. Das Zielsystem liest dieses Paket nun aus und gibt es hoch an den Kernel.
Im Augenblick mache ich das so: es gibt vier Bereiche im Dual Port RAM beider Systeme, genannt Frames. Jeder Frame ist folgendermaßen aufgebaut:
| ulong DP_SIGNATURE | ulong DP_FREE | ulong DP_LOCKED | ulong DP_AVAILABLE | char* DP_DATA |
- DP_SIGNATURE ist nur ein Identifikationsblock, damit die Gegenseite weiß, daß der Frame in Ordnung ist.
- DP_FREE ist ein Indikator dafür, ob in dem Frame ein Datenpaket vorhanden ist oder nicht (und ob dies bereits gelesen wurde oder nicht)
- DP_LOCKED ist gesetzt, solange die Quellseite am Daten schreiben ist, wird wieder gelöscht, sobald das Paket komplett im Speicher ist
- DP_AVAILABLE ist die Größe des Datenpaketes
- DP_DATA enthält nun das eigentliche Paket
Der Ablauf beim Schreiben eines Paketes ist nun folgender (der Treiber hier DPN genannt):
- DPN ermittelt in Schleife ersten Frame im Speicher des Zielsystems, in dem DP_FREE auf "frei" gesetzt ist
- DPN setzt DP_LOCKED im Frame auf "gesperrt"
- DPN schreibt Paket in den Puffer des Frames
- DPN setzt DP_FREE auf "belegt"
- DPN setzt DP_AVAILABLE auf die Größe des Paketes
- DPN setzt DP_LOCKED auf "offen"
- DPN löst Interrupt aus (woraufhin die Zielseite das Lesen beginnt...)
Der Ablauf beim Lesen auf der anderen Seite ist folgender:
- DPN sucht nach Frame mit DP_FREE auf "belegt"
- DPN prüft, ob DP_LOCKED auf "frei" (also das Paket vollständig) ist
- DPN liest DP_AVAILABLE ein
- DPN alloziiert entsprechend skb-Speicher
- DPN kopiert Paket aus Datenpuffer in den skb-Speicher
- DPN setzt DP_FREE auf "frei"
- DPN reicht skb-Speicher an den Kernel hoch
So... jetzt laufe ich damit aber in ein Problem. Nämlich ist Tatsache, daß die Zielseite die Daten nicht so schnell auslesen kann, wie die Quellseite sie schickt (fragt mich nicht, wieso). Jetzt kommt es immer wieder vor, daß bei großen Paketen kein Frame mehr "frei" ist. Daraufhin verwirft der DPN das Paket. Dadurch bricht natürlich jede TCP Verbindung ein... was kann ich jetzt an dem Konzept ändern, daß besagte Probleme nicht mehr auftreten? Ich habe schon probiert:
- Anzahl Frames zu erhöhen
- Framegröße zu erhöhen
- Schreiben zu verzögern
Keiner der Versuche war von Erfolg gekrönt.
Eventuell hat von euch einer 'ne Idee, 'nen Link auf ein Beispielkonzeptm 'nen Tipp etc., der/die/das mir helfen könnte.
Danke
Gruß,
Hendrik
PS: Danke für's Verschieben!
eine Konzeptfrage: ich programmiere einen Netzwerk Treiber, der auf einem Dual Port RAM basiert. Also ich habe zwei Systeme, die auf den Speicher des jeweils anderen Systems über einen VME Bus zugreifen können. Das Netzwerk Interface soll jetzt folgendes tun: es soll das Paket, das es vom Kernel bekommt in einen Bereich des Speichers des Zielsystems schreiben und dem Zielsystem dann mitteilen, daß dort ein Paket liegt. Das Zielsystem liest dieses Paket nun aus und gibt es hoch an den Kernel.
Im Augenblick mache ich das so: es gibt vier Bereiche im Dual Port RAM beider Systeme, genannt Frames. Jeder Frame ist folgendermaßen aufgebaut:
| ulong DP_SIGNATURE | ulong DP_FREE | ulong DP_LOCKED | ulong DP_AVAILABLE | char* DP_DATA |
- DP_SIGNATURE ist nur ein Identifikationsblock, damit die Gegenseite weiß, daß der Frame in Ordnung ist.
- DP_FREE ist ein Indikator dafür, ob in dem Frame ein Datenpaket vorhanden ist oder nicht (und ob dies bereits gelesen wurde oder nicht)
- DP_LOCKED ist gesetzt, solange die Quellseite am Daten schreiben ist, wird wieder gelöscht, sobald das Paket komplett im Speicher ist
- DP_AVAILABLE ist die Größe des Datenpaketes
- DP_DATA enthält nun das eigentliche Paket
Der Ablauf beim Schreiben eines Paketes ist nun folgender (der Treiber hier DPN genannt):
- DPN ermittelt in Schleife ersten Frame im Speicher des Zielsystems, in dem DP_FREE auf "frei" gesetzt ist
- DPN setzt DP_LOCKED im Frame auf "gesperrt"
- DPN schreibt Paket in den Puffer des Frames
- DPN setzt DP_FREE auf "belegt"
- DPN setzt DP_AVAILABLE auf die Größe des Paketes
- DPN setzt DP_LOCKED auf "offen"
- DPN löst Interrupt aus (woraufhin die Zielseite das Lesen beginnt...)
Der Ablauf beim Lesen auf der anderen Seite ist folgender:
- DPN sucht nach Frame mit DP_FREE auf "belegt"
- DPN prüft, ob DP_LOCKED auf "frei" (also das Paket vollständig) ist
- DPN liest DP_AVAILABLE ein
- DPN alloziiert entsprechend skb-Speicher
- DPN kopiert Paket aus Datenpuffer in den skb-Speicher
- DPN setzt DP_FREE auf "frei"
- DPN reicht skb-Speicher an den Kernel hoch
So... jetzt laufe ich damit aber in ein Problem. Nämlich ist Tatsache, daß die Zielseite die Daten nicht so schnell auslesen kann, wie die Quellseite sie schickt (fragt mich nicht, wieso). Jetzt kommt es immer wieder vor, daß bei großen Paketen kein Frame mehr "frei" ist. Daraufhin verwirft der DPN das Paket. Dadurch bricht natürlich jede TCP Verbindung ein... was kann ich jetzt an dem Konzept ändern, daß besagte Probleme nicht mehr auftreten? Ich habe schon probiert:
- Anzahl Frames zu erhöhen
- Framegröße zu erhöhen
- Schreiben zu verzögern
Keiner der Versuche war von Erfolg gekrönt.
Eventuell hat von euch einer 'ne Idee, 'nen Link auf ein Beispielkonzeptm 'nen Tipp etc., der/die/das mir helfen könnte.
Danke
Gruß,
Hendrik
PS: Danke für's Verschieben!