[arm-elf-gcc] Über struct auf byte-Array zugreifen.

#3426028
Lesenswert?

Hallo,

ich bin gerade an der Portierung von uIP auf einen LPC2387 und stehe vor 
einem Problem.

uIP kopiert empfangene Daten in einem Array uint8_t uip_buf[LEN]. In der 
main-Schleife wird dann folgendermaßen auf dieses Array zugegriffen, um 
die Art des empfangenen Pakets zu bestimmen:
1
if((uint16_t)BUF->type == htons(UIP_ETHTYPE_IP))

wobei BUF so definiert ist:
1
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])

Schließlich noch uip_eth_hdr:
1
struct uip_eth_hdr {
2
  struct uip_eth_addr dest;
3
  struct uip_eth_addr src;
4
  u16_t type;
5
};

uip_eth_addr sind jeweils 6 uint6_t Werte für die MAC-Adressen.

Wenn im uip_buf folgendes enthalten ist:
1
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
2
0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,
3
0x08,0x06

Dann gehe ich davon aus, dass BUF->type mir 0x0806 liefert. Das tut es 
aber nicht, BUF->type gibt mir nur 0x08 zurück, das zweite byte wird 
anscheinend nicht gelesen.

Kommt jemand dieses Problem bekannt vor?

Vielen Dank,

Laurenz
#3426049
Lesenswert?

Wenn der Ethernet-Frame word-aligned ist, dann sind die IP-Adressen 
misaligned. Man kann dann mit einem ARM7 nicht direkt auf das Wort 
zugreifen. Was ausserdem die falsche Bytereihenfolge hat.

Manche legen den Ethernet-Frame so in den Speicher, dass er passend 
misaligned ist, dafür aber der IP Header word-aligned ist.

In jedem Fall muss für Zugriffe >Byte ein Alignment sichergestellt sein. 
Bei Byte-Arrays ist das von Haus aus nicht gewährleistet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren