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>
master
Joe Hershberger 12 years ago
parent a36b12f95a
commit 8b9c53221f
  1. 27
      net/net.c
  2. 51
      net/rarp.c
  3. 7
      net/rarp.h

@ -82,9 +82,7 @@
#include "arp.h"
#include "bootp.h"
#include "tftp.h"
#ifdef CONFIG_CMD_RARP
#include "rarp.h"
#endif
#include "nfs.h"
#ifdef CONFIG_STATUS_LED
#include <status_led.h>
@ -853,9 +851,6 @@ NetReceive(uchar *inpkt, int len)
{
Ethernet_t *et;
IP_t *ip;
#ifdef CONFIG_CMD_RARP
ARP_t *arp;
#endif
IPaddr_t tmp;
IPaddr_t src_ip;
int x;
@ -960,27 +955,7 @@ NetReceive(uchar *inpkt, int len)
#ifdef CONFIG_CMD_RARP
case PROT_RARP:
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);
(*packetHandler)(0, 0, 0, 0, 0);
}
rarp_receive(ip, len);
break;
#endif
case PROT_IP:

@ -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);
}

@ -21,14 +21,12 @@
* MA 02111-1307 USA
*/
#if defined(CONFIG_CMD_RARP)
#ifndef __RARP_H__
#define __RARP_H__
#ifndef __NET_H__
#include <net.h>
#endif /* __NET_H__ */
/**********************************************************************/
/*
@ -37,8 +35,11 @@
extern int RarpTry;
/* Process the receipt of a RARP packet */
extern void rarp_receive(IP_t *ip, unsigned len);
extern void RarpRequest(void); /* Send a RARP request */
/**********************************************************************/
#endif /* __RARP_H__ */
#endif

Loading…
Cancel
Save