X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=net%2Fping.c;h=4918a1cb36d3e2ebc7c888545ee9c0fc3d6c5c98;hb=d1f6052e6af18fc9c90a8bdaa4b5f8d916fdab35;hp=0f4d99088e0efd4e3541c8ff10622d0c268e0e45;hpb=61da3c2af8ba7a06cb1f7e9e0db54b9ddea532ce;p=karo-tx-uboot.git diff --git a/net/ping.c b/net/ping.c index 0f4d99088e..4918a1cb36 100644 --- a/net/ping.c +++ b/net/ping.c @@ -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" @@ -14,9 +15,9 @@ static ushort PingSeqNo; /* The ip address to ping */ -IPaddr_t NetPingIP; +struct in_addr net_ping_ip; -static void set_icmp_header(uchar *pkt, IPaddr_t dest) +static void set_icmp_header(uchar *pkt, struct in_addr dest) { /* * Construct an IP and ICMP header. @@ -24,40 +25,35 @@ static void set_icmp_header(uchar *pkt, IPaddr_t dest) struct ip_hdr *ip = (struct ip_hdr *)pkt; struct icmp_hdr *icmp = (struct icmp_hdr *)(pkt + IP_HDR_SIZE); - net_set_ip_header(pkt, dest, NetOurIP); + net_set_ip_header(pkt, dest, net_ip); 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_cond(DEBUG_DEV_PKT, "sending ARP for %pI4\n", &net_ping_ip); - debug("sending ARP for %pI4\n", &NetPingIP); + net_arp_wait_packet_ip = net_ping_ip; - NetArpWaitPacketIP = NetPingIP; - NetArpWaitPacketMAC = mac; + eth_hdr_size = NetSetEther(NetTxPacket, NetEtherNullAddr, PROT_IP); + pkt = (uchar *)NetTxPacket + eth_hdr_size; - pkt = NetArpWaitTxPacket; - eth_hdr_size = NetSetEther(pkt, mac, PROT_IP); - pkt += eth_hdr_size; - - set_icmp_header(pkt, NetPingIP); + set_icmp_header(pkt, net_ping_ip); /* size of the waiting packet */ NetArpWaitTxPacketSize = eth_hdr_size + IP_ICMP_HDR_SIZE; @@ -72,7 +68,7 @@ static int ping_send(void) static void ping_timeout(void) { eth_halt(); - NetState = NETLOOP_FAIL; /* we did not get the reply */ + net_set_state(NETLOOP_FAIL); /* we did not get the reply */ } void ping_start(void) @@ -86,34 +82,31 @@ void ping_start(void) 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; + struct in_addr src_ip; + int eth_hdr_size; switch (icmph->type) { case ICMP_ECHO_REPLY: - src_ip = NetReadIP((void *)&ip->ip_src); - if (src_ip == NetPingIP) - NetState = NETLOOP_SUCCESS; + src_ip = net_read_ip((void *)&ip->ip_src); + if (src_ip.s_addr == net_ping_ip.s_addr) + 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); + net_copy_ip((void *)&ip->ip_dst, &ip->ip_src); + net_copy_ip((void *)&ip->ip_src, &net_ip); + 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;*/