diff options
Diffstat (limited to 'net/tftp.c')
| -rw-r--r-- | net/tftp.c | 32 | 
1 files changed, 29 insertions, 3 deletions
| diff --git a/net/tftp.c b/net/tftp.c index 090aa945f..a02463b00 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -45,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		*/ @@ -470,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;  	}  } |