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 | }
|