Forum: PC-Programmierung LWIP einrichten


von Tobias P. (hubertus)


Lesenswert?

Moin,
bin grade dabei, LWIP einzurichten, damit ich den auf meinem LPC2468 
Board laufen lassen kann. Im Moment bin ich schon mal soweit, dass das 
Ding in IAR EWARM sich compilieren lässt, bis auf einen einzigen Error:

"MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts"

was muss ich da noch ändern? Ausserdem finde ich, ist dieser memory pool 
manager nicht notwendig. Ich habe auf meinem System ein funktionierendes 
malloc selber geschrieben, man könnte doch das verwenden, oder nicht?

Dann weiter: ich verwende kein OS. Was muss ich da noch alles 
einstellen?

Was muss ich für funktionen aufrufen, um den LWIP zu starten und wo 
verbinde ich das mit dem EMAC driver? Einen solchen habe ich bereits 
geschrieben (LPC2468 + Micrel KSZ8001 Phy), welcher auch funktioniert. 
Doch wie füge ich das nun zusammen?
Alles in allem noch ein paar Fragezeichen, ich hoffe ihr könnt mir ein 
paar Tipps geben, die Doku von LWIP lässt ein bisschen zu wünschen 
übrig...

von Tobias P. (hubertus)


Lesenswert?

Da mir keiner geantwortet hat, hole ich den Thread jetzt nochmal nach 
oben.

Ich habe nun nach langem herumpröbeln und dank eines Beispielprojekts, 
das ich im Internet gefunden habe, herausgefunden, wie man den lwip 
einrichtet.
Er lässt sich jetzt ohne Fehler compilieren.
Ich bin jetzt auch schon so weit, dass DHCP und so weiter funktioniert - 
ich kann mein LPC2468 Board erfolgreich im heimischen LAN anpingen.
Nun möchte ich aber noch, dass sich das Board via Hostnamen ansprechen 
lässt.
Wie kann ich dies erreichen? anstatt ping 192.168.1.22 möchte ich lieber 
ping lwip schreiben können. Der TCP-Stack soll dann den Hostnamen selber 
auflösen können. Ich gehe mal davon aus, dass man dazu DNS benötigt. Der 
lwip unterstützt DNS ja. Nur, wie richte ich es ein, dass er sich über 
einen von mir definierten Hostnamen ansprechen lässt?
es gibt ja die Option LWIP_NETIF_HOSTNAME in der lwipopts.h, jedoch 
bewirkt diese Option nichts. Wofür ist die da? Und wo kann ich meinen 
eigenen Hostnamen definieren?

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

LWIP kann als DNS Client arbeiten. Du brauchst aber einen DNS Server 
oder einen Eintrag in der hosts-Datei deines Betriebssystems wenn dein 
Board auf einer festen IP sitzt.

Matthias

von op (Gast)


Lesenswert?

Tobias Plüss schrieb:
> Ich habe nun nach langem herumpröbeln und dank eines Beispielprojekts,
> das ich im Internet gefunden habe, herausgefunden, wie man den lwip
> einrichtet.

Kannst Du uns daran teilhaben lassen? Eventuell das BSP Projekt (also 
die wichtigen Teile) anhängen? THX

von Tobias P. (hubertus)


Lesenswert?

Muss wirklich ein DNS-Server implementiert werden, um ein Gerät via 
Hostnamen anzusprechen?
Ich kann mir das fast nicht vorstellen, denn jeder beliebige poplige 
Windows-PC lässt sich über seinen Hostnamen ansprechen. Pinge ich im 
heimischen LAN meinen Desktop-PC vom Notebook aus an, dann kann dieser 
jedenfalls den Namen auflösen. Und da ist doch sicher kein DNS-Server 
eingerichtet, oder doch?
Kann man selber sowas implementieren?

Andere Frage.
Wie sieht es mit Telnet aus? Gibt es da fertige Implementierungen? Ich 
möchte mit meinem Mikrocontroller gerne via Telnet "reden", indem ich 
z.B. Hyperterminal benutze oder den telnet-Befehl in der Konsole.
Geht sowas auch?

von Tobias P. (hubertus)


Lesenswert?

op,
ja kann ich schon machen. Oder ich kann ein kleines Tutorial basteln. 
Das wäre vllt. nützlicher. Ich habe zum Glück alles dokumentiert, was 
ich gemacht habe, dann lässt sich das ganze auch später wieder 
nachvollziehen.

von op (Gast)


Lesenswert?

Tobias Plüss schrieb:
> op,
> ja kann ich schon machen. Oder ich kann ein kleines Tutorial basteln.
> Das wäre vllt. nützlicher. Ich habe zum Glück alles dokumentiert, was
> ich gemacht habe, dann lässt sich das ganze auch später wieder
> nachvollziehen.

Das wäre supi. ADs lwip kullert ja einem permanent vor den Füßen rum 
(AVR32, Xilinx etc).

von Tobias P. (hubertus)


Lesenswert?

Nun ja, mit AVR32 und Xilinx habe ich aber gar nichts am Hut.
Ich bin vielmehr auf der NXP ARM-Schiene, "meinen" lwip habe ich ja auch 
auf dem NXP LPC2468 laufen.
Das meiste ist zum Glück wirklich hardwareunabhängig.

Bist du denn zur Zeit an einem konkreten Projekt? wo haperts denn mit 
dem lwip? mittlerweile, nachdem ich mich durch die ganzen Headerfiles 
durchgelesen habe, weiss ich schon das eine oder andere.
Vielleicht kann ich dir ja einen Tipp geben?

von op (Gast)


Lesenswert?

Ne, ein konkretes Projekt habe ich nicht. Wir sind vielmehr an allem 
interessiert (Uni). Und da hilft ein Paper, welches eventuelle 
Fratzenfallen aufzeigt, ungemein. Ohne weitere Recherche bzw. eigenem 
Brain kommt man ja bei konkreten Projekten nie weiter.
Also beim AVR ist mir der lwip bei dem RTOS Example aufgefallen. 
Bezüglich Xilinx ist lwip eine Option beim SDK (ich glaub, das war auch 
ein Standalone Echo Server Example).
Ansonsten ist ja lwip recht gutmütig (und gut dokumentiert), nur die 
entsprechenden Ports an die MAC Layer können recht tricky sein ;-).

von Tobias P. (hubertus)


Lesenswert?

Also ich benutze lwip hier ohne Betriebssystem.
Das funktioniert ganz gut, und eigentlich auch sehr zuverlässig - bei 
meinem Dauertest, welcher nun schon seit einem ganzen Tag Pakete hin- 
und her schickt in meinem LAN, ist bisher kein einziges Paket verloren 
gegangen.
Einzig ein Fehler triff auf, nämlich wenn man ein Ping-Paket verschickt, 
das grösser als 256 Bytes ist - dann stürzt der Rechner nach ca. 8 
Paketen ab, und ich weiss bis jetzt noch nicht, wieso.
Aber das ist ein anderes Thema :-)
Bisher sind 300000 Pakete erfolgreich übertragen worden. Also scheint 
die Sache ansich zu funktionieren.

Zur Doku von lwip - naja, ich finde, die lässt ziemlich zu wünschen 
übrig. Das pdf, welches man auf der Site von Adam Dunkels runterladen 
kann, ist ja nicht aktuell, und die ganze Doku, welche im lwip-Source 
enthalten ist, sind etwa 3 Textfiles, welche für meinen Geschmack 
ziemlich dürftig sind.
Alles, was ich über lwip weiss, habe ich durch try and error 
rausgefunden, aus Beispielcodes aus dem Internet extrahiert, und einen 
Teil habe ich auch noch von einem Arbeitskollegen, da der lwip in einem 
Produkt von uns zum Einsatz kommt.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Tobias Plüss schrieb:
> Muss wirklich ein DNS-Server implementiert werden, um ein Gerät via
> Hostnamen anzusprechen?

Oder über die hosts Datei deines OS.

> Ich kann mir das fast nicht vorstellen, denn jeder beliebige poplige
> Windows-PC lässt sich über seinen Hostnamen ansprechen. Pinge ich im
> heimischen LAN meinen Desktop-PC vom Notebook aus an, dann kann dieser
> jedenfalls den Namen auflösen. Und da ist doch sicher kein DNS-Server
> eingerichtet, oder doch?

Die Namensauflösung wird vermutlich irgendwie über SMB erledigt. Keine 
Ahnung wie Windows das macht. Standard ist nunmal DNS.

> Kann man selber sowas implementieren?

Sicher. Aber auf der LWIP Seite brauchst du ja keinen DNS Server. Du 
kannst z.B. auch einen kleinen DHCP-Server unter Windows verwenden der 
auch als DNS arbeitet -> http://ruttkamp.gmxhome.de/dhcpsrv/dhcpsrv.htm

> Andere Frage.
> Wie sieht es mit Telnet aus? Gibt es da fertige Implementierungen? Ich
> möchte mit meinem Mikrocontroller gerne via Telnet "reden", indem ich
> z.B. Hyperterminal benutze oder den telnet-Befehl in der Konsole.
> Geht sowas auch?

Telnet ist doch primitiv. Einfach auf der LWIP Seite einen Serversocket 
einrichten und dann auf eine Verbindung warten. Die ankommenden 
Kommandos von deinem Telnetclient musst du dann nur noch passend 
interpretieren.

Matthias

von dj999 (Gast)


Angehängte Dateien:

Lesenswert?

Μαtthias W. schrieb:
>> Ich kann mir das fast nicht vorstellen, denn jeder beliebige poplige
>> Windows-PC lässt sich über seinen Hostnamen ansprechen. Pinge ich im
>> heimischen LAN meinen Desktop-PC vom Notebook aus an, dann kann dieser
>> jedenfalls den Namen auflösen. Und da ist doch sicher kein DNS-Server
>> eingerichtet, oder doch?
>
> Die Namensauflösung wird vermutlich irgendwie über SMB erledigt. Keine
> Ahnung wie Windows das macht. Standard ist nunmal DNS.

Hallo,

unter Windows wird zunächst versucht, den Namen über NBNS aufzulösen, 
bevor ein DNS-Server befragt wird.
Ich hatte unter 
http://www.mail-archive.com/lwip-users@nongnu.org/msg04904.html eine 
Implementierung des Protokolls für LWIP gefunden und es dann erweitert, 
dass auch Namen zu einer IP-Adresse aufgelöst werden.

Im Anhang sind die Dateien.

von Tobias P. (hubertus)


Lesenswert?

dj999,
wow - das funktioniert!!!! SUPER :-) jetzt geht auch

ping lwip

anstatt

ping 192.168.1.22

super Sache. Und wirklich sehr einfach - ich musste nur die beiden 
Dateien zum Projekt hinzufügen und in main() die Funktion nbns_init 
aufrufen, fertig. Cool!

Jetzt habe ich nur noch eine Frage zum DNS. Ich habe den DNS-Code vom 
lwip studiert, und dort wird ein ganz bestimmter DNS-Server verwendet:
1
#define DNS_SERVER_ADDRESS(ipaddr)        (ip4_addr_set_u32(ipaddr, ipaddr_addr("208.67.222.222"))) /* resolver1.opendns.com */

das mag ganz gut funktionieren, doch es ist nicht wirklich zweckmässig. 
Ich betreibe ja mein Board in einem LAN, wo per DHCP unter Umständen ein 
DNS-Server zugewiesen wird. Wie kann ich lwip verklickern, dass er 
anstatt diesem opendns den per DHCP vorgegebenen DNS-Server benutzen 
soll?
Und erst wenn kein solcher verfügbar ist, soll dieser opendns benutzt 
werden.
Denn für solche Zwecke ist ja dieser DNS-Server da, den man über DHCP 
bekommt!

von Rolf Magnus (Gast)


Lesenswert?

Μαtthias W. schrieb:
> Tobias Plüss schrieb:
>> Muss wirklich ein DNS-Server implementiert werden, um ein Gerät via
>> Hostnamen anzusprechen?
>
> Oder über die hosts Datei deines OS.

Oder MDNS verwenden.

von dj999 (Gast)


Lesenswert?

Tobias Plüss schrieb:
> Ich betreibe ja mein Board in einem LAN, wo per DHCP unter Umständen ein
> DNS-Server zugewiesen wird. Wie kann ich lwip verklickern, dass er
> anstatt diesem opendns den per DHCP vorgegebenen DNS-Server benutzen
> soll?
> Und erst wenn kein solcher verfügbar ist, soll dieser opendns benutzt
> werden.
> Denn für solche Zwecke ist ja dieser DNS-Server da, den man über DHCP
> bekommt!

Das ist doch schon im LWIP eingebaut. Der opendns-Server wird als 
default eingestellt. Falls über DHCP eine DNS-Serveradresse empfangen 
wird, wird dieser Server zur Liste der DNS-Server über dns_setserver() 
hinzugefügt (dhcp.c).

von Tobias Plüss (Gast)


Lesenswert?

Ich versuche grade noch, einen richtig guten, sauberen Treiber für den 
Ethernet-MAC zu schreiben. Und mir ist dabei folgende Idee gekommen:
Ich verwende den lwip ja auch einem LPC2468. Dessen Ethernet MAC kann 
die ankommenden Ethernet-Frames direkt via DMA ins Memory kopieren - 
kann ich lwip nicht irgendwie so konfigurieren, dass dieser "weiss", 
dass die Frames bereits in einem bestimmten Memory sind? Alle Beispiele, 
dich ich bisher gefunden habe, alloziieren erst einen pbuf und kopieren 
dann den ganzen Frame da hinein. Das ist doch nicht nötig, wenn der 
Frame schon als ganzes im Memory liegt! kann man das irgendwie 
verbessern?

von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

Jetzt habe ich doch noch ein paar Fragen.
WIESO läuft mein Programm nicht richtig?
Ich versuche es seit Stunden.
Ich beobachte folgendes verhalten:

- kompiliere ich das Projekt mit den Optionen "Include Debug 
Information", "Disable Compiler Optimizations" dann läuft es (aus dem 
internen RAM des LPC2468). DHCP funktioniert, nbns funktioniert, einfach 
das "lauschen" auf meinen UDP-Port 9999 funktioniert NICHT. Anpingen 
kann ich das Board zwar, sende ich jedoch ein Ping-Paket, welchess 
grösser als 256 Bytes ist, stürzt der Rechner ab oder liefert nur noch 
sporadisch die Echo Replies. Es ist nicht reproduzierbar, wann der 
Rechner abstürzt.
- Der lwip benötigt bei mir 20 MB RAM. Reserviere ich weniger Platz für 
den CSTACK, dann stürzt das Programm ab.
- kompiliere ich das ganze als Release, also "Do not generate debug 
Information", "Optimize for Speed", dann läuft GAR NICHTS. Ebenso mit 
den Optionen "Optimize for Size", "Balanced Optimization", "No 
Optimization".
- wenn in der main.c diese paar Zeilen drin sind:
1
conn = udp_new();
2
udp_connect(conn, IPADDR_ANY, 333);
3
udp_bind(conn, NULL, 9999);
4
udp_recv(conn, proc, NULL);

dann funktioniert DHCP nur sporadisch (ungefähr nach jedem 2. Reset), 
pingen kann ich das Board nicht, weder unter seiner IP noch unter seinem 
Hostnamen (nbns funktioniert also auch nicht).
Kommentiere ich diese paar Zeilen aus oder lösche sie, dann funktioniert 
alles. (Nur halt wie oben beschrieben).

Ich kann somit keine UDP-Pakete empfangen (sobald ich die obigen Zeilen 
einfüge, funktioniert das Programm ja nicht mehr), TCP konnte ich noch 
nicht mal testen.
Interessant ist: wenn ein UDP-Paket rein kommt, dann kann ich im Single 
Step Modus die Verarbeitung im lwip genau Verfolgen. Er kommt bis zu dem 
Punkt, wo er die Liste der geöffneten Ports durchgeht. Dort verheddert 
er sich irgendwie und stürzt ab (Programm beginnt wieder bei main).

Meine Hardware ist ein selber gebautes LPC2468 Board mit 256M SDRAM 
sowie einem KSZ8001L Phy. Die Hardware ist getestet und funktioniert!

Als Compiler dient der IAR. Zum debuggen benutze ich den Segger J-Link.

Alle Stacks und Variablen usw. liegen im SDRAM ab Adresse 0xA0000000. 
CPU-Takt ist 72 MHz.
Hab ich was vergessen?

Kann mir einer weiter helfen?
Im Anhang mein kompletter Sourcecode. Linkerscripte und Mapfiles kann 
ich auch hochladen, wenn das vonnöten sein sollte.
Ich hoffe wirklich, ihr könnt mir weiter helfen, ich bin in den letzten 
2 Stunden sicher um 10298309457 Jahre gealtert, weil ich mich so ab 
dieser Software ärgere :-)

von Tobias P. (hubertus)


Lesenswert?

kann mir niemand weiterhelfen?

von Tobias P. (hubertus)


Lesenswert?

push

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.