TCP Handshake Mega8 ENC28J60

Gast #3166267
Lesenswert?

Hi zusammen,

ich habe jetzt schon 1 Woche in die Fehlersuche gesteckt und finde den 
Fehler immer noch nicht, daher versuche ich es mal bei euch.

Ich habe einen ATMega8A mit einem ENC28J60 am laufen.

Der Code ist darauf ausgelegt auf Anfragen zu antworten.
ARP, ICMP und UDP funkionieren soweit und senden die passenden Antworten 
zurück.

Jetzt habe ich mich an TCP gemacht, da hänge ich jedoch beim Handshake.
Prinzipiell versuche ich von Hercules oder einem andern TCP Client eine 
Verbindung mit dem ENC/Mega aufzubauen. Der Handshake wird von Hercules 
gestartet, das Syn kommt am Mega an und der Mega sendet ein Syn-Ack 
zurück.

Daraufhin erhalte ich aber leider kein Ack mehr von Hercules.

Ich packe mal mein Wireshark Capture und mein TCP Code hier rein und 
hoffe das jemand eine Idee hat warum ich keine Antwort erhalte.


Die tcp-Funktion wird aufgerufen nachdem das SYN erhalten wurde und 
verwendet ein paar Dinge aus dem erhaltenen Paket um daraus das Neue zu 
bauen. Das die Sequence Number noch nich random ist, soll vorerst mal 
nicht stören. Außer es funktioniert deswegen nicht :-)
1
void tcp(uint8_t datalength)
2
{
3
  eth(0x08,0x00);
4
  ip(datalength+TCP_HEADERLENGHT,TYPE_TCP);
5
  
6
  
7
  sendbuffer[34] = receivebuffer[36];
8
  sendbuffer[35] = receivebuffer[37];
9
  sendbuffer[36] = receivebuffer[34];
10
  sendbuffer[37] = receivebuffer[35];
11
  
12
  sendbuffer[38] = 0x00; //sequence number
13
  sendbuffer[39] = 0x13; //sequence number
14
  sendbuffer[40] = 0x43; //sequence number
15
  sendbuffer[41] = 0x0C; //sequence number
16
  
17
  sendbuffer[42] = receivebuffer[38]; //acknowledgment number
18
  sendbuffer[43] = receivebuffer[39]; //acknowledgment number
19
  sendbuffer[44] = receivebuffer[40]; //acknowledgment number
20
  sendbuffer[45] = receivebuffer[41]+1; //acknowledgment number
21
  
22
  sendbuffer[46] = 0x50;
23
  sendbuffer[47] = 0x12; 
24
  
25
  sendbuffer[48] = 0x01;
26
  sendbuffer[49] = 0x00;
27
  
28
  
29
  uint16_t sumcalc[20];
30
  for(uint8_t i=0; i<8; i++)
31
  sumcalc[0+i] = sendbuffer[11+i];  // IP Source and Dest. Address
32
  
33
  sumcalc[8] = 0x00;  // 8bits of zero
34
  sumcalc[9] = sendbuffer[23];
35
  sumcalc[10] = sendbuffer[16];
36
  sumcalc[11] = sendbuffer[17];
37
  
38
  
39
  for(uint8_t i=0; i<20; i++)
40
  sumcalc[12+i] = sendbuffer[34+i];  //checksum to local variable
41
  
42
  sumcalc[28] = 0x00;  //checksum in header = 0x00
43
  sumcalc[29] = 0x00; //checksum in header = 0x00
44
  
45
  uint16_t sum = ip_sum_calc(20,&sumcalc[0]);
46
  sendbuffer[50] = (sum >> 8);
47
  sendbuffer[51] = sum;
48

49
enc28j60PacketSend(ETH_HEADERLENGHT + IP_HEADERLENGHT + TCP_HEADERLENGHT + datalength,sendbuffer);
50
}
Angehängte Dateien:
Gast #3171861
Lesenswert?

Ja das Problem ist scheinbar wirklich die Checksumme.
Die war zu Beginn eigentlich richtig, aber scheinbar ging sie im 
Codegewühle irgendwann kaputt.

Ist somit gelöst und kann geschlossen werden.

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