]>
git.ipfire.org Git - people/ms/u-boot.git/blob - net/ping.c
2 * Copied from Linux Monitor (LiMon) - Networking.
4 * Copyright 1994 - 2000 Neil Russell.
6 * Copyright 2000 Roland Borde
7 * Copyright 2000 Paolo Scaffardi
8 * Copyright 2000-2002 Wolfgang Denk, wd@denx.de
9 * SPDX-License-Identifier: GPL-2.0
15 static ushort ping_seq_number
;
17 /* The ip address to ping */
18 struct in_addr net_ping_ip
;
20 static void set_icmp_header(uchar
*pkt
, struct in_addr dest
)
23 * Construct an IP and ICMP header.
25 struct ip_hdr
*ip
= (struct ip_hdr
*)pkt
;
26 struct icmp_hdr
*icmp
= (struct icmp_hdr
*)(pkt
+ IP_HDR_SIZE
);
28 net_set_ip_header(pkt
, dest
, net_ip
);
30 ip
->ip_len
= htons(IP_ICMP_HDR_SIZE
);
31 ip
->ip_p
= IPPROTO_ICMP
;
32 ip
->ip_sum
= compute_ip_checksum(ip
, IP_HDR_SIZE
);
34 icmp
->type
= ICMP_ECHO_REQUEST
;
38 icmp
->un
.echo
.sequence
= htons(ping_seq_number
++);
39 icmp
->checksum
= compute_ip_checksum(icmp
, ICMP_HDR_SIZE
);
42 static int ping_send(void)
47 /* XXX always send arp request */
49 debug_cond(DEBUG_DEV_PKT
, "sending ARP for %pI4\n", &net_ping_ip
);
51 net_arp_wait_packet_ip
= net_ping_ip
;
53 eth_hdr_size
= net_set_ether(net_tx_packet
, net_null_ethaddr
, PROT_IP
);
54 pkt
= (uchar
*)net_tx_packet
+ eth_hdr_size
;
56 set_icmp_header(pkt
, net_ping_ip
);
58 /* size of the waiting packet */
59 arp_wait_tx_packet_size
= eth_hdr_size
+ IP_ICMP_HDR_SIZE
;
61 /* and do the ARP request */
63 arp_wait_timer_start
= get_timer(0);
65 return 1; /* waiting */
68 static void ping_timeout_handler(void)
71 net_set_state(NETLOOP_FAIL
); /* we did not get the reply */
76 printf("Using %s device\n", eth_get_name());
77 net_set_timeout_handler(10000UL, ping_timeout_handler
);
82 void ping_receive(struct ethernet_hdr
*et
, struct ip_udp_hdr
*ip
, int len
)
84 struct icmp_hdr
*icmph
= (struct icmp_hdr
*)&ip
->udp_src
;
85 struct in_addr src_ip
;
88 switch (icmph
->type
) {
90 src_ip
= net_read_ip((void *)&ip
->ip_src
);
91 if (src_ip
.s_addr
== net_ping_ip
.s_addr
)
92 net_set_state(NETLOOP_SUCCESS
);
94 case ICMP_ECHO_REQUEST
:
95 eth_hdr_size
= net_update_ether(et
, et
->et_src
, PROT_IP
);
97 debug_cond(DEBUG_DEV_PKT
,
98 "Got ICMP ECHO REQUEST, return %d bytes\n",
103 net_copy_ip((void *)&ip
->ip_dst
, &ip
->ip_src
);
104 net_copy_ip((void *)&ip
->ip_src
, &net_ip
);
105 ip
->ip_sum
= compute_ip_checksum(ip
, IP_HDR_SIZE
);
107 icmph
->type
= ICMP_ECHO_REPLY
;
109 icmph
->checksum
= compute_ip_checksum(icmph
, len
- IP_HDR_SIZE
);
110 net_send_packet((uchar
*)et
, eth_hdr_size
+ len
);