diff options
Diffstat (limited to 'net/tftp.c')
| -rw-r--r-- | net/tftp.c | 36 | 
1 files changed, 29 insertions, 7 deletions
| diff --git a/net/tftp.c b/net/tftp.c index cc60a3bd1..a02463b00 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -10,8 +10,6 @@  #include "tftp.h"  #include "bootp.h" -#if defined(CONFIG_CMD_NET) -  #define WELL_KNOWN_PORT	69		/* Well known TFTP port #		*/  #define TIMEOUT		5000UL		/* Millisecs to timeout for lost pkt */  #ifndef	CONFIG_NET_RETRY_COUNT @@ -47,6 +45,16 @@ static int TftpTimeoutCountMax = TIMEOUT_COUNT;  ulong TftpRRQTimeoutMSecs = TIMEOUT;  int TftpRRQTimeoutCountMax = TIMEOUT_COUNT; +enum { +	TFTP_ERR_UNDEFINED           = 0, +	TFTP_ERR_FILE_NOT_FOUND      = 1, +	TFTP_ERR_ACCESS_DENIED       = 2, +	TFTP_ERR_DISK_FULL           = 3, +	TFTP_ERR_UNEXPECTED_OPCODE   = 4, +	TFTP_ERR_UNKNOWN_TRANSFER_ID  = 5, +	TFTP_ERR_FILE_ALREADY_EXISTS = 6, +}; +  static IPaddr_t TftpServerIP;  static int	TftpServerPort;		/* The UDP port at their end		*/  static int	TftpOurPort;		/* The UDP port at our end		*/ @@ -472,11 +480,27 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  	case TFTP_ERROR:  		printf ("\nTFTP error: '%s' (%d)\n",  					pkt + 2, ntohs(*(ushort *)pkt)); -		puts ("Starting again\n\n"); + +		switch (ntohs(*(ushort *)pkt)) { +		case TFTP_ERR_FILE_NOT_FOUND: +		case TFTP_ERR_ACCESS_DENIED: +			puts("Not retrying...\n"); +			eth_halt(); +			NetState = NETLOOP_FAIL; +			break; +		case TFTP_ERR_UNDEFINED: +		case TFTP_ERR_DISK_FULL: +		case TFTP_ERR_UNEXPECTED_OPCODE: +		case TFTP_ERR_UNKNOWN_TRANSFER_ID: +		case TFTP_ERR_FILE_ALREADY_EXISTS: +		default: +			puts("Starting again\n\n");  #ifdef CONFIG_MCAST_TFTP -		mcast_cleanup(); +			mcast_cleanup();  #endif -		NetStartAgain (); +			NetStartAgain(); +			break; +		}  		break;  	}  } @@ -690,5 +714,3 @@ static void parse_multicast_oack(char *pkt, int len)  }  #endif /* Multicast TFTP */ - -#endif |