diff options
| author | Robin Getz <rgetz@blackfin.uclinux.org> | 2009-08-20 10:50:20 -0400 | 
|---|---|---|
| committer | Ben Warren <biggerbadderben@gmail.com> | 2009-08-25 13:35:54 -0700 | 
| commit | 4fccb818e7ee1190602e79aa5729a23bc349bf0c (patch) | |
| tree | a7fff9df422622f8b3834a99719e1f85fa799c9a /net/tftp.c | |
| parent | 488feef85229c08cd3aa1fa183bc8f483d2ae832 (diff) | |
| download | olio-uboot-2014.01-4fccb818e7ee1190602e79aa5729a23bc349bf0c.tar.xz olio-uboot-2014.01-4fccb818e7ee1190602e79aa5729a23bc349bf0c.zip | |
Add Transfer Size Option to tftp
Optionally add RFC 2349 "Transfer Size Option", so we can minimize the
time spent sending data over the UART (now print a single line during a
tftp transfer).
 - If turned on (CONFIG_TFTP_TSIZE), U-Boot asks for the size of the file.
 - if receives the file size, a single line (50 chars) are printed.
     one hash mark == 2% of the file downloaded.
 - if it doesn't receive the file size (the server doesn't support RFC
     2349, prints standard hash marks (one mark for each UDP frame).
Signed-off-by: Robin Getz <rgetz@blackfin.uclinux.org>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
Diffstat (limited to 'net/tftp.c')
| -rw-r--r-- | net/tftp.c | 38 | 
1 files changed, 36 insertions, 2 deletions
| diff --git a/net/tftp.c b/net/tftp.c index 0fd6c6560..cc60a3bd1 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -56,6 +56,10 @@ 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; +#ifdef CONFIG_TFTP_TSIZE +static int	TftpTsize;		/* The file size reported by the server */ +static short	TftpNumchars;		/* The number of hashes we printed      */ +#endif  #define STATE_RRQ	1  #define STATE_DATA	2 @@ -202,6 +206,10 @@ TftpSend (void)  		sprintf((char *)pkt, "%lu", TIMEOUT / 1000);  		debug("send option \"timeout %s\"\n", (char *)pkt);  		pkt += strlen((char *)pkt) + 1; +#ifdef CONFIG_TFTP_TSIZE +		memcpy((char *)pkt, "tsize\0000\0", 8); +		pkt += 8; +#endif  		/* try for more effic. blk size */  		pkt += sprintf((char *)pkt,"blksize%c%d%c",  				0,TftpBlkSizeOption,0); @@ -313,8 +321,14 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  					simple_strtoul((char*)pkt+i+8,NULL,10);  				debug("Blocksize ack: %s, %d\n",  					(char*)pkt+i+8,TftpBlkSize); -				break;  			} +#ifdef CONFIG_TFTP_TSIZE +			if (strcmp ((char*)pkt+i,"tsize") == 0) { +				TftpTsize = simple_strtoul((char*)pkt+i+6,NULL,10); +				debug("size = %s, %d\n", +					 (char*)pkt+i+6, TftpTsize); +			} +#endif  		}  #ifdef CONFIG_MCAST_TFTP  		parse_multicast_oack((char *)pkt,len-1); @@ -340,7 +354,16 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  			TftpBlockWrap++;  			TftpBlockWrapOffset += TftpBlkSize * TFTP_SEQUENCE_SIZE;  			printf ("\n\t %lu MB received\n\t ", TftpBlockWrapOffset>>20); -		} else { +		} +#ifdef CONFIG_TFTP_TSIZE +		else if (TftpTsize) { +			while (TftpNumchars < NetBootFileXferSize * 50 / TftpTsize) { +				putc('#'); +				TftpNumchars++; +			} +		} +#endif +		else {  			if (((TftpBlock - 1) % 10) == 0) {  				putc ('#');  			} else if ((TftpBlock % (10 * HASHES_PER_LINE)) == 0) { @@ -434,6 +457,13 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  			 *	We received the whole thing.  Try to  			 *	run it.  			 */ +#ifdef CONFIG_TFTP_TSIZE +			/* Print out the hash marks for the last packet received */ +			while (TftpTsize && TftpNumchars < 49) { +				putc('#'); +				TftpNumchars++; +			} +#endif  			puts ("\ndone\n");  			NetState = NETLOOP_SUCCESS;  		} @@ -563,6 +593,10 @@ TftpStart (void)  #ifdef CONFIG_MCAST_TFTP  	mcast_cleanup();  #endif +#ifdef CONFIG_TFTP_TSIZE +	TftpTsize = 0; +	TftpNumchars = 0; +#endif  	TftpSend ();  } |