Problem mit ENC28J60

OP #2151704
Lesenswert?
• ▲
▼
Hallo Leute!
Ich arbeite mit einen Atmega1280 und ENC28J60. Ich habe die Bibliothek 
von Iain Derrignton benutzt, aber es läuft nicht gut.

Wenn ich ein ARP-Packet (42 Bytes) vom µC sende, dann übertragt dieser 
das Paket zwar, aber leider mit einen Trailer (80 ~ 1600 Byte 
Gesamtgröße), siehe Anhang.
Wenn ich ein ARP-Paket an den µC über Ethernet sende, dann wird dieses 
Paket völlig falsch beim µC empfangen.


Weiß ihr wo kann das Problem liegen?
Vielen Dank.
Angehängte Dateien:
Gast #2151900
Lesenswert?
• ▲
▼
Vielleicht ein Bufferoverflow.

Ich würde im Sourcecode vor und nach jeden Puffer eine initialisierte, 
d.h. typische uint32_t Konstante setzen und aufpassen, ob die in dem 
Datagramm auftaucht. Das wäre dann der Hinweis, welcher Puffer 
überschiesst.

Bsp:
1
#define BUFFERDEBUG 1 // 0 = Aus
2

3
uint16_t MACWrite()
4
{
5

6
  volatile uint16_t address = TXSTART;
7
  uint8_t  bytControl;
8
#if BUFFERDEBUG
9
  uint32_t pre_buffer_1 = 0x12345601;
10
#endif
11
  unsigned char uip_buf[] = {0x64, 0x31, 0x50, 0x71, 0xbb, 0xe5, 0x10, 0x12, 0xe2, 0x10, 0x10, 0xd0, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02, 0x10, 0x12, 0xe2, 0x10, 0x10, 0xd0, 0xc0, 0xa8, 0x00, 0x02, 0x64, 0x31, 0x50, 0x71, 0xbb, 0xe5, 0xc0, 0xa8, 0x00, 0x01};
12
#if BUFFERDEBUG
13
  uint32_t post_buffer_1 = 0x12345602;
14
#endif
15
  bytControl = 0x00;
16
...

Bei dem Buffer uip_buf kann ein Problem auftauchen: In der Source wird 
der mit obiger Zeile definiert und mit folgender Zeile benutzt:
1
  address+=WriteMacBuffer(&uip_buf[0], UIP_LLH_LEN);

Wenn UIP_LLH_LEN größer definiert ist als oben Elemente initialisiert 
werden, wird über die Arraygrenze hinaus zugegriffen.

Ähnliche Stellen kommen noch weiter im Code vor z.B.
1
  if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN)
2
  {
3
    address+=WriteMacBuffer(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN);
4
  } 
5
  else 
6
  {
7
    address+=WriteMacBuffer(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN);
8
    address+=WriteMacBuffer(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN);
9
  }

Mit uip_len habe ich an der Stelle Verständnisprobleme. Innerhalb 
MACWrite() an obiger Stelle ist das eine globale Variable. In dem von 
dir gezeigten Code ist weder die Definition zu sehen noch die Zuweisung, 
die letztlich einen Rückschluß auf den Inahlt an obiger Stelle erlaubt.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.