diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-02-13 23:53:24 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-02-13 23:53:24 +0100 |
commit | 256adb0f99ab3485b4c9243a76dc0df1738f08b1 (patch) | |
tree | 61c2a8b06115d783de3fca34e29962a041c8016b | |
parent | 7189af847fd8a54a85f08e9bf51cd103f0d87393 (diff) | |
download | busybox-256adb0f99ab3485b4c9243a76dc0df1738f08b1.tar.gz |
ping: don't call monotonic_us twice per sending the ping
function old new delta
sendping6 80 85 +5
sendping4 106 111 +5
sendping_tail 209 204 -5
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 10/-5) Total: 5 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/ping.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/networking/ping.c b/networking/ping.c index bf750d032..8f85d3ec2 100644 --- a/networking/ping.c +++ b/networking/ping.c @@ -380,7 +380,8 @@ struct globals { uint8_t pattern; unsigned tmin, tmax; /* in us */ unsigned long long tsum; /* in us, sum of all times */ - unsigned deadline_ms; + unsigned cur_us; /* low word only, we don't need more */ + unsigned deadline_us; unsigned timeout; unsigned sizeof_rcv_packet; char *rcv_packet; /* [datalen + MAXIPLEN + MAXICMPLEN] */ @@ -455,7 +456,7 @@ static void print_stats_and_exit(int junk UNUSED_PARAM) tmax / 1000, tmax % 1000); } /* if condition is true, exit with 1 -- 'failure' */ - exit(nrecv == 0 || (G.deadline_ms && nrecv < pingcount)); + exit(nrecv == 0 || (G.deadline_us && nrecv < pingcount)); } static void sendping_tail(void (*sp)(int), int size_pkt) @@ -467,8 +468,8 @@ static void sendping_tail(void (*sp)(int), int size_pkt) size_pkt += datalen; - if (G.deadline_ms) { - unsigned n = ((unsigned)monotonic_ms()) - G.deadline_ms; + if (G.deadline_us) { + unsigned n = G.cur_us - G.deadline_us; if ((int)n >= 0) print_stats_and_exit(0); } @@ -517,7 +518,7 @@ static void sendping4(int junk UNUSED_PARAM) */ /*if (datalen >= 4)*/ /* No hton: we'll read it back on the same machine */ - *(uint32_t*)&pkt->icmp_dun = monotonic_us(); + *(uint32_t*)&pkt->icmp_dun = G.cur_us = monotonic_us(); pkt->icmp_cksum = inet_cksum((uint16_t *) pkt, datalen + ICMP_MINLEN); @@ -536,7 +537,7 @@ static void sendping6(int junk UNUSED_PARAM) pkt->icmp6_id = myid; /*if (datalen >= 4)*/ - *(bb__aliased_uint32_t*)(&pkt->icmp6_data8[4]) = monotonic_us(); + *(bb__aliased_uint32_t*)(&pkt->icmp6_data8[4]) = G.cur_us = monotonic_us(); //TODO? pkt->icmp_cksum = inet_cksum(...); @@ -891,7 +892,7 @@ static int common_ping_main(int opt, char **argv) OPT_STRING /* exactly one arg; -v and -q don't mix */ "\0" "=1:q--v:v--q", - &pingcount, &str_s, &opt_ttl, &G.deadline_ms, &timeout, &str_I, &str_p + &pingcount, &str_s, &opt_ttl, &G.deadline_us, &timeout, &str_I, &str_p ); if (opt & OPT_s) datalen = xatou16(str_s); // -s @@ -905,9 +906,9 @@ static int common_ping_main(int opt, char **argv) } if (opt & OPT_p) G.pattern = xstrtou_range(str_p, 16, 0, 255); - if (G.deadline_ms) { - unsigned d = G.deadline_ms < INT_MAX/1000 ? G.deadline_ms : INT_MAX/1000; - G.deadline_ms = 1 | ((d * 1000) + monotonic_ms()); + if (G.deadline_us) { + unsigned d = G.deadline_us < INT_MAX/1000000 ? G.deadline_us : INT_MAX/1000000; + G.deadline_us = 1 | ((d * 1000000) + monotonic_us()); } myid = (uint16_t) getpid(); |