8 static uint16_t ping_sequence_number
;
10 static IPaddr_t net_ping_ip
; /* the ip address to ping */
12 #define PING_STATE_INIT 0
13 #define PING_STATE_SUCCESS 1
15 static int ping_state
;
17 static struct net_connection
*ping_con
;
19 static int ping_send(void)
21 unsigned char *payload
;
25 icmp
= ping_con
->icmp
;
27 icmp
->type
= ICMP_ECHO_REQUEST
;
31 icmp
->un
.echo
.sequence
= htons(ping_sequence_number
);
33 ping_sequence_number
++;
35 payload
= (char *)(icmp
+ 1);
37 memcpy(payload
, &ts
, sizeof(ts
));
40 return net_icmp_send(ping_con
, 9);
43 void ping_handler(char *pkt
, unsigned len
)
46 struct iphdr
*ip
= net_eth_to_iphdr(pkt
);
48 tmp
= net_read_ip((void *)&ip
->saddr
);
49 if (tmp
!= net_ping_ip
)
52 ping_state
= PING_STATE_SUCCESS
;
55 int do_ping(struct command
*cmdtp
, int argc
, char *argv
[])
58 uint64_t ping_start
= 0;
61 return COMMAND_ERROR_USAGE
;
63 net_ping_ip
= resolv(argv
[1]);
65 printf("unknown host %s\n", argv
[1]);
69 ping_con
= net_icmp_new(net_ping_ip
, ping_handler
);
70 if (IS_ERR(ping_con
)) {
71 ret
= PTR_ERR(ping_con
);
75 ping_start
= get_time_ns();
80 ping_state
= PING_STATE_INIT
;
81 ping_sequence_number
= 0;
83 while (ping_state
== PING_STATE_INIT
) {
91 if (is_timeout(ping_start
, 10 * SECOND
)) {
92 ping_start
= get_time_ns();
100 printf("host %s is alive\n", argv
[1]);
103 net_unregister(ping_con
);
106 printf("ping failed: %s\n", strerror(-ret
));
107 return ping_state
== PING_STATE_SUCCESS
? 0 : 1;
110 BAREBOX_CMD_START(ping
)
112 .usage
= "ping <destination>",