Moin,
ich habe hier einen Hilferuf eines Kumpels. Vielleicht können die Programmierer hier da mal ein Auge draufwerfen. Danke mal schon ;-)
----- Forwarded message -----
To: kretschmer@kaufbach.delug.de Subject: Bitte um Hilfe
Hallo !
Wie dem auch sei, ich bräuchte mal deine Hilfe. Ich bin gerade dabei, einer Bekannten für ihr Heimnetz einen DSL-Gateway/Router/Firewall/Wins-/DHCP-/DNS-Server zu basteln. Soweit alles kein Problem, problematisch ist nur das DSL-Modem. Die Dame hat nämlich das Billichangebot von 1&1 wahrgenommen und ist so zu einem kostenlosen DSL-Modem gekommen. Dummerweise handelt es sich dabei um ein USB-Teil (Allied Telesyn AT-AR215), für das offensichtlich keine Linux-Treiber existieren. Zumindest keine, mit denen mit einem deutschen DSL-Anbieter eine Verbindung möglich wäre. So jedenfalls das Ergebnis meiner Google-Recherchen.
Tja, ich habe jedenfalls erstmal den Treiber runtergeladen, der existiert und nach Aussage des README zumindest in den USA unter RedHat7.2 funktionieren soll. Ich versuche nun, den an deutsche Verhältnisse anzupassen, weil meiner Meinung nach das Problem nur bei zwei oder drei Details des ATM-Protokolls liegen kann, d.h. es müßte reichen, die passende Firmware (enthalten im deutschen Windowstreiber) in das Teil hochzuladen. Eine ähnliche Lösung wurde für ein anderes USB-Modem bereits realisiert (Habe ich auf sourceforge gefunden).
Mein Problem sind nun meine mangelhaften Kenntnisse von C im Allgemeinen und des gcc im Besonderen. Weder der eine noch der andere Treiber lassen sich bei mir damit übersetzen und ich finde einfach nicht heraus, warum nicht. Meiner Meinung nach ist die Syntax des Quelltexts nämlich völlig korrekt. Ich vermute, daß nur irgendeine Option des gcc gesetzt/gelöscht werden muß, damit er den Kram akzeptiert. Ich konnte aber bis jetzt nicht herausfinden, welche das sein könnte, deswegen möchte ich dich bitten, daß du mal einen Blick darauf wirfst. Ich habe also mal die relevanten Teile des Quelltextes aussortiert und die Warnungen/Fehler des Compilers an der richtigen Stelle eingefügt und das ganze ein wenig kommentiert.
Also zuerst mal ein paar Strukturdeklarationen in einem Headerfile:
typedef struct { UInt16 SwapData; } INT_IDMA_SWAP_INFO;
typedef struct { UInt16 CmvData[kCMV_DATA_WORDS]; } INT_IDMA_CMV_INFO;
typedef struct { UInt16 Interrupt; union { INT_IDMA_SWAP_INFO SwapIntInfo; INT_IDMA_CMV_INFO CmvIntInfo; }; UInt16 DataSize; } DeviceInt;
Da wirft der gcc am Ende der unnamed union folgende Warnung:
ADIUTIL/Structs.h:89: warning: unnamed struct/union that defines no instances
Nunja, nix schlimmes. Es wird ja wirklich keine Instanz der Struktur erzeugt, sondern nur eine Struktur deklariert. Aber, im Quelltext des eigentlichen Treibers passiert dann das:
[...] DeviceInt *pInt; pInt = (DeviceInt *)(&(pHw->pInterruptData->Data[0]));
Meiner Meinung nach ok. Es wird eine Zeigervariable auf eine (oben korrekt deklarierte) DeviceInt-Stuktur deklariert und mit einem passenden Zeiger befüllt, (die die Funktion indirekt über einen ihrer Parameter empfängt).
Aber jetzt kommt das Problem. Sobald nämlich im Quelltext die Werte der Struktur über diese Zeigervariable benutzt werden sollen (Beispiel)
[...] UInt16 SwapData = HSTOLE(pInt->SwapIntInfo.SwapData);
knallt der gcc durch und behauptet:
AdiUsbAdslDriver.c:475: structure has no member named `SwapIntInfo'
Das ist doch Quatsch, oder? Was, zum Teufel, paßt dem gcc da nicht?
In der Hoffnung auf sachkundige Hilfe und mit freundlichen Grüßen
----- End forwarded message -----
vielleicht kennt jemand eine Lösung?
Andreas