Hallo, ich experimentiere gerade mit dem ENC28J60 und CodeVision. Deshalb versuche ich, den avrlib netstack zum Laufen zu bringen. Die ENC Unterstützung läuft soweit, aber bei der Anpassung der Netzwerk-Library scheitere ich an Folgendem: CodeVision unterstützt leider __attribute__((packed)) nicht. Das wird aber bei der Struktur-Definition der Ethernet-Header in net.h verwendet (GNUC_PACKED). Wenn ich das Attribut weglasse, bekomme ich beim Compilieren der net.c in der Funktion netChecksum den Fehler "pointed object size is unknown" dort wo die Pointer-Position erhöht wird. Hier mal der Source dieser Funktion: uint16_t netChecksum(void *data, uint16_t len) { register uint32_t sum = 0; for (;;) { if (len < 2) break; sum += *((uint16_t *)data); data += 2; // hier... len -= 2; } if (len) sum += *(uint8_t *) data; while ((len = (uint16_t) (sum >> 16)) != 0) sum = (uint16_t) sum + len; return (uint16_t) sum ^ 0xFFFF; } ------------ Gibt es eine Möglichkeit, das Ganze ohne Packed-Attribut zum laufen zu bekommen? Ich hoffe, die Frage ist nicht allzu doof - ich weiß zwar einigermaßen, was Pointer sind und machen, aber dieses Problem ist mir (noch?) zu hoch... Vielen Dank, Thomas
hmm, etwas weiter bin ich - wenn man (int *) sum += 2; benutzt, läuft es. Leider ist aber die ICMP Header Checksum eines Ping Replys trotzdem falsch. Hat das evtl. doch was mit dem fehlenden packed-Attribut zu tun? Der Header ist ansonsten korrekt, insofern scheint der Zugriff auf die Struktur so nicht zu funktionieren. Hat jemand diesbezüglich Erfahrungen mit CodeVision? Weiterhin für jeden Tip dankbar, Thomas
das ist ein rel. spezielles Problem. Mail doch mal an Pavel Haiduc, normalerweise kommt da sehr schnell eine Reaktion/Lösung (und dann ein Compiler-Update für alle :-)
hab die Lösung jetzt gefunden: Anscheinend wird beim Erhöhen eines int-Pointers die Position auch immer gleich um 16 bit verschoben, weshalb bei der Berechnung der Checksumme immer 2 Byte benutzt, dann 2 Bytes übersprungen wurden. Also Pointer einfach nur um 1 erhöhen, und alles ist gut :-) Jetzt stimmen die Checksummen, ab dem 2. Ping-Reply ist allerdings die IP-Identification falsch, also nächstes Problem suchen... :-) Thomas
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.