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

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