diff options
Diffstat (limited to 'net/tftp.c')
| -rw-r--r-- | net/tftp.c | 45 | 
1 files changed, 35 insertions, 10 deletions
| diff --git a/net/tftp.c b/net/tftp.c index 64a557666..eca21d294 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -58,7 +58,7 @@ static char default_filename[DEFAULT_NAME_LEN];  static char *tftp_filename;  #ifdef CFG_DIRECT_FLASH_TFTP -extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; +extern flash_info_t flash_info[];  #endif  static __inline__ void @@ -78,7 +78,7 @@ store_block (unsigned block, uchar * src, unsigned len)  	}  	if (rc) { /* Flash is destination for this packet */ -		rc = flash_write ((uchar *)src, (ulong)(load_addr+offset), len); +		rc = flash_write ((char *)src, (ulong)(load_addr+offset), len);  		if (rc) {  			flash_perror (rc);  			NetState = NETLOOP_FAIL; @@ -106,6 +106,7 @@ TftpSend (void)  	volatile uchar *	pkt;  	volatile uchar *	xp;  	int			len = 0; +	volatile ushort *s;  	/*  	 *	We will always be sending some sort of packet, so @@ -117,7 +118,9 @@ TftpSend (void)  	case STATE_RRQ:  		xp = pkt; -		*((ushort *)pkt)++ = htons(TFTP_RRQ); +		s = (ushort *)pkt; +		*s++ = htons(TFTP_RRQ); +		pkt = (uchar *)s;  		strcpy ((char *)pkt, tftp_filename);  		pkt += strlen(tftp_filename) + 1;  		strcpy ((char *)pkt, "octet"); @@ -135,15 +138,19 @@ TftpSend (void)  	case STATE_DATA:  	case STATE_OACK:  		xp = pkt; -		*((ushort *)pkt)++ = htons(TFTP_ACK); -		*((ushort *)pkt)++ = htons(TftpBlock); +		s = (ushort *)pkt; +		*s++ = htons(TFTP_ACK); +		*s++ = htons(TftpBlock); +		pkt = (uchar *)s;  		len = pkt - xp;  		break;  	case STATE_TOO_LARGE:  		xp = pkt; -		*((ushort *)pkt)++ = htons(TFTP_ERROR); -		*((ushort *)pkt)++ = htons(3); +		s = (ushort *)pkt; +		*s++ = htons(TFTP_ERROR); +		*s++ = htons(3); +		pkt = (uchar *)s;  		strcpy ((char *)pkt, "File too large");  		pkt += 14 /*strlen("File too large")*/ + 1;  		len = pkt - xp; @@ -151,8 +158,10 @@ TftpSend (void)  	case STATE_BAD_MAGIC:  		xp = pkt; -		*((ushort *)pkt)++ = htons(TFTP_ERROR); -		*((ushort *)pkt)++ = htons(2); +		s = (ushort *)pkt; +		*s++ = htons(TFTP_ERROR); +		*s++ = htons(2); +		pkt = (uchar *)s;  		strcpy ((char *)pkt, "File has bad magic");  		pkt += 18 /*strlen("File has bad magic")*/ + 1;  		len = pkt - xp; @@ -167,6 +176,7 @@ static void  TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  {  	ushort proto; +	ushort *s;  	if (dest != TftpOurPort) {  		return; @@ -180,7 +190,9 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)  	}  	len -= 2;  	/* warning: don't use increment (++) in ntohs() macros!! */ -	proto = *((ushort *)pkt)++; +	s = (ushort *)pkt; +	proto = *s++; +	pkt = (uchar *)s;  	switch (ntohs(proto)) {  	case TFTP_RRQ: @@ -301,6 +313,10 @@ TftpTimeout (void)  void  TftpStart (void)  { +#ifdef CONFIG_TFTP_PORT +	char *ep;             /* Environment pointer */ +#endif +  	if (BootFile[0] == '\0') {  		sprintf(default_filename, "%02lX%02lX%02lX%02lX.img",  			NetOurIP & 0xFF, @@ -352,7 +368,16 @@ TftpStart (void)  	TftpServerPort = WELL_KNOWN_PORT;  	TftpTimeoutCount = 0;  	TftpState = STATE_RRQ; +	/* Use a pseudo-random port unless a specific port is set */  	TftpOurPort = 1024 + (get_timer(0) % 3072); +#ifdef CONFIG_TFTP_PORT +	if ((ep = getenv("tftpdstp")) != NULL) { +		TftpServerPort = simple_strtol(ep, NULL, 10); +	} +	if ((ep = getenv("tftpsrcp")) != NULL) { +		TftpOurPort= simple_strtol(ep, NULL, 10); +	} +#endif  	TftpBlock = 0;  	/* zero out server ether in case the server ip has changed */ |