]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - net/ping.c
Merge branch 'u-boot/master' into u-boot-arm/master
[karo-tx-uboot.git] / net / ping.c
index c52563566900e01f336019d18878c97da36f0a9f..0710b9228d1ea9318901faaf56fdfe4ef68743e3 100644 (file)
@@ -40,26 +40,22 @@ static void set_icmp_header(uchar *pkt, IPaddr_t dest)
 
 static int ping_send(void)
 {
-       static uchar mac[6];
        uchar *pkt;
+       int eth_hdr_size;
 
        /* XXX always send arp request */
 
-       memcpy(mac, NetEtherNullAddr, 6);
-
-       debug("sending ARP for %pI4\n", &NetPingIP);
+       debug_cond(DEBUG_DEV_PKT, "sending ARP for %pI4\n", &NetPingIP);
 
        NetArpWaitPacketIP = NetPingIP;
-       NetArpWaitPacketMAC = mac;
 
-       pkt = NetArpWaitTxPacket;
-       pkt += NetSetEther(pkt, mac, PROT_IP);
+       eth_hdr_size = NetSetEther(NetTxPacket, NetEtherNullAddr, PROT_IP);
+       pkt = (uchar *)NetTxPacket + eth_hdr_size;
 
        set_icmp_header(pkt, NetPingIP);
 
        /* size of the waiting packet */
-       NetArpWaitTxPacketSize =
-               (pkt - NetArpWaitTxPacket) + IP_HDR_SIZE + 8;
+       NetArpWaitTxPacketSize = eth_hdr_size + IP_ICMP_HDR_SIZE;
 
        /* and do the ARP request */
        NetArpWaitTry = 1;
@@ -71,23 +67,13 @@ static int ping_send(void)
 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;
+       net_set_state(NETLOOP_FAIL);    /* we did not get the reply */
 }
 
 void ping_start(void)
 {
        printf("Using %s device\n", eth_get_name());
        NetSetTimeout(10000UL, ping_timeout);
-       NetSetHandler(ping_handler);
 
        ping_send();
 }
@@ -96,23 +82,19 @@ void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)
 {
        struct icmp_hdr *icmph = (struct icmp_hdr *)&ip->udp_src;
        IPaddr_t src_ip;
+       int eth_hdr_size;
 
        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);
+               if (src_ip == NetPingIP)
+                       net_set_state(NETLOOP_SUCCESS);
                return;
        case ICMP_ECHO_REQUEST:
-               debug("Got ICMP ECHO REQUEST, return "
-                       "%d bytes\n", ETHER_HDR_SIZE + len);
+               eth_hdr_size = net_update_ether(et, et->et_src, PROT_IP);
 
-               memcpy(&et->et_dest[0], &et->et_src[0], 6);
-               memcpy(&et->et_src[0], NetOurEther, 6);
+               debug_cond(DEBUG_DEV_PKT, "Got ICMP ECHO REQUEST, return "
+                       "%d bytes\n", eth_hdr_size + len);
 
                ip->ip_sum = 0;
                ip->ip_off = 0;
@@ -125,8 +107,7 @@ void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)
                icmph->checksum = 0;
                icmph->checksum = ~NetCksum((uchar *)icmph,
                        (len - IP_HDR_SIZE) >> 1);
-               (void) eth_send((uchar *)et,
-                               ETHER_HDR_SIZE + len);
+               NetSendPacket((uchar *)et, eth_hdr_size + len);
                return;
 /*     default:
                return;*/