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 | u-boot-imx-8b9c53221f6ce30ad132e3202e6d445bc21ed8aa.zip u-boot-imx-8b9c53221f6ce30ad132e3202e6d445bc21ed8aa.tar.gz u-boot-imx-8b9c53221f6ce30ad132e3202e6d445bc21ed8aa.tar.bz2 |
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
@@ -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); } |