]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - net/ping.c
net: Refactor in preparation for driver model
[karo-tx-uboot.git] / net / ping.c
index 939f8ff6fcea85a2f5598c63640dda12e02e06cb..366f51825f9ecbff62354eeae1aeb2c49b4aa25b 100644 (file)
@@ -6,6 +6,7 @@
  *     Copyright 2000 Roland Borde
  *     Copyright 2000 Paolo Scaffardi
  *     Copyright 2000-2002 Wolfgang Denk, wd@denx.de
+ *     SPDX-License-Identifier:        GPL-2.0
  */
 
 #include "ping.h"
@@ -28,34 +29,29 @@ static void set_icmp_header(uchar *pkt, IPaddr_t dest)
 
        ip->ip_len   = htons(IP_ICMP_HDR_SIZE);
        ip->ip_p     = IPPROTO_ICMP;
-       ip->ip_sum   = ~NetCksum((uchar *)ip, IP_HDR_SIZE >> 1);
+       ip->ip_sum   = compute_ip_checksum(ip, IP_HDR_SIZE);
 
        icmp->type = ICMP_ECHO_REQUEST;
        icmp->code = 0;
        icmp->checksum = 0;
        icmp->un.echo.id = 0;
        icmp->un.echo.sequence = htons(PingSeqNo++);
-       icmp->checksum = ~NetCksum((uchar *)icmp, ICMP_HDR_SIZE >> 1);
+       icmp->checksum = compute_ip_checksum(icmp, ICMP_HDR_SIZE);
 }
 
 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;
-       eth_hdr_size = NetSetEther(pkt, mac, PROT_IP);
-       pkt += eth_hdr_size;
+       eth_hdr_size = NetSetEther(NetTxPacket, NetEtherNullAddr, PROT_IP);
+       pkt = (uchar *)NetTxPacket + eth_hdr_size;
 
        set_icmp_header(pkt, NetPingIP);
 
@@ -72,23 +68,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();
 }
@@ -97,37 +83,30 @@ 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;
                NetCopyIP((void *)&ip->ip_dst, &ip->ip_src);
                NetCopyIP((void *)&ip->ip_src, &NetOurIP);
-               ip->ip_sum = ~NetCksum((uchar *)ip,
-                                      IP_HDR_SIZE >> 1);
+               ip->ip_sum = compute_ip_checksum(ip, IP_HDR_SIZE);
 
                icmph->type = ICMP_ECHO_REPLY;
                icmph->checksum = 0;
-               icmph->checksum = ~NetCksum((uchar *)icmph,
-                       (len - IP_HDR_SIZE) >> 1);
-               (void) eth_send((uchar *)et,
-                               ETHER_HDR_SIZE + len);
+               icmph->checksum = compute_ip_checksum(icmph, len - IP_HDR_SIZE);
+               NetSendPacket((uchar *)et, eth_hdr_size + len);
                return;
 /*     default:
                return;*/