Patchwork [U-Boot,07/28] net: Move PING out of net.c

login
register
mail settings
Submitter Joe Hershberger
Date Jan. 20, 2012, 12:53 a.m.
Message ID <1327020811-1538-8-git-send-email-joe.hershberger@ni.com>
Download mbox | patch
Permalink /patch/136976/
State Superseded
Delegated to: Joe Hershberger
Headers show

Comments

Joe Hershberger - Jan. 20, 2012, 12:53 a.m.
Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Cc: Joe Hershberger <joe.hershberger@gmail.com>
Cc: Wolfgang Denk <wd@denx.de>
---
 include/configs/am3517_crane.h |    2 +-
 include/configs/am3517_evm.h   |    2 +-
 include/configs/origen.h       |    2 +-
 net/Makefile                   |    1 +
 net/net.c                      |  133 ++-----------------------------------
 net/ping.c                     |  143 ++++++++++++++++++++++++++++++++++++++++
 net/ping.h                     |   20 ++++++
 7 files changed, 172 insertions(+), 131 deletions(-)
 create mode 100644 net/ping.c
 create mode 100644 net/ping.h
Simon Glass - Jan. 24, 2012, 5:37 a.m.
Hi Joe,

On Thu, Jan 19, 2012 at 4:53 PM, Joe Hershberger <joe.hershberger@ni.com> wrote:
> Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
> Cc: Joe Hershberger <joe.hershberger@gmail.com>
> Cc: Wolfgang Denk <wd@denx.de>
> ---
>  include/configs/am3517_crane.h |    2 +-
>  include/configs/am3517_evm.h   |    2 +-
>  include/configs/origen.h       |    2 +-

Perhaps move these config changes to another commit?

It would be nice (perhaps later) to remove the camel case.

Regards,
Simon

>  net/Makefile                   |    1 +
>  net/net.c                      |  133 ++-----------------------------------
>  net/ping.c                     |  143 ++++++++++++++++++++++++++++++++++++++++
>  net/ping.h                     |   20 ++++++
>  7 files changed, 172 insertions(+), 131 deletions(-)
>  create mode 100644 net/ping.c
>  create mode 100644 net/ping.h
>
> diff --git a/include/configs/am3517_crane.h b/include/configs/am3517_crane.h
> index 0a0c261..acd4e3f 100644
> --- a/include/configs/am3517_crane.h
> +++ b/include/configs/am3517_crane.h
> @@ -146,7 +146,7 @@
>  #define CONFIG_CMD_MMC         /* MMC support                  */
>  #define CONFIG_CMD_NAND                /* NAND support                 */
>  #define CONFIG_CMD_DHCP
> -#define CONFIG_CMD_PING
> +#undef CONFIG_CMD_PING
>
>  #undef CONFIG_CMD_FLASH                /* flinfo, erase, protect       */
>  #undef CONFIG_CMD_FPGA         /* FPGA configuration Support   */
> diff --git a/include/configs/am3517_evm.h b/include/configs/am3517_evm.h
> index d44eeec..9775107 100644
> --- a/include/configs/am3517_evm.h
> +++ b/include/configs/am3517_evm.h
> @@ -145,7 +145,7 @@
>  #define CONFIG_CMD_MMC         /* MMC support                  */
>  #define CONFIG_CMD_NAND                /* NAND support                 */
>  #define CONFIG_CMD_DHCP
> -#define CONFIG_CMD_PING
> +#undef CONFIG_CMD_PING
>
>  #undef CONFIG_CMD_FLASH                /* flinfo, erase, protect       */
>  #undef CONFIG_CMD_FPGA         /* FPGA configuration Support   */
> diff --git a/include/configs/origen.h b/include/configs/origen.h
> index cd502d1..c9bac30 100644
> --- a/include/configs/origen.h
> +++ b/include/configs/origen.h
> @@ -84,7 +84,7 @@
>  /* Command definition*/
>  #include <config_cmd_default.h>
>
> -#define CONFIG_CMD_PING
> +#undef CONFIG_CMD_PING
>  #define CONFIG_CMD_ELF
>  #define CONFIG_CMD_DHCP
>  #define CONFIG_CMD_MMC
> diff --git a/net/Makefile b/net/Makefile
> index 0916a56..f1c4859 100644
> --- a/net/Makefile
> +++ b/net/Makefile
> @@ -35,6 +35,7 @@ COBJS-$(CONFIG_CMD_NET)  += eth.o
>  COBJS-$(CONFIG_CMD_NET)  += net.o
>  COBJS-$(CONFIG_BOOTP_RANDOM_DELAY) += net_rand.o
>  COBJS-$(CONFIG_CMD_NFS)  += nfs.o
> +COBJS-$(CONFIG_CMD_PING) += ping.o
>  COBJS-$(CONFIG_CMD_RARP) += rarp.o
>  COBJS-$(CONFIG_CMD_SNTP) += sntp.o
>  COBJS-$(CONFIG_CMD_NET)  += tftp.o
> diff --git a/net/net.c b/net/net.c
> index 2dae5a0..c2fbcb5 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -98,6 +98,9 @@
>  #if defined(CONFIG_CMD_DNS)
>  #include "dns.h"
>  #endif
> +#if defined(CONFIG_CMD_PING)
> +#include "ping.h"
> +#endif
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> @@ -168,13 +171,6 @@ ushort             NetOurNativeVLAN = 0xFFFF;
>  /* Boot File name */
>  char           BootFile[128];
>
> -#if defined(CONFIG_CMD_PING)
> -/* the ip address to ping */
> -IPaddr_t       NetPingIP;
> -
> -static void PingStart(void);
> -#endif
> -
>  #if defined(CONFIG_CMD_SNTP)
>  /* NTP server IP address */
>  IPaddr_t       NetNtpServerIP;
> @@ -653,94 +649,6 @@ NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int len)
>        return 0;       /* transmitted */
>  }
>
> -#if defined(CONFIG_CMD_PING)
> -static ushort PingSeqNo;
> -
> -int PingSend(void)
> -{
> -       static uchar mac[6];
> -       IP_t *ip;
> -       ushort *s;
> -       uchar *pkt;
> -
> -       /* XXX always send arp request */
> -
> -       memcpy(mac, NetEtherNullAddr, 6);
> -
> -       debug("sending ARP for %08x\n", NetPingIP);
> -
> -       NetArpWaitPacketIP = NetPingIP;
> -       NetArpWaitPacketMAC = mac;
> -
> -       pkt = NetArpWaitTxPacket;
> -       pkt += NetSetEther(pkt, mac, PROT_IP);
> -
> -       ip = (IP_t *)pkt;
> -
> -       /*
> -        * Construct an IP and ICMP header.
> -        * (need to set no fragment bit - XXX)
> -        */
> -       /* IP_HDR_SIZE / 4 (not including UDP) */
> -       ip->ip_hl_v  = 0x45;
> -       ip->ip_tos   = 0;
> -       ip->ip_len   = htons(IP_HDR_SIZE_NO_UDP + 8);
> -       ip->ip_id    = htons(NetIPID++);
> -       ip->ip_off   = htons(IP_FLAGS_DFRAG);   /* Don't fragment */
> -       ip->ip_ttl   = 255;
> -       ip->ip_p     = 0x01;            /* ICMP */
> -       ip->ip_sum   = 0;
> -       /* already in network byte order */
> -       NetCopyIP((void *)&ip->ip_src, &NetOurIP);
> -       /* - "" - */
> -       NetCopyIP((void *)&ip->ip_dst, &NetPingIP);
> -       ip->ip_sum   = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2);
> -
> -       s = &ip->udp_src;               /* XXX ICMP starts here */
> -       s[0] = htons(0x0800);           /* echo-request, code */
> -       s[1] = 0;                       /* checksum */
> -       s[2] = 0;                       /* identifier */
> -       s[3] = htons(PingSeqNo++);      /* sequence number */
> -       s[1] = ~NetCksum((uchar *)s, 8/2);
> -
> -       /* size of the waiting packet */
> -       NetArpWaitTxPacketSize =
> -               (pkt - NetArpWaitTxPacket) + IP_HDR_SIZE_NO_UDP + 8;
> -
> -       /* and do the ARP request */
> -       NetArpWaitTry = 1;
> -       NetArpWaitTimerStart = get_timer(0);
> -       ArpRequest();
> -       return 1;       /* waiting */
> -}
> -
> -static void
> -PingTimeout(void)
> -{
> -       eth_halt();
> -       NetState = NETLOOP_FAIL;        /* we did not get the reply */
> -}
> -
> -static void
> -PingHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
> -           unsigned len)
> -{
> -       if (sip != NetPingIP)
> -               return;
> -
> -       NetState = NETLOOP_SUCCESS;
> -}
> -
> -static void PingStart(void)
> -{
> -       printf("Using %s device\n", eth_get_name());
> -       NetSetTimeout(10000UL, PingTimeout);
> -       NetSetHandler(PingHandler);
> -
> -       PingSend();
> -}
> -#endif
> -
>  #ifdef CONFIG_IP_DEFRAG
>  /*
>  * This function collects fragments in a single packet, according
> @@ -930,41 +838,10 @@ static void receive_icmp(IP_t *ip, int len, IPaddr_t src_ip, Ethernet_t *et)
>                printf(" ICMP Host Redirect to %pI4 ",
>                        &icmph->un.gateway);
>                break;
> +       default:
>  #if defined(CONFIG_CMD_PING)
> -       case ICMP_ECHO_REPLY:
> -               /*
> -                       * IP header OK.  Pass the packet to the
> -                       * current handler.
> -                       */
> -               /*
> -                * XXX point to ip packet - should this use
> -                * packet_icmp_handler?
> -                */
> -               (*packetHandler)((uchar *)ip, 0, src_ip, 0, 0);
> -               break;
> -       case ICMP_ECHO_REQUEST:
> -               debug("Got ICMP ECHO REQUEST, return %d bytes\n",
> -                       ETHER_HDR_SIZE + len);
> -
> -               memcpy(&et->et_dest[0], &et->et_src[0], 6);
> -               memcpy(&et->et_src[0], NetOurEther, 6);
> -
> -               ip->ip_sum = 0;
> -               ip->ip_off = 0;
> -               NetCopyIP((void *)&ip->ip_dst, &ip->ip_src);
> -               NetCopyIP((void *)&ip->ip_src, &NetOurIP);
> -               ip->ip_sum = ~NetCksum((uchar *)ip,
> -                                       IP_HDR_SIZE_NO_UDP >> 1);
> -
> -               icmph->type = ICMP_ECHO_REPLY;
> -               icmph->checksum = 0;
> -               icmph->checksum = ~NetCksum((uchar *)icmph,
> -                       (len - IP_HDR_SIZE_NO_UDP) >> 1);
> -               (void) eth_send((uchar *)et,
> -                               ETHER_HDR_SIZE + len);
> -               break;
> +               PingReceive(et, ip, len);
>  #endif
> -       default:
>  #ifdef CONFIG_CMD_TFTPPUT
>                if (packet_icmp_handler)
>                        packet_icmp_handler(icmph->type, icmph->code,
> diff --git a/net/ping.c b/net/ping.c
> new file mode 100644
> index 0000000..4a66b8d
> --- /dev/null
> +++ b/net/ping.c
> @@ -0,0 +1,143 @@
> +/*
> + *     Copied from Linux Monitor (LiMon) - Networking.
> + *
> + *     Copyright 1994 - 2000 Neil Russell.
> + *     (See License)
> + *     Copyright 2000 Roland Borde
> + *     Copyright 2000 Paolo Scaffardi
> + *     Copyright 2000-2002 Wolfgang Denk, wd@denx.de
> + */
> +
> +#include "ping.h"
> +#include "arp.h"
> +
> +static ushort PingSeqNo;
> +
> +/* The ip address to ping */
> +IPaddr_t NetPingIP;
> +
> +static int PingSend(void)
> +{
> +       static uchar mac[6];
> +       IP_t *ip;
> +       ushort *s;
> +       uchar *pkt;
> +
> +       /* XXX always send arp request */
> +
> +       memcpy(mac, NetEtherNullAddr, 6);
> +
> +       debug("sending ARP for %pI4\n", &NetPingIP);
> +
> +       NetArpWaitPacketIP = NetPingIP;
> +       NetArpWaitPacketMAC = mac;
> +
> +       pkt = NetArpWaitTxPacket;
> +       pkt += NetSetEther(pkt, mac, PROT_IP);
> +
> +       ip = (IP_t *)pkt;
> +
> +       /*
> +        * Construct an IP and ICMP header.
> +        * (need to set no fragment bit - XXX)
> +        */
> +       /* IP_HDR_SIZE / 4 (not including UDP) */
> +       ip->ip_hl_v  = 0x45;
> +       ip->ip_tos   = 0;
> +       ip->ip_len   = htons(IP_HDR_SIZE_NO_UDP + 8);
> +       ip->ip_id    = htons(NetIPID++);
> +       ip->ip_off   = htons(IP_FLAGS_DFRAG);   /* Don't fragment */
> +       ip->ip_ttl   = 255;
> +       ip->ip_p     = 0x01;            /* ICMP */
> +       ip->ip_sum   = 0;
> +       /* already in network byte order */
> +       NetCopyIP((void *)&ip->ip_src, &NetOurIP);
> +       /* - "" - */
> +       NetCopyIP((void *)&ip->ip_dst, &NetPingIP);
> +       ip->ip_sum   = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2);
> +
> +       s = &ip->udp_src;               /* XXX ICMP starts here */
> +       s[0] = htons(0x0800);           /* echo-request, code */
> +       s[1] = 0;                       /* checksum */
> +       s[2] = 0;                       /* identifier */
> +       s[3] = htons(PingSeqNo++);      /* sequence number */
> +       s[1] = ~NetCksum((uchar *)s, 8/2);
> +
> +       /* size of the waiting packet */
> +       NetArpWaitTxPacketSize =
> +               (pkt - NetArpWaitTxPacket) + IP_HDR_SIZE_NO_UDP + 8;
> +
> +       /* and do the ARP request */
> +       NetArpWaitTry = 1;
> +       NetArpWaitTimerStart = get_timer(0);
> +       ArpRequest();
> +       return 1;       /* waiting */
> +}
> +
> +static void
> +PingTimeout(void)
> +{
> +       eth_halt();
> +       NetState = NETLOOP_FAIL;        /* we did not get the reply */
> +}
> +
> +static void
> +PingHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
> +           unsigned len)
> +{
> +       if (sip != NetPingIP)
> +               return;
> +
> +       NetState = NETLOOP_SUCCESS;
> +}
> +
> +void
> +PingStart(void)
> +{
> +       printf("Using %s device\n", eth_get_name());
> +       NetSetTimeout(10000UL, PingTimeout);
> +       NetSetHandler(PingHandler);
> +
> +       PingSend();
> +}
> +
> +void PingReceive(Ethernet_t *et, IP_t *ip, int len)
> +{
> +       ICMP_t *icmph = (ICMP_t *)&(ip->udp_src);
> +       IPaddr_t src_ip;
> +
> +       switch (icmph->type) {
> +       case ICMP_ECHO_REPLY:
> +               /*
> +                * IP header OK.  Pass the packet to the
> +                * current handler.
> +                */
> +               /* XXX point to ip packet */
> +               src_ip = NetReadIP((void *)&ip->ip_src);
> +               NetGetHandler()((uchar *)ip, 0, src_ip, 0, 0);
> +               return;
> +       case ICMP_ECHO_REQUEST:
> +               debug("Got ICMP ECHO REQUEST, return "
> +                       "%d bytes\n", ETHER_HDR_SIZE + len);
> +
> +               memcpy(&et->et_dest[0], &et->et_src[0], 6);
> +               memcpy(&et->et_src[0], NetOurEther, 6);
> +
> +               ip->ip_sum = 0;
> +               ip->ip_off = 0;
> +               NetCopyIP((void *)&ip->ip_dst, &ip->ip_src);
> +               NetCopyIP((void *)&ip->ip_src, &NetOurIP);
> +               ip->ip_sum = ~NetCksum((uchar *)ip,
> +                                      IP_HDR_SIZE_NO_UDP >> 1);
> +
> +               icmph->type = ICMP_ECHO_REPLY;
> +               icmph->checksum = 0;
> +               icmph->checksum = ~NetCksum((uchar *)icmph,
> +                       (len - IP_HDR_SIZE_NO_UDP) >> 1);
> +               (void) eth_send((uchar *)et,
> +                               ETHER_HDR_SIZE + len);
> +               return;
> +/*     default:
> +               return;*/
> +       }
> +}
> diff --git a/net/ping.h b/net/ping.h
> new file mode 100644
> index 0000000..56aad43
> --- /dev/null
> +++ b/net/ping.h
> @@ -0,0 +1,20 @@
> +/*
> + *     Copied from Linux Monitor (LiMon) - Networking.
> + *
> + *     Copyright 1994 - 2000 Neil Russell.
> + *     (See License)
> + *     Copyright 2000 Roland Borde
> + *     Copyright 2000 Paolo Scaffardi
> + *     Copyright 2000-2002 Wolfgang Denk, wd@denx.de
> + */
> +
> +#ifndef __PING_H__
> +#define __PING_H__
> +
> +#include <common.h>
> +#include <net.h>
> +
> +void PingStart(void);
> +void PingReceive(Ethernet_t *et, IP_t *ip, int len);
> +
> +#endif /* __PING_H__ */
> --
> 1.6.0.2
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Mike Frysinger - Feb. 3, 2012, 11:57 a.m.
On Tuesday 24 January 2012 00:37:51 Simon Glass wrote:
> On Thu, Jan 19, 2012 at 4:53 PM, Joe Hershberger wrote:
> >  include/configs/am3517_crane.h |    2 +-
> >  include/configs/am3517_evm.h   |    2 +-
> >  include/configs/origen.h       |    2 +-
> 
> Perhaps move these config changes to another commit?

+1
-mike
Mike Frysinger - Feb. 3, 2012, 11:58 a.m.
On Thursday 19 January 2012 19:53:10 Joe Hershberger wrote:
> --- a/net/net.c
> +++ b/net/net.c
>
> +#if defined(CONFIG_CMD_PING)
> +#include "ping.h"
> +#endif

please push ifdef down into ping.h header
-mike
Mike Frysinger - Feb. 3, 2012, 12:07 p.m.
hmm, thinking a bit more, i wonder if it makes more sense to split all of icmp 
out of net.c
-mike
Joe Hershberger - Feb. 13, 2012, 11:54 p.m.
Hi Mike,

On Fri, Feb 3, 2012 at 6:07 AM, Mike Frysinger <vapier@gentoo.org> wrote:
> hmm, thinking a bit more, i wonder if it makes more sense to split all of icmp
> out of net.c

This would also be fine.  Are you thinking that icmp would include all
of icmp or would we still have ping separate?  Does this need to be
done now?  It would be quite a bit of churn to move ping changes to a
different file first since the changes after the move would have to be
manually recreated.

Thanks,
-Joe
Mike Frysinger - Feb. 14, 2012, 6:51 a.m.
On Monday 13 February 2012 18:54:46 Joe Hershberger wrote:
> On Fri, Feb 3, 2012 at 6:07 AM, Mike Frysinger wrote:
> > hmm, thinking a bit more, i wonder if it makes more sense to split all of
> > icmp out of net.c
> 
> This would also be fine.  Are you thinking that icmp would include all
> of icmp or would we still have ping separate?  Does this need to be
> done now?  It would be quite a bit of churn to move ping changes to a
> different file first since the changes after the move would have to be
> manually recreated.

keeping ping.c is fine, but i think we should also have icmp.c broken out of 
net.c.  since we're keeping ping.c, no need to rebase onto a new patch.  
icmp.c can come after these.
-mike

Patch

diff --git a/include/configs/am3517_crane.h b/include/configs/am3517_crane.h
index 0a0c261..acd4e3f 100644
--- a/include/configs/am3517_crane.h
+++ b/include/configs/am3517_crane.h
@@ -146,7 +146,7 @@ 
 #define CONFIG_CMD_MMC		/* MMC support			*/
 #define CONFIG_CMD_NAND		/* NAND support			*/
 #define CONFIG_CMD_DHCP
-#define CONFIG_CMD_PING
+#undef CONFIG_CMD_PING
 
 #undef CONFIG_CMD_FLASH		/* flinfo, erase, protect	*/
 #undef CONFIG_CMD_FPGA		/* FPGA configuration Support	*/
diff --git a/include/configs/am3517_evm.h b/include/configs/am3517_evm.h
index d44eeec..9775107 100644
--- a/include/configs/am3517_evm.h
+++ b/include/configs/am3517_evm.h
@@ -145,7 +145,7 @@ 
 #define CONFIG_CMD_MMC		/* MMC support			*/
 #define CONFIG_CMD_NAND		/* NAND support			*/
 #define CONFIG_CMD_DHCP
-#define CONFIG_CMD_PING
+#undef CONFIG_CMD_PING
 
 #undef CONFIG_CMD_FLASH		/* flinfo, erase, protect	*/
 #undef CONFIG_CMD_FPGA		/* FPGA configuration Support	*/
diff --git a/include/configs/origen.h b/include/configs/origen.h
index cd502d1..c9bac30 100644
--- a/include/configs/origen.h
+++ b/include/configs/origen.h
@@ -84,7 +84,7 @@ 
 /* Command definition*/
 #include <config_cmd_default.h>
 
-#define CONFIG_CMD_PING
+#undef CONFIG_CMD_PING
 #define CONFIG_CMD_ELF
 #define CONFIG_CMD_DHCP
 #define CONFIG_CMD_MMC
diff --git a/net/Makefile b/net/Makefile
index 0916a56..f1c4859 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -35,6 +35,7 @@  COBJS-$(CONFIG_CMD_NET)  += eth.o
 COBJS-$(CONFIG_CMD_NET)  += net.o
 COBJS-$(CONFIG_BOOTP_RANDOM_DELAY) += net_rand.o
 COBJS-$(CONFIG_CMD_NFS)  += nfs.o
+COBJS-$(CONFIG_CMD_PING) += ping.o
 COBJS-$(CONFIG_CMD_RARP) += rarp.o
 COBJS-$(CONFIG_CMD_SNTP) += sntp.o
 COBJS-$(CONFIG_CMD_NET)  += tftp.o
diff --git a/net/net.c b/net/net.c
index 2dae5a0..c2fbcb5 100644
--- a/net/net.c
+++ b/net/net.c
@@ -98,6 +98,9 @@ 
 #if defined(CONFIG_CMD_DNS)
 #include "dns.h"
 #endif
+#if defined(CONFIG_CMD_PING)
+#include "ping.h"
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -168,13 +171,6 @@  ushort		NetOurNativeVLAN = 0xFFFF;
 /* Boot File name */
 char		BootFile[128];
 
-#if defined(CONFIG_CMD_PING)
-/* the ip address to ping */
-IPaddr_t	NetPingIP;
-
-static void PingStart(void);
-#endif
-
 #if defined(CONFIG_CMD_SNTP)
 /* NTP server IP address */
 IPaddr_t	NetNtpServerIP;
@@ -653,94 +649,6 @@  NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int len)
 	return 0;	/* transmitted */
 }
 
-#if defined(CONFIG_CMD_PING)
-static ushort PingSeqNo;
-
-int PingSend(void)
-{
-	static uchar mac[6];
-	IP_t *ip;
-	ushort *s;
-	uchar *pkt;
-
-	/* XXX always send arp request */
-
-	memcpy(mac, NetEtherNullAddr, 6);
-
-	debug("sending ARP for %08x\n", NetPingIP);
-
-	NetArpWaitPacketIP = NetPingIP;
-	NetArpWaitPacketMAC = mac;
-
-	pkt = NetArpWaitTxPacket;
-	pkt += NetSetEther(pkt, mac, PROT_IP);
-
-	ip = (IP_t *)pkt;
-
-	/*
-	 * Construct an IP and ICMP header.
-	 * (need to set no fragment bit - XXX)
-	 */
-	/* IP_HDR_SIZE / 4 (not including UDP) */
-	ip->ip_hl_v  = 0x45;
-	ip->ip_tos   = 0;
-	ip->ip_len   = htons(IP_HDR_SIZE_NO_UDP + 8);
-	ip->ip_id    = htons(NetIPID++);
-	ip->ip_off   = htons(IP_FLAGS_DFRAG);	/* Don't fragment */
-	ip->ip_ttl   = 255;
-	ip->ip_p     = 0x01;		/* ICMP */
-	ip->ip_sum   = 0;
-	/* already in network byte order */
-	NetCopyIP((void *)&ip->ip_src, &NetOurIP);
-	/* - "" - */
-	NetCopyIP((void *)&ip->ip_dst, &NetPingIP);
-	ip->ip_sum   = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2);
-
-	s = &ip->udp_src;		/* XXX ICMP starts here */
-	s[0] = htons(0x0800);		/* echo-request, code */
-	s[1] = 0;			/* checksum */
-	s[2] = 0;			/* identifier */
-	s[3] = htons(PingSeqNo++);	/* sequence number */
-	s[1] = ~NetCksum((uchar *)s, 8/2);
-
-	/* size of the waiting packet */
-	NetArpWaitTxPacketSize =
-		(pkt - NetArpWaitTxPacket) + IP_HDR_SIZE_NO_UDP + 8;
-
-	/* and do the ARP request */
-	NetArpWaitTry = 1;
-	NetArpWaitTimerStart = get_timer(0);
-	ArpRequest();
-	return 1;	/* waiting */
-}
-
-static void
-PingTimeout(void)
-{
-	eth_halt();
-	NetState = NETLOOP_FAIL;	/* we did not get the reply */
-}
-
-static void
-PingHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
-	    unsigned len)
-{
-	if (sip != NetPingIP)
-		return;
-
-	NetState = NETLOOP_SUCCESS;
-}
-
-static void PingStart(void)
-{
-	printf("Using %s device\n", eth_get_name());
-	NetSetTimeout(10000UL, PingTimeout);
-	NetSetHandler(PingHandler);
-
-	PingSend();
-}
-#endif
-
 #ifdef CONFIG_IP_DEFRAG
 /*
  * This function collects fragments in a single packet, according
@@ -930,41 +838,10 @@  static void receive_icmp(IP_t *ip, int len, IPaddr_t src_ip, Ethernet_t *et)
 		printf(" ICMP Host Redirect to %pI4 ",
 			&icmph->un.gateway);
 		break;
+	default:
 #if defined(CONFIG_CMD_PING)
-	case ICMP_ECHO_REPLY:
-		/*
-			* IP header OK.  Pass the packet to the
-			* current handler.
-			*/
-		/*
-		 * XXX point to ip packet - should this use
-		 * packet_icmp_handler?
-		 */
-		(*packetHandler)((uchar *)ip, 0, src_ip, 0, 0);
-		break;
-	case ICMP_ECHO_REQUEST:
-		debug("Got ICMP ECHO REQUEST, return %d bytes\n",
-			ETHER_HDR_SIZE + len);
-
-		memcpy(&et->et_dest[0], &et->et_src[0], 6);
-		memcpy(&et->et_src[0], NetOurEther, 6);
-
-		ip->ip_sum = 0;
-		ip->ip_off = 0;
-		NetCopyIP((void *)&ip->ip_dst, &ip->ip_src);
-		NetCopyIP((void *)&ip->ip_src, &NetOurIP);
-		ip->ip_sum = ~NetCksum((uchar *)ip,
-					IP_HDR_SIZE_NO_UDP >> 1);
-
-		icmph->type = ICMP_ECHO_REPLY;
-		icmph->checksum = 0;
-		icmph->checksum = ~NetCksum((uchar *)icmph,
-			(len - IP_HDR_SIZE_NO_UDP) >> 1);
-		(void) eth_send((uchar *)et,
-				ETHER_HDR_SIZE + len);
-		break;
+		PingReceive(et, ip, len);
 #endif
-	default:
 #ifdef CONFIG_CMD_TFTPPUT
 		if (packet_icmp_handler)
 			packet_icmp_handler(icmph->type, icmph->code,
diff --git a/net/ping.c b/net/ping.c
new file mode 100644
index 0000000..4a66b8d
--- /dev/null
+++ b/net/ping.c
@@ -0,0 +1,143 @@ 
+/*
+ *	Copied from Linux Monitor (LiMon) - Networking.
+ *
+ *	Copyright 1994 - 2000 Neil Russell.
+ *	(See License)
+ *	Copyright 2000 Roland Borde
+ *	Copyright 2000 Paolo Scaffardi
+ *	Copyright 2000-2002 Wolfgang Denk, wd@denx.de
+ */
+
+#include "ping.h"
+#include "arp.h"
+
+static ushort PingSeqNo;
+
+/* The ip address to ping */
+IPaddr_t NetPingIP;
+
+static int PingSend(void)
+{
+	static uchar mac[6];
+	IP_t *ip;
+	ushort *s;
+	uchar *pkt;
+
+	/* XXX always send arp request */
+
+	memcpy(mac, NetEtherNullAddr, 6);
+
+	debug("sending ARP for %pI4\n", &NetPingIP);
+
+	NetArpWaitPacketIP = NetPingIP;
+	NetArpWaitPacketMAC = mac;
+
+	pkt = NetArpWaitTxPacket;
+	pkt += NetSetEther(pkt, mac, PROT_IP);
+
+	ip = (IP_t *)pkt;
+
+	/*
+	 * Construct an IP and ICMP header.
+	 * (need to set no fragment bit - XXX)
+	 */
+	/* IP_HDR_SIZE / 4 (not including UDP) */
+	ip->ip_hl_v  = 0x45;
+	ip->ip_tos   = 0;
+	ip->ip_len   = htons(IP_HDR_SIZE_NO_UDP + 8);
+	ip->ip_id    = htons(NetIPID++);
+	ip->ip_off   = htons(IP_FLAGS_DFRAG);	/* Don't fragment */
+	ip->ip_ttl   = 255;
+	ip->ip_p     = 0x01;		/* ICMP */
+	ip->ip_sum   = 0;
+	/* already in network byte order */
+	NetCopyIP((void *)&ip->ip_src, &NetOurIP);
+	/* - "" - */
+	NetCopyIP((void *)&ip->ip_dst, &NetPingIP);
+	ip->ip_sum   = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2);
+
+	s = &ip->udp_src;		/* XXX ICMP starts here */
+	s[0] = htons(0x0800);		/* echo-request, code */
+	s[1] = 0;			/* checksum */
+	s[2] = 0;			/* identifier */
+	s[3] = htons(PingSeqNo++);	/* sequence number */
+	s[1] = ~NetCksum((uchar *)s, 8/2);
+
+	/* size of the waiting packet */
+	NetArpWaitTxPacketSize =
+		(pkt - NetArpWaitTxPacket) + IP_HDR_SIZE_NO_UDP + 8;
+
+	/* and do the ARP request */
+	NetArpWaitTry = 1;
+	NetArpWaitTimerStart = get_timer(0);
+	ArpRequest();
+	return 1;	/* waiting */
+}
+
+static void
+PingTimeout(void)
+{
+	eth_halt();
+	NetState = NETLOOP_FAIL;	/* we did not get the reply */
+}
+
+static void
+PingHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
+	    unsigned len)
+{
+	if (sip != NetPingIP)
+		return;
+
+	NetState = NETLOOP_SUCCESS;
+}
+
+void
+PingStart(void)
+{
+	printf("Using %s device\n", eth_get_name());
+	NetSetTimeout(10000UL, PingTimeout);
+	NetSetHandler(PingHandler);
+
+	PingSend();
+}
+
+void PingReceive(Ethernet_t *et, IP_t *ip, int len)
+{
+	ICMP_t *icmph = (ICMP_t *)&(ip->udp_src);
+	IPaddr_t src_ip;
+
+	switch (icmph->type) {
+	case ICMP_ECHO_REPLY:
+		/*
+		 * IP header OK.  Pass the packet to the
+		 * current handler.
+		 */
+		/* XXX point to ip packet */
+		src_ip = NetReadIP((void *)&ip->ip_src);
+		NetGetHandler()((uchar *)ip, 0, src_ip, 0, 0);
+		return;
+	case ICMP_ECHO_REQUEST:
+		debug("Got ICMP ECHO REQUEST, return "
+			"%d bytes\n", ETHER_HDR_SIZE + len);
+
+		memcpy(&et->et_dest[0], &et->et_src[0], 6);
+		memcpy(&et->et_src[0], NetOurEther, 6);
+
+		ip->ip_sum = 0;
+		ip->ip_off = 0;
+		NetCopyIP((void *)&ip->ip_dst, &ip->ip_src);
+		NetCopyIP((void *)&ip->ip_src, &NetOurIP);
+		ip->ip_sum = ~NetCksum((uchar *)ip,
+				       IP_HDR_SIZE_NO_UDP >> 1);
+
+		icmph->type = ICMP_ECHO_REPLY;
+		icmph->checksum = 0;
+		icmph->checksum = ~NetCksum((uchar *)icmph,
+			(len - IP_HDR_SIZE_NO_UDP) >> 1);
+		(void) eth_send((uchar *)et,
+				ETHER_HDR_SIZE + len);
+		return;
+/*	default:
+		return;*/
+	}
+}
diff --git a/net/ping.h b/net/ping.h
new file mode 100644
index 0000000..56aad43
--- /dev/null
+++ b/net/ping.h
@@ -0,0 +1,20 @@ 
+/*
+ *	Copied from Linux Monitor (LiMon) - Networking.
+ *
+ *	Copyright 1994 - 2000 Neil Russell.
+ *	(See License)
+ *	Copyright 2000 Roland Borde
+ *	Copyright 2000 Paolo Scaffardi
+ *	Copyright 2000-2002 Wolfgang Denk, wd@denx.de
+ */
+
+#ifndef __PING_H__
+#define __PING_H__
+
+#include <common.h>
+#include <net.h>
+
+void PingStart(void);
+void PingReceive(Ethernet_t *et, IP_t *ip, int len);
+
+#endif /* __PING_H__ */