diff --git a/sys/shell/commands/sc_icmpv6_echo.c b/sys/shell/commands/sc_icmpv6_echo.c index ef5e5c4d18..80cf8acd9b 100644 --- a/sys/shell/commands/sc_icmpv6_echo.c +++ b/sys/shell/commands/sc_icmpv6_echo.c @@ -38,7 +38,11 @@ static char ipv6_str[NG_IPV6_ADDR_MAX_STR_LEN]; static void usage(char **argv) { - printf("%s [] []\n", argv[0]); + printf("%s [] [] []\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; - while ((count--) > 0) { + vtimer_now(&start); + + 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; }