diff options
| author | wdenk <wdenk> | 2002-08-17 09:36:01 +0000 | 
|---|---|---|
| committer | wdenk <wdenk> | 2002-08-17 09:36:01 +0000 | 
| commit | affae2bff825c1a8d2cfeaf7b270188d251d39d2 (patch) | |
| tree | e025ca5a84cdcd70cff986e09f89e1aaa360499c /net/rarp.c | |
| parent | cf356ef708390102d493c53d18fd19a5963c6aa9 (diff) | |
| download | olio-uboot-2014.01-affae2bff825c1a8d2cfeaf7b270188d251d39d2.tar.xz olio-uboot-2014.01-affae2bff825c1a8d2cfeaf7b270188d251d39d2.zip | |
Initial revision
Diffstat (limited to 'net/rarp.c')
| -rw-r--r-- | net/rarp.c | 106 | 
1 files changed, 106 insertions, 0 deletions
| diff --git a/net/rarp.c b/net/rarp.c new file mode 100644 index 000000000..279e650fc --- /dev/null +++ b/net/rarp.c @@ -0,0 +1,106 @@ +/* + * (C) Copyright 2000-2002 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <command.h> +#include <net.h> +#include "bootp.h" +#include "rarp.h" +#include "tftp.h" + +#if (CONFIG_COMMANDS & CFG_CMD_NET) + +#define TIMEOUT		5		/* Seconds before trying BOOTP again */ +#ifndef	CONFIG_NET_RETRY_COUNT +# define TIMEOUT_COUNT	5		/* # of timeouts before giving up  */ +#else +# define TIMEOUT_COUNT  (CONFIG_NET_RETRY_COUNT) +#endif + + +int		RarpTry; + +/* + *	Handle a RARP received packet. + */ +static void +RarpHandler(uchar * dummi0, unsigned dummi1, unsigned dummi2, unsigned dummi3) +{ +#ifdef	DEBUG +	printf("Got good RARP\n"); +#endif +	TftpStart (); +} + + +/* + *	Timeout on BOOTP request. + */ +static void +RarpTimeout(void) +{ +	if (RarpTry >= TIMEOUT_COUNT) { +		puts ("\nRetry count exceeded; starting again\n"); +		NetStartAgain (); +	} else { +		NetSetTimeout (TIMEOUT * CFG_HZ, RarpTimeout); +		RarpRequest (); +	} +} + + +void +RarpRequest (void) +{ +	int i; +	volatile uchar *pkt; +	ARP_t *	rarp; + +	printf("RARP broadcast %d\n", ++RarpTry); +	pkt = NetTxPacket; + +	NetSetEther(pkt, NetBcastAddr, PROT_RARP); +	pkt += ETHER_HDR_SIZE; + +	rarp = (ARP_t *)pkt; + +	rarp->ar_hrd = ARP_ETHER; +	rarp->ar_pro = PROT_IP; +	rarp->ar_hln = 6; +	rarp->ar_pln = 4; +	rarp->ar_op  = RARPOP_REQUEST; +	memcpy (&rarp->ar_data[0],  NetOurEther, 6);	/* source ET addr */ +	memcpy (&rarp->ar_data[6],  &NetOurIP,   4);	/* source IP addr */ +	memcpy (&rarp->ar_data[10], NetOurEther, 6);	/* dest ET addr = source ET addr ??*/ +	/* dest. IP addr set to broadcast */ +	for (i = 0; i <= 3; i++) { +		rarp->ar_data[16 + i] = 0xff; +	} + +	NetSendPacket(NetTxPacket, ETHER_HDR_SIZE + ARP_HDR_SIZE); + +	NetSetTimeout(TIMEOUT * CFG_HZ, RarpTimeout); +	NetSetHandler(RarpHandler); +} + +#endif /* CFG_CMD_NET */ |