Add Transfer Size Option to tftp
PATCH 1/1 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).
--- net/tftp.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 40 insertions(+), 2 deletions(-)
net/tftp.c +36 -2
@@ -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 );
@@ -311,8 +319,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 );
@@ -338,7 +352,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 ) {
@@ -432,6 +455,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 ; }
@@ -561,6 +595,10 @@ TftpStart (void)#ifdef CONFIG_MCAST_TFTP mcast_cleanup ();#endif +#ifdef CONFIG_TFTP_TSIZE + TftpTsize =0 ; + TftpNumchars =0 ; +#endif TftpSend (); }
Signature · 1 line
1.6.0.2
Ben Warren
AppliedPATCH 1/1 Add Transfer Size Option to tftp
Quoted 6 lines · Robin Getz
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.
Quoted 9 lines
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 <[email protected]>--- net/tftp.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 40 insertions(+), 2 deletions(-)
Applied to net/next
regards,
Ben