]>
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
14 static ushort PingSeqNo
;
16 /* The ip address to ping */
19 static void set_icmp_header(uchar
*pkt
, IPaddr_t dest
)
22 * Construct an IP and ICMP header.
24 struct ip_hdr
*ip
= (struct ip_hdr
*)pkt
;
25 struct icmp_hdr
*icmp
= (struct icmp_hdr
*)(pkt
+ IP_HDR_SIZE
);
27 net_set_ip_header(pkt
, dest
, NetOurIP
);
29 ip
->ip_len
= htons(IP_ICMP_HDR_SIZE
);
30 ip
->ip_p
= IPPROTO_ICMP
;
31 ip
->ip_sum
= ~NetCksum((uchar
*)ip
, IP_HDR_SIZE
>> 1);
33 icmp
->type
= ICMP_ECHO_REQUEST
;
37 icmp
->un
.echo
.sequence
= htons(PingSeqNo
++);
38 icmp
->checksum
= ~NetCksum((uchar
*)icmp
, ICMP_HDR_SIZE
>> 1);
41 static int ping_send(void)
47 /* XXX always send arp request */
49 memcpy(mac
, NetEtherNullAddr
, 6);
51 debug("sending ARP for %pI4\n", &NetPingIP
);
53 NetArpWaitPacketIP
= NetPingIP
;
54 NetArpWaitPacketMAC
= mac
;
56 pkt
= NetArpWaitTxPacket
;
57 eth_hdr_size
= NetSetEther(pkt
, mac
, PROT_IP
);
60 set_icmp_header(pkt
, NetPingIP
);
62 /* size of the waiting packet */
63 NetArpWaitTxPacketSize
= eth_hdr_size
+ IP_ICMP_HDR_SIZE
;
65 /* and do the ARP request */
67 NetArpWaitTimerStart
= get_timer(0);
69 return 1; /* waiting */
72 static void ping_timeout(void)
75 NetState
= NETLOOP_FAIL
; /* we did not get the reply */
80 printf("Using %s device\n", eth_get_name());
81 NetSetTimeout(10000UL, ping_timeout
);
86 void ping_receive(struct ethernet_hdr
*et
, struct ip_udp_hdr
*ip
, int len
)
88 struct icmp_hdr
*icmph
= (struct icmp_hdr
*)&ip
->udp_src
;
91 switch (icmph
->type
) {
93 src_ip
= NetReadIP((void *)&ip
->ip_src
);
94 if (src_ip
== NetPingIP
)
95 NetState
= NETLOOP_SUCCESS
;
97 case ICMP_ECHO_REQUEST
:
98 debug("Got ICMP ECHO REQUEST, return "
99 "%d bytes\n", ETHER_HDR_SIZE
+ len
);
101 memcpy(&et
->et_dest
[0], &et
->et_src
[0], 6);
102 memcpy(&et
->et_src
[0], NetOurEther
, 6);
106 NetCopyIP((void *)&ip
->ip_dst
, &ip
->ip_src
);
107 NetCopyIP((void *)&ip
->ip_src
, &NetOurIP
);
108 ip
->ip_sum
= ~NetCksum((uchar
*)ip
,
111 icmph
->type
= ICMP_ECHO_REPLY
;
113 icmph
->checksum
= ~NetCksum((uchar
*)icmph
,
114 (len
- IP_HDR_SIZE
) >> 1);
115 NetSendPacket((uchar
*)et
, ETHER_HDR_SIZE
+ len
);