Option Acknowledgment (OACK) is an extension of TFTP protocol (see rfc2347).
Not all tftp servers implements it. U-Boot supports two tftp specific
commands:
 * tftpboot works with both types of servers,
 * tftpput waits for OACK from the server, so the data transfer does not
   start if the servers does not support OACK extension.

This patch fix an issue, so tftpput works fine with both types of servers.

Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevets...@iopsys.eu>
---
Changes v2:
 * update patch description
---
 net/tftp.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/net/tftp.c b/net/tftp.c
index 2e335413492..2534dec1c9f 100644
--- a/net/tftp.c
+++ b/net/tftp.c
@@ -494,8 +494,15 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct 
in_addr sip,
                                tftp_prev_block = tftp_cur_block;
                                tftp_cur_block = (unsigned short)(block + 1);
                                update_block_number();
-                               if (ack_ok)
+                               if (ack_ok) {
+                                       if (block == 0 &&
+                                           tftp_state == STATE_SEND_WRQ){
+                                               /* connection's first ACK */
+                                               tftp_state = STATE_DATA;
+                                               tftp_remote_port = src;
+                                       }
                                        tftp_send(); /* Send next data block */
+                               }
                        }
                }
 #endif
-- 
2.39.2

Reply via email to