@ -56,6 +56,10 @@ static ulong TftpLastBlock; /* last packet sequence number received */
static ulong TftpBlockWrap ; /* count of sequence number wraparounds */
static ulong TftpBlockWrap ; /* count of sequence number wraparounds */
static ulong TftpBlockWrapOffset ; /* memory offset due to wrapping */
static ulong TftpBlockWrapOffset ; /* memory offset due to wrapping */
static int TftpState ;
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_RRQ 1
# define STATE_DATA 2
# define STATE_DATA 2
@ -202,6 +206,10 @@ TftpSend (void)
sprintf ( ( char * ) pkt , " %lu " , TIMEOUT / 1000 ) ;
sprintf ( ( char * ) pkt , " %lu " , TIMEOUT / 1000 ) ;
debug ( " send option \" timeout %s \" \n " , ( char * ) pkt ) ;
debug ( " send option \" timeout %s \" \n " , ( char * ) pkt ) ;
pkt + = strlen ( ( char * ) pkt ) + 1 ;
pkt + = strlen ( ( char * ) pkt ) + 1 ;
# ifdef CONFIG_TFTP_TSIZE
memcpy ( ( char * ) pkt , " tsize \000 0 \0 " , 8 ) ;
pkt + = 8 ;
# endif
/* try for more effic. blk size */
/* try for more effic. blk size */
pkt + = sprintf ( ( char * ) pkt , " blksize%c%d%c " ,
pkt + = sprintf ( ( char * ) pkt , " blksize%c%d%c " ,
0 , TftpBlkSizeOption , 0 ) ;
0 , TftpBlkSizeOption , 0 ) ;
@ -313,8 +321,14 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
simple_strtoul ( ( char * ) pkt + i + 8 , NULL , 10 ) ;
simple_strtoul ( ( char * ) pkt + i + 8 , NULL , 10 ) ;
debug ( " Blocksize ack: %s, %d \n " ,
debug ( " Blocksize ack: %s, %d \n " ,
( char * ) pkt + i + 8 , TftpBlkSize ) ;
( 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
# ifdef CONFIG_MCAST_TFTP
parse_multicast_oack ( ( char * ) pkt , len - 1 ) ;
parse_multicast_oack ( ( char * ) pkt , len - 1 ) ;
@ -340,7 +354,16 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
TftpBlockWrap + + ;
TftpBlockWrap + + ;
TftpBlockWrapOffset + = TftpBlkSize * TFTP_SEQUENCE_SIZE ;
TftpBlockWrapOffset + = TftpBlkSize * TFTP_SEQUENCE_SIZE ;
printf ( " \n \t %lu MB received \n \t " , TftpBlockWrapOffset > > 20 ) ;
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 ) {
if ( ( ( TftpBlock - 1 ) % 10 ) = = 0 ) {
putc ( ' # ' ) ;
putc ( ' # ' ) ;
} else if ( ( TftpBlock % ( 10 * HASHES_PER_LINE ) ) = = 0 ) {
} 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
* We received the whole thing . Try to
* run it .
* run it .
*/
*/
# ifdef CONFIG_TFTP_TSIZE
/* Print out the hash marks for the last packet received */
while ( TftpTsize & & TftpNumchars < 49 ) {
putc ( ' # ' ) ;
TftpNumchars + + ;
}
# endif
puts ( " \n done \n " ) ;
puts ( " \n done \n " ) ;
NetState = NETLOOP_SUCCESS ;
NetState = NETLOOP_SUCCESS ;
}
}
@ -563,6 +593,10 @@ TftpStart (void)
# ifdef CONFIG_MCAST_TFTP
# ifdef CONFIG_MCAST_TFTP
mcast_cleanup ( ) ;
mcast_cleanup ( ) ;
# endif
# endif
# ifdef CONFIG_TFTP_TSIZE
TftpTsize = 0 ;
TftpNumchars = 0 ;
# endif
TftpSend ( ) ;
TftpSend ( ) ;
}
}