]> Git Repo - J-u-boot.git/blame - net/ping.c
common: Drop net.h from common header
[J-u-boot.git] / net / ping.c
CommitLineData
f739fcd8 1// SPDX-License-Identifier: GPL-2.0
a36b12f9
JH
2/*
3 * Copied from Linux Monitor (LiMon) - Networking.
4 *
5 * Copyright 1994 - 2000 Neil Russell.
6 * (See License)
7 * Copyright 2000 Roland Borde
8 * Copyright 2000 Paolo Scaffardi
9 * Copyright 2000-2002 Wolfgang Denk, [email protected]
10 */
11
12#include "ping.h"
13#include "arp.h"
90526e9f 14#include <net.h>
a36b12f9 15
331db5a9 16static ushort ping_seq_number;
a36b12f9
JH
17
18/* The ip address to ping */
049a95a7 19struct in_addr net_ping_ip;
a36b12f9 20
049a95a7 21static void set_icmp_header(uchar *pkt, struct in_addr dest)
4b11c916
JH
22{
23 /*
24 * Construct an IP and ICMP header.
25 */
4b11c916
JH
26 struct icmp_hdr *icmp = (struct icmp_hdr *)(pkt + IP_HDR_SIZE);
27
5d457ecb 28 net_set_ip_header(pkt, dest, net_ip, IP_ICMP_HDR_SIZE, IPPROTO_ICMP);
4b11c916
JH
29
30 icmp->type = ICMP_ECHO_REQUEST;
31 icmp->code = 0;
32 icmp->checksum = 0;
33 icmp->un.echo.id = 0;
331db5a9 34 icmp->un.echo.sequence = htons(ping_seq_number++);
0da0fcd5 35 icmp->checksum = compute_ip_checksum(icmp, ICMP_HDR_SIZE);
4b11c916
JH
36}
37
a36b12f9
JH
38static int ping_send(void)
39{
a36b12f9 40 uchar *pkt;
00f33268 41 int eth_hdr_size;
a36b12f9
JH
42
43 /* XXX always send arp request */
44
049a95a7 45 debug_cond(DEBUG_DEV_PKT, "sending ARP for %pI4\n", &net_ping_ip);
a36b12f9 46
049a95a7 47 net_arp_wait_packet_ip = net_ping_ip;
a36b12f9 48
1203fcce
JH
49 eth_hdr_size = net_set_ether(net_tx_packet, net_null_ethaddr, PROT_IP);
50 pkt = (uchar *)net_tx_packet + eth_hdr_size;
a36b12f9 51
049a95a7 52 set_icmp_header(pkt, net_ping_ip);
a36b12f9
JH
53
54 /* size of the waiting packet */
85d25e0e 55 arp_wait_tx_packet_size = eth_hdr_size + IP_ICMP_HDR_SIZE;
a36b12f9
JH
56
57 /* and do the ARP request */
85d25e0e
JH
58 arp_wait_try = 1;
59 arp_wait_timer_start = get_timer(0);
60 arp_request();
a36b12f9
JH
61 return 1; /* waiting */
62}
63
331db5a9 64static void ping_timeout_handler(void)
a36b12f9
JH
65{
66 eth_halt();
22f6e99d 67 net_set_state(NETLOOP_FAIL); /* we did not get the reply */
a36b12f9
JH
68}
69
a36b12f9
JH
70void ping_start(void)
71{
72 printf("Using %s device\n", eth_get_name());
bc0571fc 73 net_set_timeout_handler(10000UL, ping_timeout_handler);
a36b12f9
JH
74
75 ping_send();
76}
77
cb487f56 78void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)
a36b12f9 79{
e0a63079 80 struct icmp_hdr *icmph = (struct icmp_hdr *)&ip->udp_src;
049a95a7 81 struct in_addr src_ip;
e7111015 82 int eth_hdr_size;
ac3f26cc 83 uchar *tx_packet;
a36b12f9
JH
84
85 switch (icmph->type) {
86 case ICMP_ECHO_REPLY:
049a95a7
JH
87 src_ip = net_read_ip((void *)&ip->ip_src);
88 if (src_ip.s_addr == net_ping_ip.s_addr)
22f6e99d 89 net_set_state(NETLOOP_SUCCESS);
a36b12f9
JH
90 return;
91 case ICMP_ECHO_REQUEST:
e7111015 92 eth_hdr_size = net_update_ether(et, et->et_src, PROT_IP);
a36b12f9 93
331db5a9
JH
94 debug_cond(DEBUG_DEV_PKT,
95 "Got ICMP ECHO REQUEST, return %d bytes\n",
96 eth_hdr_size + len);
a36b12f9
JH
97
98 ip->ip_sum = 0;
99 ip->ip_off = 0;
049a95a7
JH
100 net_copy_ip((void *)&ip->ip_dst, &ip->ip_src);
101 net_copy_ip((void *)&ip->ip_src, &net_ip);
0da0fcd5 102 ip->ip_sum = compute_ip_checksum(ip, IP_HDR_SIZE);
a36b12f9
JH
103
104 icmph->type = ICMP_ECHO_REPLY;
105 icmph->checksum = 0;
0da0fcd5 106 icmph->checksum = compute_ip_checksum(icmph, len - IP_HDR_SIZE);
ac3f26cc
JH
107
108 tx_packet = net_get_async_tx_pkt_buf();
109 memcpy(tx_packet, et, eth_hdr_size + len);
110 net_send_packet(tx_packet, eth_hdr_size + len);
a36b12f9
JH
111 return;
112/* default:
113 return;*/
114 }
115}
This page took 0.365451 seconds and 4 git commands to generate.