|
|
|
@ -10,15 +10,18 @@ |
|
|
|
|
#include "tftp.h" |
|
|
|
|
#include "bootp.h" |
|
|
|
|
|
|
|
|
|
#define WELL_KNOWN_PORT 69 /* Well known TFTP port # */ |
|
|
|
|
#define TIMEOUT 5000UL /* Millisecs to timeout for lost pkt */ |
|
|
|
|
/* Well known TFTP port # */ |
|
|
|
|
#define WELL_KNOWN_PORT 69 |
|
|
|
|
/* Millisecs to timeout for lost pkt */ |
|
|
|
|
#define TIMEOUT 5000UL |
|
|
|
|
#ifndef CONFIG_NET_RETRY_COUNT |
|
|
|
|
# define TIMEOUT_COUNT 10 /* # of timeouts before giving up */ |
|
|
|
|
/* # of timeouts before giving up */ |
|
|
|
|
# define TIMEOUT_COUNT 10 |
|
|
|
|
#else |
|
|
|
|
# define TIMEOUT_COUNT (CONFIG_NET_RETRY_COUNT * 2) |
|
|
|
|
#endif |
|
|
|
|
/* (for checking the image size) */ |
|
|
|
|
#define HASHES_PER_LINE 65 /* Number of "loading" hashes per line */ |
|
|
|
|
/* Number of "loading" hashes per line (for checking the image size) */ |
|
|
|
|
#define HASHES_PER_LINE 65 |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* TFTP operations. |
|
|
|
@ -56,17 +59,25 @@ enum { |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static IPaddr_t TftpServerIP; |
|
|
|
|
static int TftpServerPort; /* The UDP port at their end */ |
|
|
|
|
static int TftpOurPort; /* The UDP port at our end */ |
|
|
|
|
/* The UDP port at their end */ |
|
|
|
|
static int TftpServerPort; |
|
|
|
|
/* The UDP port at our end */ |
|
|
|
|
static int TftpOurPort; |
|
|
|
|
static int TftpTimeoutCount; |
|
|
|
|
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 */ |
|
|
|
|
/* packet sequence number */ |
|
|
|
|
static ulong TftpBlock; |
|
|
|
|
/* last packet sequence number received */ |
|
|
|
|
static ulong TftpLastBlock; |
|
|
|
|
/* count of sequence number wraparounds */ |
|
|
|
|
static ulong TftpBlockWrap; |
|
|
|
|
/* memory offset due to wrapping */ |
|
|
|
|
static ulong TftpBlockWrapOffset; |
|
|
|
|
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 */ |
|
|
|
|
/* The file size reported by the server */ |
|
|
|
|
static int TftpTsize; |
|
|
|
|
/* The number of hashes we printed */ |
|
|
|
|
static short TftpNumchars; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#define STATE_RRQ 1 |
|
|
|
@ -75,8 +86,10 @@ static short TftpNumchars; /* The number of hashes we printed */ |
|
|
|
|
#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 */ |
|
|
|
|
/* default TFTP block size */ |
|
|
|
|
#define TFTP_BLOCK_SIZE 512 |
|
|
|
|
/* sequence number is 16 bit */ |
|
|
|
|
#define TFTP_SEQUENCE_SIZE ((ulong)(1<<16)) |
|
|
|
|
|
|
|
|
|
#define DEFAULT_NAME_LEN (8 + 4 + 1) |
|
|
|
|
static char default_filename[DEFAULT_NAME_LEN]; |
|
|
|
@ -273,7 +286,8 @@ TftpSend (void) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
NetSendUDPPacket(NetServerEther, TftpServerIP, TftpServerPort, TftpOurPort, len); |
|
|
|
|
NetSendUDPPacket(NetServerEther, TftpServerIP, TftpServerPort, |
|
|
|
|
TftpOurPort, len); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -333,7 +347,8 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, |
|
|
|
|
} |
|
|
|
|
#ifdef CONFIG_TFTP_TSIZE |
|
|
|
|
if (strcmp ((char*)pkt+i,"tsize") == 0) { |
|
|
|
|
TftpTsize = simple_strtoul((char*)pkt+i+6,NULL,10); |
|
|
|
|
TftpTsize = simple_strtoul((char*)pkt+i+6, |
|
|
|
|
NULL, 10); |
|
|
|
|
debug("size = %s, %d\n", |
|
|
|
|
(char*)pkt+i+6, TftpTsize); |
|
|
|
|
} |
|
|
|
@ -361,12 +376,15 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, |
|
|
|
|
*/ |
|
|
|
|
if (TftpBlock == 0) { |
|
|
|
|
TftpBlockWrap++; |
|
|
|
|
TftpBlockWrapOffset += TftpBlkSize * TFTP_SEQUENCE_SIZE; |
|
|
|
|
printf ("\n\t %lu MB received\n\t ", TftpBlockWrapOffset>>20); |
|
|
|
|
TftpBlockWrapOffset += |
|
|
|
|
TftpBlkSize * TFTP_SEQUENCE_SIZE; |
|
|
|
|
printf ("\n\t %lu MB received\n\t ", |
|
|
|
|
TftpBlockWrapOffset>>20); |
|
|
|
|
} |
|
|
|
|
#ifdef CONFIG_TFTP_TSIZE |
|
|
|
|
else if (TftpTsize) { |
|
|
|
|
while (TftpNumchars < NetBootFileXferSize * 50 / TftpTsize) { |
|
|
|
|
while (TftpNumchars < |
|
|
|
|
NetBootFileXferSize * 50 / TftpTsize) { |
|
|
|
|
putc('#'); |
|
|
|
|
TftpNumchars++; |
|
|
|
|
} |
|
|
|
@ -466,7 +484,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, |
|
|
|
|
* run it. |
|
|
|
|
*/ |
|
|
|
|
#ifdef CONFIG_TFTP_TSIZE |
|
|
|
|
/* Print out the hash marks for the last packet received */ |
|
|
|
|
/* Print hash marks for the last packet received */ |
|
|
|
|
while (TftpTsize && TftpNumchars < 49) { |
|
|
|
|
putc('#'); |
|
|
|
|
TftpNumchars++; |
|
|
|
|