Hi Joe, On Tue, Mar 27, 2012 at 4:42 PM, Joe Hershberger <joe.hershber...@ni.com> wrote: > Signed-off-by: Joe Hershberger <joe.hershber...@ni.com> > Cc: Joe Hershberger <joe.hershber...@gmail.com> > Cc: Simon Glass <s...@chromium.org> > Cc: Mike Frysinger <vap...@gentoo.org>
Acked-by: Simon Glass <s...@chromium.org> > --- > Changes for v2: > - Moved config fixes to a separate patch > - Pushed #ifdef CONFIG_CMD_PING into header > - Eliminated CamelCase > > net/Makefile | 1 + > net/net.c | 133 ++----------------------------------------------------- > net/ping.c | 140 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > net/ping.h | 23 ++++++++++ > 4 files changed, 168 insertions(+), 129 deletions(-) > create mode 100644 net/ping.c > create mode 100644 net/ping.h > > 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 f941f91..ef084ba 100644 > --- a/net/net.c > +++ b/net/net.c > @@ -97,6 +97,7 @@ > #if defined(CONFIG_CMD_DNS) > #include "dns.h" > #endif > +#include "ping.h" > > DECLARE_GLOBAL_DATA_PTR; > > @@ -167,13 +168,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; > @@ -358,7 +352,7 @@ restart: > #endif > #if defined(CONFIG_CMD_PING) > case PING: > - PingStart(); > + ping_start(); > break; > #endif > #if defined(CONFIG_CMD_NFS) > @@ -653,94 +647,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 +836,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; > + ping_receive(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..0e5b1da > --- /dev/null > +++ b/net/ping.c > @@ -0,0 +1,140 @@ > +/* > + * 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, w...@denx.de > + */ > + > +#include "ping.h" > +#include "arp.h" > + > +static ushort PingSeqNo; > + > +/* The ip address to ping */ > +IPaddr_t NetPingIP; > + > +static int ping_send(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 ping_timeout(void) > +{ > + eth_halt(); > + NetState = NETLOOP_FAIL; /* we did not get the reply */ > +} > + > +static void ping_handler(uchar *pkt, unsigned dest, IPaddr_t sip, > + unsigned src, unsigned len) > +{ > + if (sip != NetPingIP) > + return; > + > + NetState = NETLOOP_SUCCESS; > +} > + > +void ping_start(void) > +{ > + printf("Using %s device\n", eth_get_name()); > + NetSetTimeout(10000UL, ping_timeout); > + NetSetHandler(ping_handler); > + > + ping_send(); > +} > + > +void ping_receive(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..94d434e > --- /dev/null > +++ b/net/ping.h > @@ -0,0 +1,23 @@ > +/* > + * 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, w...@denx.de > + */ > + > +#if defined(CONFIG_CMD_PING) > + > +#ifndef __PING_H__ > +#define __PING_H__ > + > +#include <common.h> > +#include <net.h> > + > +void ping_start(void); > +void ping_receive(Ethernet_t *et, IP_t *ip, int len); Function comments would be nice > + > +#endif /* __PING_H__ */ > +#endif > -- > 1.6.0.2 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot