Forum: Mikrocontroller und Digitale Elektronik W5100 reagiert auf TCP-Paket mit RST-Flag


von Johannes (Gast)


Lesenswert?

Hallo,
ich steuere einen W5100 Ethernet-Controller mit einem AT91SAM7X256 an. 
Ich kann ohne Probleme seine Register schreiben und lesen. Der W5100 
reagiert auch richtig auf ARPs und Pings. Aber wenn eine TCP-Verbindung 
eingehen will, bricht er immer ab.

In Wireshark kann ich immer sehen, dass mein Recher ein TCP-Paket mit 
einem SYN-Flag schickt und das Board in der Antwort das RST-Flag gesetzt 
hat.

Der Code meines TCP-Servers sieht so aus:
1
void tcps(
2
  HU8 ch  /**< channel(socket) index */
3
  )
4
{
5
  int len;  
6
  int wait_send = 0;                                                
7
  HU8 * data_buf = (HU8*) RX_BUF;
8
  SOCKET kanal = ch;
9
  HU16 port;
10
  HU32 addr;
11
12
  HU8 sr = getSn_SR(ch);
13
  //switch (getSn_SR(ch))
14
  switch(sr)
15
  {
16
    /* WENN VERBINDUNG HERGESTELLT IST: */
17
    case SOCK_ESTABLISHED:                                      
18
    if(bchannel_start[ch]==1)
19
    {
20
      printf("%d: Verbunden", ch);
21
      bchannel_start[ch] = 2;
22
    }
23
    if ((len = getSn_RX_RSR(ch)) > 0) /* RX Daten prüfen */
24
    {
25
       /* Überlauf verhindern */
26
      if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE; 
27
      len = recv(ch, data_buf, len); /* Daten empfangen */
28
      bio_set_blip20(1);
29
      DatenAuswerten(data_buf, len); /* Daten auswerten */
30
      send(ch, data_buf, strlen(data_buf)); /* Antworten */
31
      while(getSn_TX_FSR(ch)!= getIINCHIP_TxMAX(ch)) //solange TX nicht leer
32
      {
33
        if(wait_send++ > 150)
34
        {
35
#ifdef WEB_DEBUG  
36
          printf( "HTTP Response send fail");
37
#endif        
38
          break;
39
        }
40
        idle(SEC(0.01));
41
      }
42
      disconnect(ch);
43
    }
44
    break;
45
46
    /* WENN DER CLIENT BEANTRAGT HAT, ZU SCHLIESSEN: */
47
    case SOCK_CLOSE_WAIT:                               
48
    printf("%d : CLOSE_WAIT\r\n", ch);
49
    disconnect(ch); /* Verbindung schließen */
50
    bchannel_start[ch] = 0;
51
52
    /* WENN DER SOCKET GESCHLOSSEN IST */
53
    case SOCK_CLOSED:                                           
54
    if(bchannel_start[ch] == 0) 
55
    {
56
      printf("%d : TCP Server Started.\r\n",ch);
57
      bchannel_start[ch] = 1;
58
    }
59
    if(socket(ch,Sn_MR_TCP,80,0x00) == 0) /* Socket neu initialisieren */
60
    {
61
      printf("\a%d : Fail to create socket.\r\n",ch);
62
      bchannel_start[ch] = 0;
63
    }
64
    else
65
      listen(ch); /* auf Anfragen warten lassen */
66
    break;
67
  }
68
}

Hat jemand ne Idee, warum der W5100 kein ACK schickt, sondern immer nur 
ein RST?

von Dirk B. (sharandac)


Lesenswert?

Hallo,

wenn in TCP auf ein SYN mit einem RST geantwortet wird deutet das darauf 
hin auf den Port kein Listener sich befindet. Lauscht dein Server auf 
einem Port. Ich sehe leider nicht die Initialisierung dafür. HTTP-Server 
lauschen z.B. auf Port 80. Schau mal in Wikipedia unter TCP und HTTP 
nach.

CA Dirk

von WizNet (Gast)


Angehängte Dateien:

Lesenswert?

Handelt es sich um den Fehler in der Anlage? Tritt wohl immer auf, wenn 
gleichzeitig gesendet und empfangen wird - oder?

von Dirk Broßwick (Gast)


Lesenswert?

Nein. Das Netzwerk arbeitet schpon richtig. Was ich meinte ist, wo sagst 
du deinem Server auf welchen TCP-Port er reagieren soll. Das ist 
wichtig, das TCP nach dem Portprinzip arbeitet. Von diesen Port wird 
meistens auch das Protokoll abgeleitet, wie in deinem Fall HTTP für 
Webserver.
Du müsstest in diesem Fall also erst mal festlegen auf welchen TCP-Port 
er Verbindungen annehmen soll. Und dann kannst du abfragen ob auf diesen 
Port eine neue Verbindung eingegangen ist und diese dann ensprechend 
bearbeiten.

CA Dirk

von Johannes (Gast)


Lesenswert?

Danke für eure Zeit.

Die erste Initialisierung habe ich da jetzt nicht hingeschrieben, aber 
sie sieht genauso aus, wie der Code beim Neueinrichen, also wie bei case 
SOCK_CLOSED:
1
socket(ch,Sn_MR_TCP,80,0x00);
2
listen(ch);
Also: TCP, Port 80, listen

Und diese Errata bezieht sich anscheinend nur auf UDP.

von Johannes (Gast)


Lesenswert?

Ich bin nochmal alle Registerbeschreibungen durchgegangen. Im 
Socket-Mode-Register habe ich dann noch ein Bit gesetzt, was "Use No 
Delayed ACK" heißt. Jetzt habe ich schon mal zwei bis drei 
Drei-Wege-Handshakes und erst danach die RSTs.

Vielleicht machten aber auch andere Tasks in diesem OS Ärger. Kann es 
sein, dass der Wiznet einfach ein RST zurückschickt, wenn die Daten nach 
x ms nicht aus dem RX-Buffer gelesen wurden?

von AVRHacker (Gast)


Lesenswert?

Hi,
ich hab ein ähnliches Problem,
bei mir werden Daten zum Easy-TCP/IP-Server gesendet, und die kommen 
auch zu 70% an. Aber ab und zu geht das Wiznet-Teil gleich in 
Close_Wait-Stellung wenn das Paket reinkommt. Ich hab auch die 
Vermutung, dass man in einer bestimmten Zeit den Buffer auslesen muss. 
Sonst bricht das Wiznet die Verbindung ab.
Hast du vielleicht diesbezüglich etwas herausgefunden?

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.