]>
git.ipfire.org Git - thirdparty/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)
46 /* XXX always send arp request */
48 memcpy(mac
, NetEtherNullAddr
, 6);
50 debug("sending ARP for %pI4\n", &NetPingIP
);
52 NetArpWaitPacketIP
= NetPingIP
;
53 NetArpWaitPacketMAC
= mac
;
55 pkt
= NetArpWaitTxPacket
;
56 pkt
+= NetSetEther(pkt
, mac
, PROT_IP
);
58 set_icmp_header(pkt
, NetPingIP
);
60 /* size of the waiting packet */
61 NetArpWaitTxPacketSize
=
62 (pkt
- NetArpWaitTxPacket
) + IP_HDR_SIZE
+ 8;
64 /* and do the ARP request */
66 NetArpWaitTimerStart
= get_timer(0);
68 return 1; /* waiting */
71 static void ping_timeout(void)
74 NetState
= NETLOOP_FAIL
; /* we did not get the reply */
77 static void ping_handler(uchar
*pkt
, unsigned dest
, IPaddr_t sip
,
78 unsigned src
, unsigned len
)
83 NetState
= NETLOOP_SUCCESS
;
88 printf("Using %s device\n", eth_get_name());
89 NetSetTimeout(10000UL, ping_timeout
);
90 NetSetHandler(ping_handler
);
95 void ping_receive(struct ethernet_hdr
*et
, struct ip_udp_hdr
*ip
, int len
)
97 struct icmp_hdr
*icmph
= (struct icmp_hdr
*)&ip
->udp_src
;
100 switch (icmph
->type
) {
101 case ICMP_ECHO_REPLY
:
103 * IP header OK. Pass the packet to the
106 /* XXX point to ip packet */
107 src_ip
= NetReadIP((void *)&ip
->ip_src
);
108 NetGetHandler()((uchar
*)ip
, 0, src_ip
, 0, 0);
110 case ICMP_ECHO_REQUEST
:
111 debug("Got ICMP ECHO REQUEST, return "
112 "%d bytes\n", ETHER_HDR_SIZE
+ len
);
114 memcpy(&et
->et_dest
[0], &et
->et_src
[0], 6);
115 memcpy(&et
->et_src
[0], NetOurEther
, 6);
119 NetCopyIP((void *)&ip
->ip_dst
, &ip
->ip_src
);
120 NetCopyIP((void *)&ip
->ip_src
, &NetOurIP
);
121 ip
->ip_sum
= ~NetCksum((uchar
*)ip
,
124 icmph
->type
= ICMP_ECHO_REPLY
;
126 icmph
->checksum
= ~NetCksum((uchar
*)icmph
,
127 (len
- IP_HDR_SIZE
) >> 1);
128 (void) eth_send((uchar
*)et
,
129 ETHER_HDR_SIZE
+ len
);