|
@@ -190,6 +190,17 @@ store_block(unsigned block, uchar *src, unsigned len)
|
|
NetBootFileXferSize = newsize;
|
|
NetBootFileXferSize = newsize;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* Clear our state ready for a new transfer */
|
|
|
|
+void new_transfer(void)
|
|
|
|
+{
|
|
|
|
+ TftpLastBlock = 0;
|
|
|
|
+ TftpBlockWrap = 0;
|
|
|
|
+ TftpBlockWrapOffset = 0;
|
|
|
|
+#ifdef CONFIG_CMD_TFTPPUT
|
|
|
|
+ TftpFinalBlock = 0;
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
+
|
|
static void TftpSend(void);
|
|
static void TftpSend(void);
|
|
static void TftpTimeout(void);
|
|
static void TftpTimeout(void);
|
|
|
|
|
|
@@ -215,6 +226,42 @@ static void show_block_marker(void)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * restart the current transfer due to an error
|
|
|
|
+ *
|
|
|
|
+ * @param msg Message to print for user
|
|
|
|
+ */
|
|
|
|
+static void restart(const char *msg)
|
|
|
|
+{
|
|
|
|
+ printf("\n%s; starting again\n", msg);
|
|
|
|
+#ifdef CONFIG_MCAST_TFTP
|
|
|
|
+ mcast_cleanup();
|
|
|
|
+#endif
|
|
|
|
+ NetStartAgain();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Check if the block number has wrapped, and update progress
|
|
|
|
+ *
|
|
|
|
+ * TODO: The egregious use of global variables in this file should be tidied.
|
|
|
|
+ */
|
|
|
|
+static void update_block_number(void)
|
|
|
|
+{
|
|
|
|
+ /*
|
|
|
|
+ * RFC1350 specifies that the first data packet will
|
|
|
|
+ * have sequence number 1. If we receive a sequence
|
|
|
|
+ * number of 0 this means that there was a wrap
|
|
|
|
+ * around of the (16 bit) counter.
|
|
|
|
+ */
|
|
|
|
+ if (TftpBlock == 0) {
|
|
|
|
+ TftpBlockWrap++;
|
|
|
|
+ TftpBlockWrapOffset += TftpBlkSize * TFTP_SEQUENCE_SIZE;
|
|
|
|
+ TftpTimeoutCount = 0; /* we've done well, reset thhe timeout */
|
|
|
|
+ } else {
|
|
|
|
+ show_block_marker();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
/* The TFTP get or put is complete */
|
|
/* The TFTP get or put is complete */
|
|
static void tftp_complete(void)
|
|
static void tftp_complete(void)
|
|
{
|
|
{
|
|
@@ -373,9 +420,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
|
TftpRemoteIP = sip;
|
|
TftpRemoteIP = sip;
|
|
TftpRemotePort = src;
|
|
TftpRemotePort = src;
|
|
TftpOurPort = 1024 + (get_timer(0) % 3072);
|
|
TftpOurPort = 1024 + (get_timer(0) % 3072);
|
|
- TftpLastBlock = 0;
|
|
|
|
- TftpBlockWrap = 0;
|
|
|
|
- TftpBlockWrapOffset = 0;
|
|
|
|
|
|
+ new_transfer();
|
|
TftpSend(); /* Send ACK(0) */
|
|
TftpSend(); /* Send ACK(0) */
|
|
break;
|
|
break;
|
|
#endif
|
|
#endif
|
|
@@ -422,21 +467,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
|
len -= 2;
|
|
len -= 2;
|
|
TftpBlock = ntohs(*(ushort *)pkt);
|
|
TftpBlock = ntohs(*(ushort *)pkt);
|
|
|
|
|
|
- /*
|
|
|
|
- * RFC1350 specifies that the first data packet will
|
|
|
|
- * have sequence number 1. If we receive a sequence
|
|
|
|
- * number of 0 this means that there was a wrap
|
|
|
|
- * around of the (16 bit) counter.
|
|
|
|
- */
|
|
|
|
- if (TftpBlock == 0) {
|
|
|
|
- TftpBlockWrap++;
|
|
|
|
- TftpBlockWrapOffset +=
|
|
|
|
- TftpBlkSize * TFTP_SEQUENCE_SIZE;
|
|
|
|
- printf("\n\t %lu MB received\n\t ",
|
|
|
|
- TftpBlockWrapOffset>>20);
|
|
|
|
- } else {
|
|
|
|
- show_block_marker();
|
|
|
|
- }
|
|
|
|
|
|
+ update_block_number();
|
|
|
|
|
|
if (TftpState == STATE_SEND_RRQ)
|
|
if (TftpState == STATE_SEND_RRQ)
|
|
debug("Server did not acknowledge timeout option!\n");
|
|
debug("Server did not acknowledge timeout option!\n");
|
|
@@ -446,9 +477,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
|
/* first block received */
|
|
/* first block received */
|
|
TftpState = STATE_DATA;
|
|
TftpState = STATE_DATA;
|
|
TftpRemotePort = src;
|
|
TftpRemotePort = src;
|
|
- TftpLastBlock = 0;
|
|
|
|
- TftpBlockWrap = 0;
|
|
|
|
- TftpBlockWrapOffset = 0;
|
|
|
|
|
|
+ new_transfer();
|
|
|
|
|
|
#ifdef CONFIG_MCAST_TFTP
|
|
#ifdef CONFIG_MCAST_TFTP
|
|
if (Multicast) { /* start!=1 common if mcast */
|
|
if (Multicast) { /* start!=1 common if mcast */
|
|
@@ -556,11 +585,7 @@ static void
|
|
TftpTimeout(void)
|
|
TftpTimeout(void)
|
|
{
|
|
{
|
|
if (++TftpTimeoutCount > TftpTimeoutCountMax) {
|
|
if (++TftpTimeoutCount > TftpTimeoutCountMax) {
|
|
- puts("\nRetry count exceeded; starting again\n");
|
|
|
|
-#ifdef CONFIG_MCAST_TFTP
|
|
|
|
- mcast_cleanup();
|
|
|
|
-#endif
|
|
|
|
- NetStartAgain();
|
|
|
|
|
|
+ restart("Retry count exceeded");
|
|
} else {
|
|
} else {
|
|
puts("T ");
|
|
puts("T ");
|
|
NetSetTimeout(TftpTimeoutMSecs, TftpTimeout);
|
|
NetSetTimeout(TftpTimeoutMSecs, TftpTimeout);
|