Message ID | 1327020811-1538-8-git-send-email-joe.hershberger@ni.com |
---|---|
State | Superseded |
Delegated to: | Joe Hershberger |
Headers | show |
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
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
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
hmm, thinking a bit more, i wonder if it makes more sense to split all of icmp out of net.c -mike
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
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
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__ */
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