diff packages/net/tcpip/current/src/lib/tftp_server.c @ 112:02ea4320376c ecos-sw-2000-07-21

Merge from eCos master repository on 2000-07-21-21:01:39-BST
author jlarmour
date Fri, 21 Jul 2000 21:34:11 +0000
parents ced4577552cd
children 6ed91473a1cd
line wrap: on
line diff
--- a/packages/net/tcpip/current/src/lib/tftp_server.c
+++ b/packages/net/tcpip/current/src/lib/tftp_server.c
@@ -234,6 +234,7 @@ tftpd_read_file(struct tftp_server *serv
                 ok = false;
                 break;
             }
+        repeat_select:
             timeout.tv_sec = TFTP_TIMEOUT_PERIOD;
             timeout.tv_usec = 0;
             FD_ZERO(&fds);
@@ -243,17 +244,26 @@ tftpd_read_file(struct tftp_server *serv
                     ok = false;
                     break;
                 }
+                continue; // retry the send, using up one retry.
             }
             data_len = sizeof(data_in);
             client_len = sizeof(client_addr);
             if ((data_len = recvfrom(s, data_in, data_len, 0, 
-                                     (struct sockaddr *)&client_addr, &client_len)) < 0) {
-                // What happened?
-                ok = false;
-                break;
+                                     (struct sockaddr *)&client_addr,
+                                     &client_len)) < 0) {
+                // What happened?  Maybe someone lied to us...
+                continue; // retry the send, using up one retry.
+            }
+            if ((ntohs(response->th_opcode) == ACK) &&
+                (ntohs(response->th_block) < block)) {
+                // Then it is a repeat ACK for an old block; listen again,
+                // but do not repeat sending the current block, and do not
+                // use up a retry count.
+                goto repeat_select;
             }
             if ((ntohs(response->th_opcode) == ACK) &&
                 (ntohs(response->th_block) == block)) {
+                // Happy!  Break out of the retries loop.
                 break;
             }
         }