diff options
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 ();  } |