From patchwork Fri Jan 20 00:53:10 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joe Hershberger X-Patchwork-Id: 136976 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 36D901007D5 for ; Fri, 20 Jan 2012 20:12:02 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 1333B28371; Fri, 20 Jan 2012 10:10:20 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id vrhEDt+8CND8; Fri, 20 Jan 2012 10:10:19 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 164A2283BE; Fri, 20 Jan 2012 10:07:50 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id AC8E6283D0 for ; Fri, 20 Jan 2012 00:45:31 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id wawwUaZRlWoV for ; Fri, 20 Jan 2012 00:45:30 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from spamkiller06.natinst.com (mailserver6.natinst.com [130.164.80.6]) by theia.denx.de (Postfix) with ESMTP id 87618283CE for ; Fri, 20 Jan 2012 00:45:28 +0100 (CET) Received: from mailserv59-us.natinst.com (nb-hsrp-1338.natinst.com [130.164.19.133]) by spamkiller06.natinst.com (8.14.4/8.14.4) with ESMTP id q0JLxcBU024773; Thu, 19 Jan 2012 15:59:38 -0600 Received: from localhost.localdomain ([130.164.14.197]) by mailserv59-us.natinst.com (Lotus Domino Release 8.5.2FP3) with ESMTP id 2012011915590779-509594 ; Thu, 19 Jan 2012 15:59:07 -0600 From: Joe Hershberger To: u-boot@lists.denx.de Date: Thu, 19 Jan 2012 18:53:10 -0600 Message-Id: <1327020811-1538-8-git-send-email-joe.hershberger@ni.com> X-Mailer: git-send-email 1.6.0.2 In-Reply-To: <1327020811-1538-1-git-send-email-joe.hershberger@ni.com> References: <1327020811-1538-1-git-send-email-joe.hershberger@ni.com> X-MIMETrack: Itemize by SMTP Server on MailServ59-US/AUS/H/NIC(Release 8.5.2FP3|July 10, 2011) at 01/19/2012 03:59:07 PM, Serialize by Router on MailServ59-US/AUS/H/NIC(Release 8.5.2FP3|July 10, 2011) at 01/19/2012 03:59:08 PM, Serialize complete at 01/19/2012 03:59:08 PM X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.6.7361, 1.0.211, 0.0.0000 definitions=2012-01-19_09:2012-01-19, 2012-01-19, 1970-01-01 signatures=0 X-Mailman-Approved-At: Fri, 20 Jan 2012 10:07:24 +0100 Cc: Joe Hershberger Subject: [U-Boot] [PATCH 07/28] net: Move PING out of net.c X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de Signed-off-by: Joe Hershberger Cc: Joe Hershberger Cc: Wolfgang Denk --- 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 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 -#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 +#include + +void PingStart(void); +void PingReceive(Ethernet_t *et, IP_t *ip, int len); + +#endif /* __PING_H__ */