Forum: Mikrocontroller und Digitale Elektronik Wiznet W5500 DHCP Probleme; Frage zu Wireshark


von Hanns-Jürgen M. (yogy)


Lesenswert?

Hallo zusammen,
ich habe nun seit zwei Jahren MC-Systeme mit W5500 Chip laufen, bislang 
alle mit fester IP. Jetzt wollte ich "mal schnell" :-) DHCP testen. 
(Zwei Tage gefummelt..)

Ich benutze WIZNET Routinen. (Bei Github bzw. Wiznet aufrufbar)

Ich erhalte auch vom DHCP-Server eine Adresse,aber wenn ich diese gemäß 
der Wiznet-Routine prüfen will, klappt das nicht:

Nach Erhalt der  Adresse vom Server wird die Routine 
"check_DHCP_LeasedIP aus der Library aufgerufen:
1
S8 check_DHCP_leasedIP(void)
2
{
3
  U8 tmp;
4
  int32_t ret;
5
6
  //WIZchip RCR value changed for ARP Timeout count control
7
  tmp = getRCR();
8
  setRCR(0x03);
9
10
  // bETH_IP conflict detection : ARP request - ARP reply
11
  // Broadcasting ARP Request for check the bETH_IP conflict using UDP sendto() function
12
13
  ret = sendto(DHCP_SOCKET, (U8 *)"CHECK_IP_CONFLICT", 17, DHCP_allocated_ip, 5000);
14
  //sendto(buf,len of buf, zieladr,zielport)
15
  // RCR value restore
16
  setRCR(tmp);
17
  if(ret == SOCKERR_TIMEOUT) {
18
    // UDP send Timeout occurred : allocated IP address is unique, DHCP Success
19
20
#ifdef _DHCP_DEBUG_
21
    printf("\r\n> Check leased IP - OK\r\n");
22
#endif
23
24
    return 1;
25
  } else {
26
    // Received ARP reply or etc : IP address conflict occur, DHCP Failed
27
    send_DHCP_DECLINE();
28
29
    //ret = dhcp_tick_1s;
30
    //while((dhcp_tick_1s - ret) < 2) ;   // wait for 1s over; wait to complete to send DECLINE message;
31
 dhcp_tick_1s = 4;
32
    return 0;
33
  }
34
}

Die Routine prüft also, ob die für mich gedachte IP wirklich unbenutzt 
ist ist, und somit keine Antwort erfolgt, so daß ein Timeout-Error 
erfolgt. Nur dies ist nicht der Fall, die Rückgabe ist nur ein SENT 
complete Interrupt.

sendto-Routine ist Bestandteil von socket.c von Wiznet, hier nur 
verkürzt wiedergegeben:
1
U32 sendto(U8 sn, U8 * buf, U16 len, U8 * addr, U16 wETH_Port)
2
{
3
  U8 tmp = 0;
4
  U16 freesize = 0;
5
  U32 taddr;
6
.
7
.
8
.
9
.
10
.
11
12
13
  while(1)
14
  {
15
    tmp = getSn_IR(sn); 
16
    
17
    if(tmp & Sn_IR_SENDOK)
18
    {
19
      setSn_IR(sn, Sn_IR_SENDOK);
20
      break;
21
    }
22
    else if(tmp & Sn_IR_TIMEOUT)
23
    {
24
      setSn_IR(sn, Sn_IR_TIMEOUT);
25
      return SOCKERR_TIMEOUT;
26
    }
27
  }
28
  return (U32)len;
29
}

IMHO hat die WIZNET-Library einen Fehler.. Müßte nicht eine bestimmte 
Zeit auf Antwort gewartet werden?

Zweite Frage: Ich habe mir das mit Wireshark angesehen. Die 
Überprüfungs-sendto- Routine, bzw. dessen Datenprotokoll, ist in 
Wireshark nicht zu sehen, obwohl gesendet wird (Send-OK Interrupt Flag)? 
Verschluckt Wireshark
unbekannte UDP- Protokolle?? Kann ich das irgendwie konfigurieren?

von Sebastian (Gast)


Lesenswert?

Hanns-Jürgen M. schrieb:
> Verschluckt Wireshark
> unbekannte UDP- Protokolle?? Kann ich das irgendwie konfigurieren?

Wireshark im Promiscuous-Mode eher nicht. Aber das UDP-Paket wird, wenn 
die IP unbenutzt ist, ja gar nicht selbst gesendet. Was du sehen 
solltest ist eine ARP Anfrage welche MAC die neue IP hat. Das sollte im 
Normalfall keiner sein, also kommt keine Antwort, also wird nach Timeout 
das Senden des UDP-Pakets mit Fehler abgebrochen.

LG, Sebastian

von Hanns-Jürgen M. (yogy)


Angehängte Dateien:

Lesenswert?

Hallo Sebastian, danke für die ausführliche Antwort.

Leider sind meine Netzwerkprotokoll-Kenntnisse eher rudimentär.

Soweit ich weiß, sind UDP Nachrichten verbindungslos. Also müßte IMHO 
die Nachricht ausgesendet werden? Und damit auch zu sehen sein? Wo liegt 
hier mein Verständnisproblem?

Ich hänge mal den (verkürzten) Screenshot von Wireshark an. "Meine" 
vorläufige IP ist 1.2.3.4

Oh, ich sehe gerade, da wird von MAC DE:AD:BE:EF:00:FF ("ich") die 
ARP-Nachricht ausgesendet. Der Router und DHSOD "Genexis" fragt 
daraufhin, ob die IP 192.168.1.43, die er "mir" in Nachricht Nr. 18 
angeboten hat, genutzt wird (?).

Aber: Nach dem Aussenden meiner ARP-Nachricht gibt meine W5500 keine 
Timeout  IRQ-Bit sondern nur ein SEND_OK -IRQ zurück. Zusätztlich  und 
mir unverständlich ist das IRQ-Bit 0 gesetzt. (Bedeutung ist auch im 
Screen Shot)

von Hanns-Jürgen M. (yogy)


Angehängte Dateien:

Lesenswert?

ACHTUNG: Mein vorheriges Posting enthält einen Fehler, reiche Korrektur 
nach

So, der Teil mit den Interrupt-Bits ist falsch, es wird überhaupt kein 
Bit gesetzt. Ich hatte etwas verwechselt.

Aber auch wenn ich nun per UDP / ARP die "CHECK_IP_CONFLICT" Nachricht 
an eine bereits vergebene Adresse sende, ändert sich nichts, es wird 
kein IRQ-Bit gesetzt. Allerdings sehe ich dann (und nur dann) die 
Nachricht in WireShark. (ScreenShot angehängt)

Grübel, Grübel... ein sehr seltsames Verhalten.

: Bearbeitet durch User
von Hanns-Jürgen M. (yogy)


Lesenswert?

So, ich erkläre das Thema als beendet. Ich habe die 
WIZNET-Vorlageroutinen Schritt für Schritt analysiert, um einen Fehler 
zu finden. Ich finde aber keinen. Der W5500 (zumindest ist der Version, 
die ich habe) liefert keinen Timeout-Fehler. Auch ist nichts anderes 
Vergleichbares verwendbar.

Zwei Tage Suche reichen mir, ich werde also die Überprüfung, ob die 
angebotene IP schon verwendet wird, ersatzlos streichen. Bei meinem 
kleinen Netz ist das tolerierbar.

Schönes WE wünscht Yogy

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.