From 3f85ce27858c44ee75d3650a53154ebcec0e24f2 Mon Sep 17 00:00:00 2001 From: wdenk Date: Mon, 23 Feb 2004 16:11:30 +0000 Subject: * CVS add missing files * Cleanup compiler warnings * Fix problem with side effects in macros in include/usb.h * Patch by David Benson, 13 Nov 2003: bug 841358 - fix TFTP download size limit * Fixing bug 850768: improper flush_cache() in load_serial() * Fixing bug 834943: MPC8540 - missing volatile declarations * Patch by Stephen Williams, 09 Feb 2004: Add support for Xilinx SystemACE chip: - New files common/cmd_ace.c and include/systemace.h - Hook systemace support into cmd_fat and the partition manager * Patch by Travis Sawyer, 09 Feb 2004: Add bi_opbfreq & bi_iic_fast to 440GX bd_info as needed for Linux --- net/tftp.c | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) (limited to 'net') diff --git a/net/tftp.c b/net/tftp.c index d1a30d6643..3ba15ab625 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -38,15 +38,21 @@ static int TftpServerPort; /* The UDP port at their end */ static int TftpOurPort; /* The UDP port at our end */ static int TftpTimeoutCount; -static unsigned TftpBlock; -static unsigned TftpLastBlock; +static ulong TftpBlock; /* packet sequence number */ +static ulong TftpLastBlock; /* last packet sequence number received */ +static ulong TftpBlockWrap; /* count of sequence number wraparounds */ +static ulong TftpBlockWrapOffset; /* memory offset due to wrapping */ static int TftpState; + #define STATE_RRQ 1 #define STATE_DATA 2 #define STATE_TOO_LARGE 3 #define STATE_BAD_MAGIC 4 #define STATE_OACK 5 +#define TFTP_BLOCK_SIZE 512 /* default TFTP block size */ +#define TFTP_SEQUENCE_SIZE ((ulong)(1<<16)) /* sequence number is 16 bit */ + #define DEFAULT_NAME_LEN (8 + 4 + 1) static char default_filename[DEFAULT_NAME_LEN]; static char *tftp_filename; @@ -58,7 +64,8 @@ extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; static __inline__ void store_block (unsigned block, uchar * src, unsigned len) { - ulong offset = block * 512, newsize = offset + len; + ulong offset = block * TFTP_BLOCK_SIZE + TftpBlockWrapOffset; + ulong newsize = offset + len; #ifdef CFG_DIRECT_FLASH_TFTP int i, rc = 0; @@ -196,10 +203,23 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len) return; len -= 2; TftpBlock = ntohs(*(ushort *)pkt); - if (((TftpBlock - 1) % 10) == 0) { - putc ('#'); - } else if ((TftpBlock % (10 * HASHES_PER_LINE)) == 0) { - puts ("\n\t "); + + /* + * 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 += TFTP_BLOCK_SIZE * TFTP_SEQUENCE_SIZE; + printf ("\n\t %lu MB reveived\n\t ", TftpBlockWrapOffset>>20); + } else { + if (((TftpBlock - 1) % 10) == 0) { + putc ('#'); + } else if ((TftpBlock % (10 * HASHES_PER_LINE)) == 0) { + puts ("\n\t "); + } } #ifdef ET_DEBUG @@ -209,13 +229,16 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len) #endif if (TftpState == STATE_RRQ || TftpState == STATE_OACK) { + /* first block received */ TftpState = STATE_DATA; TftpServerPort = src; TftpLastBlock = 0; + TftpBlockWrap = 0; + TftpBlockWrapOffset = 0; if (TftpBlock != 1) { /* Assertion */ printf ("\nTFTP error: " - "First block is not block 1 (%d)\n" + "First block is not block 1 (%ld)\n" "Starting again\n\n", TftpBlock); NetStartAgain (); @@ -241,7 +264,7 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len) */ TftpSend (); - if (len < 512) { + if (len < TFTP_BLOCK_SIZE) { /* * We received the whole thing. Try to * run it. -- cgit v1.2.1