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?