diff options
| author | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 07:58:03 +0000 | 
|---|---|---|
| committer | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 14:19:24 -0500 | 
| commit | 8b9c53221f6ce30ad132e3202e6d445bc21ed8aa (patch) | |
| tree | 0431dfeaae255e0d10bc15408f6f0c2193f28bc6 /net/rarp.c | |
| parent | a36b12f95a29647a06b5459198684fc142482020 (diff) | |
| download | olio-uboot-2014.01-8b9c53221f6ce30ad132e3202e6d445bc21ed8aa.tar.xz olio-uboot-2014.01-8b9c53221f6ce30ad132e3202e6d445bc21ed8aa.zip | |
net: Move RARP receive logic out of net.c
Separate this functionality out of the net.c behemoth
Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Acked-by: Simon Glass <sjg@chromium.org>
Acked-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'net/rarp.c')
| -rw-r--r-- | net/rarp.c | 51 | 
1 files changed, 32 insertions, 19 deletions
| diff --git a/net/rarp.c b/net/rarp.c index 5a813a290..660a02c57 100644 --- a/net/rarp.c +++ b/net/rarp.c @@ -29,33 +29,50 @@  #include "rarp.h"  #include "tftp.h" -#define TIMEOUT		5000UL	/* Milliseconds before trying BOOTP again */ +#define TIMEOUT 5000UL /* Milliseconds before trying BOOTP again */  #ifndef	CONFIG_NET_RETRY_COUNT -# define TIMEOUT_COUNT	5		/* # of timeouts before giving up  */ +#define TIMEOUT_COUNT 5 /* # of timeouts before giving up  */  #else -# define TIMEOUT_COUNT  (CONFIG_NET_RETRY_COUNT) +#define TIMEOUT_COUNT (CONFIG_NET_RETRY_COUNT)  #endif - -int		RarpTry; +int RarpTry;  /*   *	Handle a RARP received packet.   */ -static void -RarpHandler(uchar *dummi0, unsigned dummi1, IPaddr_t sip, unsigned dummi2, -	    unsigned dummi3) +void rarp_receive(IP_t *ip, unsigned len)  { -	debug("Got good RARP\n"); -	net_auto_load(); +	ARP_t *arp; + +	debug("Got RARP\n"); +	arp = (ARP_t *)ip; +	if (len < ARP_HDR_SIZE) { +		printf("bad length %d < %d\n", len, ARP_HDR_SIZE); +		return; +	} + +	if ((ntohs(arp->ar_op) != RARPOP_REPLY) || +		(ntohs(arp->ar_hrd) != ARP_ETHER)   || +		(ntohs(arp->ar_pro) != PROT_IP)     || +		(arp->ar_hln != 6) || (arp->ar_pln != 4)) { + +		puts("invalid RARP header\n"); +	} else { +		NetCopyIP(&NetOurIP, &arp->ar_data[16]); +		if (NetServerIP == 0) +			NetCopyIP(&NetServerIP, &arp->ar_data[6]); +		memcpy(NetServerEther, &arp->ar_data[0], 6); +		debug("Got good RARP\n"); +		net_auto_load(); +	}  }  /*   *	Timeout on BOOTP request.   */ -static void -RarpTimeout(void) +static void RarpTimeout(void)  {  	if (RarpTry >= TIMEOUT_COUNT) {  		puts("\nRetry count exceeded; starting again\n"); @@ -67,10 +84,8 @@ RarpTimeout(void)  } -void -RarpRequest(void) +void RarpRequest(void)  { -	int i;  	uchar *pkt;  	ARP_t *rarp; @@ -90,12 +105,10 @@ RarpRequest(void)  	memcpy(&rarp->ar_data[6],  &NetOurIP,   4);	/* source IP addr */  	/* dest ET addr = source ET addr ??*/  	memcpy(&rarp->ar_data[10], NetOurEther, 6); -	/* dest. IP addr set to broadcast */ -	for (i = 0; i <= 3; i++) -		rarp->ar_data[16 + i] = 0xff; +	/* dest IP addr set to broadcast */ +	memset(&rarp->ar_data[16], 0xff,        4);  	NetSendPacket(NetTxPacket, (pkt - NetTxPacket) + ARP_HDR_SIZE);  	NetSetTimeout(TIMEOUT, RarpTimeout); -	NetSetHandler(RarpHandler);  } |