|
|
|
@ -38,7 +38,11 @@ static char ipv6_str[NG_IPV6_ADDR_MAX_STR_LEN];
|
|
|
|
|
|
|
|
|
|
static void usage(char **argv)
|
|
|
|
|
{
|
|
|
|
|
printf("%s [<n>] <ipv6 addr> [<payload_len>]\n", argv[0]);
|
|
|
|
|
printf("%s [<count>] <ipv6 addr> [<payload_len>] [<delay in ms>]\n", argv[0]);
|
|
|
|
|
puts("defaults:");
|
|
|
|
|
puts(" count = 3");
|
|
|
|
|
puts(" payload_len = 4");
|
|
|
|
|
puts(" delay = 1000");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void _set_payload(ng_icmpv6_echo_t *hdr, size_t payload_len)
|
|
|
|
@ -116,8 +120,9 @@ int _handle_reply(ng_pktsnip_t *pkt, uint64_t time)
|
|
|
|
|
|
|
|
|
|
int _icmpv6_ping(int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
int n = 3, success = 0, count;
|
|
|
|
|
int count = 3, success = 0, remaining;
|
|
|
|
|
size_t payload_len = 4;
|
|
|
|
|
timex_t delay = { 1, 0 };
|
|
|
|
|
char *addr_str;
|
|
|
|
|
ng_ipv6_addr_t addr;
|
|
|
|
|
ng_netreg_entry_t *ipv6_entry, my_entry = { NULL, NG_ICMPV6_ECHO_REP,
|
|
|
|
@ -125,8 +130,10 @@ int _icmpv6_ping(int argc, char **argv)
|
|
|
|
|
};
|
|
|
|
|
timex_t min_rtt = { UINT32_MAX, UINT32_MAX }, max_rtt = { 0, 0 };
|
|
|
|
|
timex_t sum_rtt = { 0, 0 };
|
|
|
|
|
timex_t start, stop;
|
|
|
|
|
|
|
|
|
|
switch (argc) {
|
|
|
|
|
case 0:
|
|
|
|
|
case 1:
|
|
|
|
|
usage(argv);
|
|
|
|
|
return 1;
|
|
|
|
@ -136,15 +143,42 @@ int _icmpv6_ping(int argc, char **argv)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 3:
|
|
|
|
|
n = atoi(argv[1]);
|
|
|
|
|
addr_str = argv[2];
|
|
|
|
|
count = atoi(argv[1]);
|
|
|
|
|
if (count > 0) {
|
|
|
|
|
addr_str = argv[2];
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
count = 3;
|
|
|
|
|
addr_str = argv[1];
|
|
|
|
|
payload_len = atoi(argv[2]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 4:
|
|
|
|
|
count = atoi(argv[1]);
|
|
|
|
|
if (count > 0) {
|
|
|
|
|
addr_str = argv[2];
|
|
|
|
|
payload_len = atoi(argv[3]);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
count = 3;
|
|
|
|
|
addr_str = argv[1];
|
|
|
|
|
payload_len = atoi(argv[2]);
|
|
|
|
|
delay.seconds = 0;
|
|
|
|
|
delay.microseconds = atoi(argv[3]) * 1000;
|
|
|
|
|
timex_normalize(&delay);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 5:
|
|
|
|
|
default:
|
|
|
|
|
n = atoi(argv[1]);
|
|
|
|
|
count = atoi(argv[1]);
|
|
|
|
|
addr_str = argv[2];
|
|
|
|
|
payload_len = atoi(argv[3]);
|
|
|
|
|
delay.seconds = 0;
|
|
|
|
|
delay.microseconds = atoi(argv[4]) * 1000;
|
|
|
|
|
timex_normalize(&delay);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -165,9 +199,11 @@ int _icmpv6_ping(int argc, char **argv)
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
count = n;
|
|
|
|
|
remaining = count;
|
|
|
|
|
|
|
|
|
|
vtimer_now(&start);
|
|
|
|
|
|
|
|
|
|
while ((count--) > 0) {
|
|
|
|
|
while ((remaining--) > 0) {
|
|
|
|
|
msg_t msg;
|
|
|
|
|
ng_pktsnip_t *pkt;
|
|
|
|
|
timex_t start, stop, timeout = { 5, 0 };
|
|
|
|
@ -224,10 +260,17 @@ int _icmpv6_ping(int argc, char **argv)
|
|
|
|
|
else {
|
|
|
|
|
puts("ping timeout");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (remaining > 0) {
|
|
|
|
|
vtimer_sleep(delay);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vtimer_now(&stop);
|
|
|
|
|
|
|
|
|
|
max_seq_expected = 0;
|
|
|
|
|
id++;
|
|
|
|
|
stop = timex_sub(stop, start);
|
|
|
|
|
|
|
|
|
|
ng_netreg_unregister(NG_NETTYPE_ICMPV6, &my_entry);
|
|
|
|
|
|
|
|
|
@ -236,10 +279,9 @@ int _icmpv6_ping(int argc, char **argv)
|
|
|
|
|
if (success > 0) {
|
|
|
|
|
timex_normalize(&sum_rtt);
|
|
|
|
|
printf("%d packets transmitted, %d received, %d%% packet loss, time %"
|
|
|
|
|
PRIu32 ".06%" PRIu32 " s\n", n, success,
|
|
|
|
|
(100 - ((success * 100) / n)),
|
|
|
|
|
sum_rtt.seconds, sum_rtt.microseconds);
|
|
|
|
|
timex_t avg_rtt = timex_from_uint64(timex_uint64(sum_rtt) / n); /* get average */
|
|
|
|
|
PRIu32 ".06%" PRIu32 " s\n", count, success,
|
|
|
|
|
(100 - ((success * 100) / count)), stop.seconds, stop.microseconds);
|
|
|
|
|
timex_t avg_rtt = timex_from_uint64(timex_uint64(sum_rtt) / count); /* get average */
|
|
|
|
|
printf("rtt min/avg/max = "
|
|
|
|
|
"%" PRIu32 ".%03" PRIu32 "/"
|
|
|
|
|
"%" PRIu32 ".%03" PRIu32 "/"
|
|
|
|
@ -252,7 +294,7 @@ int _icmpv6_ping(int argc, char **argv)
|
|
|
|
|
max_rtt.microseconds % MS_IN_USEC);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
printf("%d packets transmitted, 0 received, 100%% packet loss\n", n);
|
|
|
|
|
printf("%d packets transmitted, 0 received, 100%% packet loss\n", count);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|