Forum: Mikrocontroller und Digitale Elektronik TCP Handshake Mega8 ENC28J60


von Benedikt (Gast)


Angehängte Dateien:

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
}

von marixstorm (Gast)


Lesenswert?

Auch erst ganz frisch:  Beitrag "ATmega8 + ENC28J60"

von ChecksumPrüfer (Gast)


Lesenswert?

Vielleicht mal dem Wireshark glauben, der die TCP-Checksum anmeckert. Ab 
sendbuffer[11] steht doch nicht die Source IP.

von Benedikt (Gast)


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.

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
Noch kein Account? Hier anmelden.