diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-06-17 23:40:26 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-06-17 23:40:26 +0000 |
| commit | bd7bb299c0e9ee5ff52c9d12b46fb14a907b34da (patch) | |
| tree | 117a635e9457e1a932bc64941db5869e33179fc9 | |
| parent | 459be35234cc24b69309eb0ee22600024c73713e (diff) | |
| download | busybox-w32-bd7bb299c0e9ee5ff52c9d12b46fb14a907b34da.tar.gz busybox-w32-bd7bb299c0e9ee5ff52c9d12b46fb14a907b34da.tar.bz2 busybox-w32-bd7bb299c0e9ee5ff52c9d12b46fb14a907b34da.zip | |
wget: use monotonic_sec instead of gettimeofday
zcip: use monotonic_us instead of gettimeofday
udhcpcd: simpler, shorter random_xid()
function old new delta
monotonic_sec - 41 +41
find_pair 164 180 +16
run_list_real 2018 2028 +10
cmp_main 547 555 +8
collect_ctx 112 119 +7
singlemount 4544 4549 +5
time_main 1124 1128 +4
static.start_sec - 4 +4
static.lastupdate_sec - 4 +4
sock - 4 +4
read_package_field 253 257 +4
pick 38 40 +2
get_next_line 145 147 +2
count_lines 59 61 +2
process_stdin 435 433 -2
xstrtoul_range_sfx 229 226 -3
static.initialized 4 1 -3
dhcprelay_main 1125 1122 -3
catcher 380 377 -3
arping_main 1969 1966 -3
s 8 4 -4
cfg 4 - -4
static.lastupdate 8 - -8
start 8 - -8
random_xid 95 33 -62
.rodata 129114 129050 -64
zcip_main 1731 1576 -155
progressmeter 1035 867 -168
------------------------------------------------------------------------------
(add/remove: 4/3 grow/shrink: 10/11 up/down: 113/-490) Total: -377 bytes
| -rw-r--r-- | include/libbb.h | 1 | ||||
| -rw-r--r-- | libbb/time.c | 15 | ||||
| -rw-r--r-- | miscutils/time.c | 7 | ||||
| -rw-r--r-- | networking/arping.c | 83 | ||||
| -rw-r--r-- | networking/udhcp/clientpacket.c | 16 | ||||
| -rw-r--r-- | networking/udhcp/dhcpc.h | 2 | ||||
| -rw-r--r-- | networking/wget.c | 56 | ||||
| -rw-r--r-- | networking/zcip.c | 115 |
8 files changed, 151 insertions, 144 deletions
diff --git a/include/libbb.h b/include/libbb.h index 2a50bce66..3c9f9fe81 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -201,6 +201,7 @@ struct sysinfo { | |||
| 201 | int sysinfo(struct sysinfo* info); | 201 | int sysinfo(struct sysinfo* info); |
| 202 | 202 | ||
| 203 | unsigned long long monotonic_us(void); | 203 | unsigned long long monotonic_us(void); |
| 204 | unsigned monotonic_sec(void); | ||
| 204 | 205 | ||
| 205 | extern void chomp(char *s); | 206 | extern void chomp(char *s); |
| 206 | extern void trim(char *s); | 207 | extern void trim(char *s); |
diff --git a/libbb/time.c b/libbb/time.c index f2a741521..3e35542f3 100644 --- a/libbb/time.c +++ b/libbb/time.c | |||
| @@ -21,12 +21,23 @@ unsigned long long monotonic_us(void) | |||
| 21 | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); | 21 | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); |
| 22 | return ts.tv_sec * 1000000ULL + ts.tv_nsec/1000; | 22 | return ts.tv_sec * 1000000ULL + ts.tv_nsec/1000; |
| 23 | } | 23 | } |
| 24 | unsigned monotonic_sec(void) | ||
| 25 | { | ||
| 26 | struct timespec ts; | ||
| 27 | if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts)) | ||
| 28 | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); | ||
| 29 | return ts.tv_sec; | ||
| 30 | } | ||
| 24 | #else | 31 | #else |
| 25 | unsigned long long monotonic_us(void) | 32 | unsigned long long monotonic_us(void) |
| 26 | { | 33 | { |
| 27 | struct timeval tv; | 34 | struct timeval tv; |
| 28 | if (gettimeofday(&tv, NULL)) | 35 | gettimeofday(&tv, NULL); |
| 29 | bb_error_msg_and_die("gettimeofday failed"); | ||
| 30 | return tv.tv_sec * 1000000ULL + tv_usec; | 36 | return tv.tv_sec * 1000000ULL + tv_usec; |
| 31 | } | 37 | } |
| 38 | |||
| 39 | unsigned monotonic_sec(void) | ||
| 40 | { | ||
| 41 | return time(NULL); | ||
| 42 | } | ||
| 32 | #endif | 43 | #endif |
diff --git a/miscutils/time.c b/miscutils/time.c index 578cb35ff..9b7db662a 100644 --- a/miscutils/time.c +++ b/miscutils/time.c | |||
| @@ -180,7 +180,12 @@ static void summarize(const char *fmt, char **command, resource_t * resp) | |||
| 180 | vv_ms = (resp->ru.ru_utime.tv_sec + resp->ru.ru_stime.tv_sec) * 1000 | 180 | vv_ms = (resp->ru.ru_utime.tv_sec + resp->ru.ru_stime.tv_sec) * 1000 |
| 181 | + (resp->ru.ru_utime.tv_usec + resp->ru.ru_stime.tv_usec) / 1000; | 181 | + (resp->ru.ru_utime.tv_usec + resp->ru.ru_stime.tv_usec) / 1000; |
| 182 | 182 | ||
| 183 | cpu_ticks = vv_ms * TICKS_PER_SEC / 1000; | 183 | #if (1000 / TICKS_PER_SEC) * TICKS_PER_SEC == 1000 |
| 184 | /* 1000 is exactly divisible by TICKS_PER_SEC */ | ||
| 185 | cpu_ticks = vv_ms / (1000 / TICKS_PER_SEC); | ||
| 186 | #else | ||
| 187 | cpu_ticks = vv_ms * (unsigned long long)TICKS_PER_SEC / 1000; | ||
| 188 | #endif | ||
| 184 | if (!cpu_ticks) cpu_ticks = 1; /* we divide by it, must be nonzero */ | 189 | if (!cpu_ticks) cpu_ticks = 1; /* we divide by it, must be nonzero */ |
| 185 | 190 | ||
| 186 | /* putchar() != putc(stdout) in glibc! */ | 191 | /* putchar() != putc(stdout) in glibc! */ |
diff --git a/networking/arping.c b/networking/arping.c index a022e70ea..7a9fbc2f4 100644 --- a/networking/arping.c +++ b/networking/arping.c | |||
| @@ -33,18 +33,17 @@ enum { | |||
| 33 | BCAST_ONLY = 32, | 33 | BCAST_ONLY = 32, |
| 34 | UNICASTING = 64 | 34 | UNICASTING = 64 |
| 35 | }; | 35 | }; |
| 36 | static int cfg; | ||
| 37 | 36 | ||
| 38 | static int s; | 37 | static int sock; |
| 39 | static unsigned count = UINT_MAX; | 38 | static unsigned count = UINT_MAX; |
| 40 | static unsigned timeout_us; | 39 | static unsigned timeout_us; |
| 41 | static int sent; | 40 | static unsigned sent; |
| 42 | static int brd_sent; | 41 | static unsigned brd_sent; |
| 43 | static int received; | 42 | static unsigned received; |
| 44 | static int brd_recv; | 43 | static unsigned brd_recv; |
| 45 | static int req_recv; | 44 | static unsigned req_recv; |
| 46 | 45 | ||
| 47 | static int send_pack(int sock, struct in_addr *src_addr, | 46 | static int send_pack(struct in_addr *src_addr, |
| 48 | struct in_addr *dst_addr, struct sockaddr_ll *ME, | 47 | struct in_addr *dst_addr, struct sockaddr_ll *ME, |
| 49 | struct sockaddr_ll *HE) | 48 | struct sockaddr_ll *HE) |
| 50 | { | 49 | { |
| @@ -59,7 +58,7 @@ static int send_pack(int sock, struct in_addr *src_addr, | |||
| 59 | ah->ar_pro = htons(ETH_P_IP); | 58 | ah->ar_pro = htons(ETH_P_IP); |
| 60 | ah->ar_hln = ME->sll_halen; | 59 | ah->ar_hln = ME->sll_halen; |
| 61 | ah->ar_pln = 4; | 60 | ah->ar_pln = 4; |
| 62 | ah->ar_op = cfg & ADVERT ? htons(ARPOP_REPLY) : htons(ARPOP_REQUEST); | 61 | ah->ar_op = option_mask32 & ADVERT ? htons(ARPOP_REPLY) : htons(ARPOP_REQUEST); |
| 63 | 62 | ||
| 64 | memcpy(p, &ME->sll_addr, ah->ar_hln); | 63 | memcpy(p, &ME->sll_addr, ah->ar_hln); |
| 65 | p += ME->sll_halen; | 64 | p += ME->sll_halen; |
| @@ -67,7 +66,7 @@ static int send_pack(int sock, struct in_addr *src_addr, | |||
| 67 | memcpy(p, src_addr, 4); | 66 | memcpy(p, src_addr, 4); |
| 68 | p += 4; | 67 | p += 4; |
| 69 | 68 | ||
| 70 | if (cfg & ADVERT) | 69 | if (option_mask32 & ADVERT) |
| 71 | memcpy(p, &ME->sll_addr, ah->ar_hln); | 70 | memcpy(p, &ME->sll_addr, ah->ar_hln); |
| 72 | else | 71 | else |
| 73 | memcpy(p, &HE->sll_addr, ah->ar_hln); | 72 | memcpy(p, &HE->sll_addr, ah->ar_hln); |
| @@ -81,7 +80,7 @@ static int send_pack(int sock, struct in_addr *src_addr, | |||
| 81 | if (err == p - buf) { | 80 | if (err == p - buf) { |
| 82 | last = now; | 81 | last = now; |
| 83 | sent++; | 82 | sent++; |
| 84 | if (!(cfg & UNICASTING)) | 83 | if (!(option_mask32 & UNICASTING)) |
| 85 | brd_sent++; | 84 | brd_sent++; |
| 86 | } | 85 | } |
| 87 | return err; | 86 | return err; |
| @@ -90,17 +89,17 @@ static int send_pack(int sock, struct in_addr *src_addr, | |||
| 90 | static void finish(void) ATTRIBUTE_NORETURN; | 89 | static void finish(void) ATTRIBUTE_NORETURN; |
| 91 | static void finish(void) | 90 | static void finish(void) |
| 92 | { | 91 | { |
| 93 | if (!(cfg & QUIET)) { | 92 | if (!(option_mask32 & QUIET)) { |
| 94 | printf("Sent %d probe(s) (%d broadcast(s))\n" | 93 | printf("Sent %u probe(s) (%u broadcast(s))\n" |
| 95 | "Received %d repl%s" | 94 | "Received %u repl%s" |
| 96 | " (%d request(s), %d broadcast(s))\n", | 95 | " (%u request(s), %u broadcast(s))\n", |
| 97 | sent, brd_sent, | 96 | sent, brd_sent, |
| 98 | received, (received == 1) ? "ies" : "y", | 97 | received, (received == 1) ? "ies" : "y", |
| 99 | req_recv, brd_recv); | 98 | req_recv, brd_recv); |
| 100 | } | 99 | } |
| 101 | if (cfg & DAD) | 100 | if (option_mask32 & DAD) |
| 102 | exit(!!received); | 101 | exit(!!received); |
| 103 | if (cfg & UNSOLICITED) | 102 | if (option_mask32 & UNSOLICITED) |
| 104 | exit(0); | 103 | exit(0); |
| 105 | exit(!received); | 104 | exit(!received); |
| 106 | } | 105 | } |
| @@ -121,8 +120,8 @@ static void catcher(void) | |||
| 121 | count--; | 120 | count--; |
| 122 | 121 | ||
| 123 | if (last == 0 || (now - last) > 500000) { | 122 | if (last == 0 || (now - last) > 500000) { |
| 124 | send_pack(s, &src, &dst, &me, &he); | 123 | send_pack(&src, &dst, &me, &he); |
| 125 | if (count == 0 && (cfg & UNSOLICITED)) | 124 | if (count == 0 && (option_mask32 & UNSOLICITED)) |
| 126 | finish(); | 125 | finish(); |
| 127 | } | 126 | } |
| 128 | alarm(1); | 127 | alarm(1); |
| @@ -160,7 +159,7 @@ static int recv_pack(unsigned char *buf, int len, struct sockaddr_ll *FROM) | |||
| 160 | return 0; | 159 | return 0; |
| 161 | memcpy(&src_ip, p + ah->ar_hln, 4); | 160 | memcpy(&src_ip, p + ah->ar_hln, 4); |
| 162 | memcpy(&dst_ip, p + ah->ar_hln + 4 + ah->ar_hln, 4); | 161 | memcpy(&dst_ip, p + ah->ar_hln + 4 + ah->ar_hln, 4); |
| 163 | if (!(cfg & DAD)) { | 162 | if (!(option_mask32 & DAD)) { |
| 164 | if (src_ip.s_addr != dst.s_addr) | 163 | if (src_ip.s_addr != dst.s_addr) |
| 165 | return 0; | 164 | return 0; |
| 166 | if (src.s_addr != dst_ip.s_addr) | 165 | if (src.s_addr != dst_ip.s_addr) |
| @@ -188,7 +187,7 @@ static int recv_pack(unsigned char *buf, int len, struct sockaddr_ll *FROM) | |||
| 188 | if (src.s_addr && src.s_addr != dst_ip.s_addr) | 187 | if (src.s_addr && src.s_addr != dst_ip.s_addr) |
| 189 | return 0; | 188 | return 0; |
| 190 | } | 189 | } |
| 191 | if (!(cfg & QUIET)) { | 190 | if (!(option_mask32 & QUIET)) { |
| 192 | int s_printed = 0; | 191 | int s_printed = 0; |
| 193 | 192 | ||
| 194 | printf("%scast re%s from %s [%s]", | 193 | printf("%scast re%s from %s [%s]", |
| @@ -219,11 +218,11 @@ static int recv_pack(unsigned char *buf, int len, struct sockaddr_ll *FROM) | |||
| 219 | brd_recv++; | 218 | brd_recv++; |
| 220 | if (ah->ar_op == htons(ARPOP_REQUEST)) | 219 | if (ah->ar_op == htons(ARPOP_REQUEST)) |
| 221 | req_recv++; | 220 | req_recv++; |
| 222 | if (cfg & QUIT_ON_REPLY) | 221 | if (option_mask32 & QUIT_ON_REPLY) |
| 223 | finish(); | 222 | finish(); |
| 224 | if (!(cfg & BCAST_ONLY)) { | 223 | if (!(option_mask32 & BCAST_ONLY)) { |
| 225 | memcpy(he.sll_addr, p, me.sll_halen); | 224 | memcpy(he.sll_addr, p, me.sll_halen); |
| 226 | cfg |= UNICASTING; | 225 | option_mask32 |= UNICASTING; |
| 227 | } | 226 | } |
| 228 | return 1; | 227 | return 1; |
| 229 | } | 228 | } |
| @@ -237,32 +236,32 @@ int arping_main(int argc, char **argv) | |||
| 237 | char *target; | 236 | char *target; |
| 238 | unsigned char *packet; | 237 | unsigned char *packet; |
| 239 | 238 | ||
| 240 | s = xsocket(PF_PACKET, SOCK_DGRAM, 0); | 239 | sock = xsocket(PF_PACKET, SOCK_DGRAM, 0); |
| 241 | 240 | ||
| 242 | // Drop suid root privileges | 241 | // Drop suid root privileges |
| 243 | xsetuid(getuid()); | 242 | xsetuid(getuid()); |
| 244 | 243 | ||
| 245 | { | 244 | { |
| 246 | unsigned opt; | 245 | unsigned opt; |
| 247 | char *_count, *_timeout; | 246 | char *str_count, *str_timeout; |
| 248 | 247 | ||
| 249 | /* Dad also sets quit_on_reply. | 248 | /* Dad also sets quit_on_reply. |
| 250 | * Advert also sets unsolicited. | 249 | * Advert also sets unsolicited. |
| 251 | */ | 250 | */ |
| 252 | opt_complementary = "=1:Df:AU"; | 251 | opt_complementary = "=1:Df:AU"; |
| 253 | opt = getopt32(argc, argv, "DUAqfbc:w:I:s:", | 252 | opt = getopt32(argc, argv, "DUAqfbc:w:I:s:", |
| 254 | &_count, &_timeout, &device, &source); | 253 | &str_count, &str_timeout, &device, &source); |
| 255 | cfg |= opt & 0x3f; /* set respective flags */ | ||
| 256 | if (opt & 0x40) /* -c: count */ | 254 | if (opt & 0x40) /* -c: count */ |
| 257 | count = xatou(_count); | 255 | count = xatou(str_count); |
| 258 | if (opt & 0x80) /* -w: timeout */ | 256 | if (opt & 0x80) /* -w: timeout */ |
| 259 | timeout_us = xatou_range(_timeout, 0, INT_MAX/2000000) * 1000000; | 257 | timeout_us = xatou_range(str_timeout, 0, INT_MAX/2000000) * 1000000; |
| 260 | //if (opt & 0x100) /* -I: interface */ | 258 | //if (opt & 0x100) /* -I: interface */ |
| 261 | if (strlen(device) >= IF_NAMESIZE) { | 259 | if (strlen(device) >= IF_NAMESIZE) { |
| 262 | bb_error_msg_and_die("interface name '%s' is too long", | 260 | bb_error_msg_and_die("interface name '%s' is too long", |
| 263 | device); | 261 | device); |
| 264 | } | 262 | } |
| 265 | //if (opt & 0x200) /* -s: source */ | 263 | //if (opt & 0x200) /* -s: source */ |
| 264 | option_mask32 &= 0x3f; /* set respective flags */ | ||
| 266 | } | 265 | } |
| 267 | 266 | ||
| 268 | target = argv[optind]; | 267 | target = argv[optind]; |
| @@ -274,12 +273,12 @@ int arping_main(int argc, char **argv) | |||
| 274 | 273 | ||
| 275 | memset(&ifr, 0, sizeof(ifr)); | 274 | memset(&ifr, 0, sizeof(ifr)); |
| 276 | strncpy(ifr.ifr_name, device, IFNAMSIZ - 1); | 275 | strncpy(ifr.ifr_name, device, IFNAMSIZ - 1); |
| 277 | if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) { | 276 | if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) { |
| 278 | bb_error_msg_and_die("interface %s not found", device); | 277 | bb_error_msg_and_die("interface %s not found", device); |
| 279 | } | 278 | } |
| 280 | ifindex = ifr.ifr_ifindex; | 279 | ifindex = ifr.ifr_ifindex; |
| 281 | 280 | ||
| 282 | if (ioctl(s, SIOCGIFFLAGS, (char *) &ifr)) { | 281 | if (ioctl(sock, SIOCGIFFLAGS, (char *) &ifr)) { |
| 283 | bb_error_msg_and_die("SIOCGIFFLAGS"); | 282 | bb_error_msg_and_die("SIOCGIFFLAGS"); |
| 284 | } | 283 | } |
| 285 | if (!(ifr.ifr_flags & IFF_UP)) { | 284 | if (!(ifr.ifr_flags & IFF_UP)) { |
| @@ -287,7 +286,7 @@ int arping_main(int argc, char **argv) | |||
| 287 | } | 286 | } |
| 288 | if (ifr.ifr_flags & (IFF_NOARP | IFF_LOOPBACK)) { | 287 | if (ifr.ifr_flags & (IFF_NOARP | IFF_LOOPBACK)) { |
| 289 | bb_error_msg("interface %s is not ARPable", device); | 288 | bb_error_msg("interface %s is not ARPable", device); |
| 290 | return (cfg & DAD ? 0 : 2); | 289 | return (option_mask32 & DAD ? 0 : 2); |
| 291 | } | 290 | } |
| 292 | } | 291 | } |
| 293 | 292 | ||
| @@ -303,10 +302,10 @@ int arping_main(int argc, char **argv) | |||
| 303 | bb_error_msg_and_die("invalid source address %s", source); | 302 | bb_error_msg_and_die("invalid source address %s", source); |
| 304 | } | 303 | } |
| 305 | 304 | ||
| 306 | if (!(cfg & DAD) && (cfg & UNSOLICITED) && src.s_addr == 0) | 305 | if (!(option_mask32 & DAD) && (option_mask32 & UNSOLICITED) && src.s_addr == 0) |
| 307 | src = dst; | 306 | src = dst; |
| 308 | 307 | ||
| 309 | if (!(cfg & DAD) || src.s_addr) { | 308 | if (!(option_mask32 & DAD) || src.s_addr) { |
| 310 | struct sockaddr_in saddr; | 309 | struct sockaddr_in saddr; |
| 311 | int probe_fd = xsocket(AF_INET, SOCK_DGRAM, 0); | 310 | int probe_fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
| 312 | 311 | ||
| @@ -319,7 +318,7 @@ int arping_main(int argc, char **argv) | |||
| 319 | if (src.s_addr) { | 318 | if (src.s_addr) { |
| 320 | saddr.sin_addr = src; | 319 | saddr.sin_addr = src; |
| 321 | xbind(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); | 320 | xbind(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); |
| 322 | } else if (!(cfg & DAD)) { | 321 | } else if (!(option_mask32 & DAD)) { |
| 323 | socklen_t alen = sizeof(saddr); | 322 | socklen_t alen = sizeof(saddr); |
| 324 | 323 | ||
| 325 | saddr.sin_port = htons(1025); | 324 | saddr.sin_port = htons(1025); |
| @@ -339,29 +338,29 @@ int arping_main(int argc, char **argv) | |||
| 339 | me.sll_family = AF_PACKET; | 338 | me.sll_family = AF_PACKET; |
| 340 | me.sll_ifindex = ifindex; | 339 | me.sll_ifindex = ifindex; |
| 341 | me.sll_protocol = htons(ETH_P_ARP); | 340 | me.sll_protocol = htons(ETH_P_ARP); |
| 342 | xbind(s, (struct sockaddr *) &me, sizeof(me)); | 341 | xbind(sock, (struct sockaddr *) &me, sizeof(me)); |
| 343 | 342 | ||
| 344 | { | 343 | { |
| 345 | socklen_t alen = sizeof(me); | 344 | socklen_t alen = sizeof(me); |
| 346 | 345 | ||
| 347 | if (getsockname(s, (struct sockaddr *) &me, &alen) == -1) { | 346 | if (getsockname(sock, (struct sockaddr *) &me, &alen) == -1) { |
| 348 | bb_error_msg_and_die("getsockname"); | 347 | bb_error_msg_and_die("getsockname"); |
| 349 | } | 348 | } |
| 350 | } | 349 | } |
| 351 | if (me.sll_halen == 0) { | 350 | if (me.sll_halen == 0) { |
| 352 | bb_error_msg("interface \"%s\" is not ARPable (no ll address)", device); | 351 | bb_error_msg("interface \"%s\" is not ARPable (no ll address)", device); |
| 353 | return (cfg & DAD ? 0 : 2); | 352 | return (option_mask32 & DAD ? 0 : 2); |
| 354 | } | 353 | } |
| 355 | he = me; | 354 | he = me; |
| 356 | memset(he.sll_addr, -1, he.sll_halen); | 355 | memset(he.sll_addr, -1, he.sll_halen); |
| 357 | 356 | ||
| 358 | if (!(cfg & QUIET)) { | 357 | if (!(option_mask32 & QUIET)) { |
| 359 | printf("ARPING to %s from %s via %s\n", | 358 | printf("ARPING to %s from %s via %s\n", |
| 360 | inet_ntoa(dst), inet_ntoa(src), | 359 | inet_ntoa(dst), inet_ntoa(src), |
| 361 | device ? device : "unknown"); | 360 | device ? device : "unknown"); |
| 362 | } | 361 | } |
| 363 | 362 | ||
| 364 | if (!src.s_addr && !(cfg & DAD)) { | 363 | if (!src.s_addr && !(option_mask32 & DAD)) { |
| 365 | bb_error_msg_and_die("no src address in the non-DAD mode"); | 364 | bb_error_msg_and_die("no src address in the non-DAD mode"); |
| 366 | } | 365 | } |
| 367 | 366 | ||
| @@ -387,7 +386,7 @@ int arping_main(int argc, char **argv) | |||
| 387 | socklen_t alen = sizeof(from); | 386 | socklen_t alen = sizeof(from); |
| 388 | int cc; | 387 | int cc; |
| 389 | 388 | ||
| 390 | cc = recvfrom(s, packet, 4096, 0, (struct sockaddr *) &from, &alen); | 389 | cc = recvfrom(sock, packet, 4096, 0, (struct sockaddr *) &from, &alen); |
| 391 | if (cc < 0) { | 390 | if (cc < 0) { |
| 392 | bb_perror_msg("recvfrom"); | 391 | bb_perror_msg("recvfrom"); |
| 393 | continue; | 392 | continue; |
diff --git a/networking/udhcp/clientpacket.c b/networking/udhcp/clientpacket.c index 69d7f2d38..af97962a0 100644 --- a/networking/udhcp/clientpacket.c +++ b/networking/udhcp/clientpacket.c | |||
| @@ -25,19 +25,13 @@ | |||
| 25 | 25 | ||
| 26 | 26 | ||
| 27 | /* Create a random xid */ | 27 | /* Create a random xid */ |
| 28 | unsigned long random_xid(void) | 28 | unsigned random_xid(void) |
| 29 | { | 29 | { |
| 30 | static int initialized; | 30 | static smallint initialized; |
| 31 | |||
| 31 | if (!initialized) { | 32 | if (!initialized) { |
| 32 | unsigned long seed; | 33 | srand(monotonic_us()); |
| 33 | 34 | initialized = 1; | |
| 34 | if (open_read_close("/dev/urandom", &seed, sizeof(seed)) < 0) { | ||
| 35 | bb_info_msg("Cannot load seed " | ||
| 36 | "from /dev/urandom: %s", strerror(errno)); | ||
| 37 | seed = time(0); | ||
| 38 | } | ||
| 39 | srand(seed); | ||
| 40 | initialized++; | ||
| 41 | } | 35 | } |
| 42 | return rand(); | 36 | return rand(); |
| 43 | } | 37 | } |
diff --git a/networking/udhcp/dhcpc.h b/networking/udhcp/dhcpc.h index 4ddd12120..fa091bf72 100644 --- a/networking/udhcp/dhcpc.h +++ b/networking/udhcp/dhcpc.h | |||
| @@ -38,7 +38,7 @@ extern struct client_config_t client_config; | |||
| 38 | 38 | ||
| 39 | /*** clientpacket.h ***/ | 39 | /*** clientpacket.h ***/ |
| 40 | 40 | ||
| 41 | unsigned long random_xid(void); | 41 | unsigned random_xid(void); |
| 42 | int send_discover(unsigned long xid, unsigned long requested); | 42 | int send_discover(unsigned long xid, unsigned long requested); |
| 43 | int send_selecting(unsigned long xid, unsigned long server, unsigned long requested); | 43 | int send_selecting(unsigned long xid, unsigned long server, unsigned long requested); |
| 44 | int send_renew(unsigned long xid, unsigned long server, unsigned long ciaddr); | 44 | int send_renew(unsigned long xid, unsigned long server, unsigned long ciaddr); |
diff --git a/networking/wget.c b/networking/wget.c index fc7f7c32c..8be37a744 100644 --- a/networking/wget.c +++ b/networking/wget.c | |||
| @@ -38,7 +38,6 @@ static bool chunked; /* chunked transfer encoding */ | |||
| 38 | #if ENABLE_FEATURE_WGET_STATUSBAR | 38 | #if ENABLE_FEATURE_WGET_STATUSBAR |
| 39 | static void progressmeter(int flag); | 39 | static void progressmeter(int flag); |
| 40 | static const char *curfile; /* Name of current file being transferred */ | 40 | static const char *curfile; /* Name of current file being transferred */ |
| 41 | static struct timeval start; /* Time a transfer started */ | ||
| 42 | enum { | 41 | enum { |
| 43 | STALLTIME = 5 /* Seconds when xfer considered "stalled" */ | 42 | STALLTIME = 5 /* Seconds when xfer considered "stalled" */ |
| 44 | }; | 43 | }; |
| @@ -683,30 +682,30 @@ static void alarmtimer(int iwait) | |||
| 683 | setitimer(ITIMER_REAL, &itv, NULL); | 682 | setitimer(ITIMER_REAL, &itv, NULL); |
| 684 | } | 683 | } |
| 685 | 684 | ||
| 686 | |||
| 687 | static void | 685 | static void |
| 688 | progressmeter(int flag) | 686 | progressmeter(int flag) |
| 689 | { | 687 | { |
| 690 | static struct timeval lastupdate; | 688 | static unsigned lastupdate_sec; |
| 689 | static unsigned start_sec; | ||
| 691 | static off_t lastsize, totalsize; | 690 | static off_t lastsize, totalsize; |
| 692 | 691 | ||
| 693 | struct timeval now, td, tvwait; | ||
| 694 | off_t abbrevsize; | 692 | off_t abbrevsize; |
| 695 | int elapsed, ratio, barlength, i; | 693 | unsigned since_last_update, elapsed; |
| 694 | unsigned ratio; | ||
| 695 | int barlength, i; | ||
| 696 | 696 | ||
| 697 | if (flag == -1) { /* first call to progressmeter */ | 697 | if (flag == -1) { /* first call to progressmeter */ |
| 698 | gettimeofday(&start, NULL); | 698 | start_sec = monotonic_sec(); |
| 699 | lastupdate = start; | 699 | lastupdate_sec = start_sec; |
| 700 | lastsize = 0; | 700 | lastsize = 0; |
| 701 | totalsize = content_len + beg_range; /* as content_len changes.. */ | 701 | totalsize = content_len + beg_range; /* as content_len changes.. */ |
| 702 | } | 702 | } |
| 703 | 703 | ||
| 704 | gettimeofday(&now, NULL); | ||
| 705 | ratio = 100; | 704 | ratio = 100; |
| 706 | if (totalsize != 0 && !chunked) { | 705 | if (totalsize != 0 && !chunked) { |
| 707 | /* long long helps to have working ETA even if !LFS */ | 706 | /* long long helps to have it working even if !LFS */ |
| 708 | ratio = (int) (100ULL * (transferred+beg_range) / totalsize); | 707 | ratio = (unsigned) (100ULL * (transferred+beg_range) / totalsize); |
| 709 | ratio = MIN(ratio, 100); | 708 | if (ratio > 100) ratio = 100; |
| 710 | } | 709 | } |
| 711 | 710 | ||
| 712 | fprintf(stderr, "\r%-20.20s%4d%% ", curfile, ratio); | 711 | fprintf(stderr, "\r%-20.20s%4d%% ", curfile, ratio); |
| @@ -714,12 +713,13 @@ progressmeter(int flag) | |||
| 714 | barlength = getttywidth() - 51; | 713 | barlength = getttywidth() - 51; |
| 715 | if (barlength > 0) { | 714 | if (barlength > 0) { |
| 716 | /* god bless gcc for variable arrays :) */ | 715 | /* god bless gcc for variable arrays :) */ |
| 717 | char buf[barlength+1]; | ||
| 718 | i = barlength * ratio / 100; | 716 | i = barlength * ratio / 100; |
| 719 | memset(buf, '*', i); | 717 | { |
| 720 | memset(buf + i, ' ', barlength - i); | 718 | char buf[i+1]; |
| 721 | buf[barlength] = '\0'; | 719 | memset(buf, '*', i); |
| 722 | fprintf(stderr, "|%s|", buf); | 720 | buf[i] = '\0'; |
| 721 | fprintf(stderr, "|%s%*s|", buf, barlength - i, ""); | ||
| 722 | } | ||
| 723 | } | 723 | } |
| 724 | i = 0; | 724 | i = 0; |
| 725 | abbrevsize = transferred + beg_range; | 725 | abbrevsize = transferred + beg_range; |
| @@ -730,22 +730,28 @@ progressmeter(int flag) | |||
| 730 | /* see http://en.wikipedia.org/wiki/Tera */ | 730 | /* see http://en.wikipedia.org/wiki/Tera */ |
| 731 | fprintf(stderr, "%6d %c%c ", (int)abbrevsize, " KMGTPEZY"[i], i?'B':' '); | 731 | fprintf(stderr, "%6d %c%c ", (int)abbrevsize, " KMGTPEZY"[i], i?'B':' '); |
| 732 | 732 | ||
| 733 | timersub(&now, &lastupdate, &tvwait); | 733 | // Nuts! Ain't it easier to update progress meter ONLY when we transferred++? |
| 734 | // FIXME: get rid of alarmtimer + updateprogressmeter mess | ||
| 735 | |||
| 736 | elapsed = monotonic_sec(); | ||
| 737 | since_last_update = elapsed - lastupdate_sec; | ||
| 734 | if (transferred > lastsize) { | 738 | if (transferred > lastsize) { |
| 735 | lastupdate = now; | 739 | lastupdate_sec = elapsed; |
| 736 | lastsize = transferred; | 740 | lastsize = transferred; |
| 737 | if (tvwait.tv_sec >= STALLTIME) | 741 | if (since_last_update >= STALLTIME) { |
| 738 | timeradd(&start, &tvwait, &start); | 742 | /* We "cut off" these seconds from elapsed time |
| 739 | tvwait.tv_sec = 0; | 743 | * by adjusting start time */ |
| 744 | start_sec += since_last_update; | ||
| 745 | } | ||
| 746 | since_last_update = 0; /* we are un-stalled now */ | ||
| 740 | } | 747 | } |
| 741 | timersub(&now, &start, &td); | 748 | elapsed -= start_sec; /* now it's "elapsed since start" */ |
| 742 | elapsed = td.tv_sec; | ||
| 743 | 749 | ||
| 744 | if (tvwait.tv_sec >= STALLTIME) { | 750 | if (since_last_update >= STALLTIME) { |
| 745 | fprintf(stderr, " - stalled -"); | 751 | fprintf(stderr, " - stalled -"); |
| 746 | } else { | 752 | } else { |
| 747 | off_t to_download = totalsize - beg_range; | 753 | off_t to_download = totalsize - beg_range; |
| 748 | if (transferred <= 0 || elapsed <= 0 || transferred > to_download || chunked) { | 754 | if (transferred <= 0 || (int)elapsed <= 0 || transferred > to_download || chunked) { |
| 749 | fprintf(stderr, "--:--:-- ETA"); | 755 | fprintf(stderr, "--:--:-- ETA"); |
| 750 | } else { | 756 | } else { |
| 751 | /* to_download / (transferred/elapsed) - elapsed: */ | 757 | /* to_download / (transferred/elapsed) - elapsed: */ |
diff --git a/networking/zcip.c b/networking/zcip.c index eb0a7ba41..de4ee0b1a 100644 --- a/networking/zcip.c +++ b/networking/zcip.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | // - avoid silent script failures, especially under load... | 23 | // - avoid silent script failures, especially under load... |
| 24 | // - link status monitoring (restart on link-up; stop on link-down) | 24 | // - link status monitoring (restart on link-up; stop on link-down) |
| 25 | 25 | ||
| 26 | #include "libbb.h" | ||
| 27 | #include <syslog.h> | 26 | #include <syslog.h> |
| 28 | #include <poll.h> | 27 | #include <poll.h> |
| 29 | #include <sys/wait.h> | 28 | #include <sys/wait.h> |
| @@ -31,10 +30,13 @@ | |||
| 31 | #include <net/ethernet.h> | 30 | #include <net/ethernet.h> |
| 32 | #include <net/if.h> | 31 | #include <net/if.h> |
| 33 | #include <net/if_arp.h> | 32 | #include <net/if_arp.h> |
| 34 | |||
| 35 | #include <linux/if_packet.h> | 33 | #include <linux/if_packet.h> |
| 36 | #include <linux/sockios.h> | 34 | #include <linux/sockios.h> |
| 37 | 35 | ||
| 36 | #include "libbb.h" | ||
| 37 | |||
| 38 | /* We don't need more than 32 bits of the counter */ | ||
| 39 | #define MONOTONIC_US() ((unsigned)monotonic_us()) | ||
| 38 | 40 | ||
| 39 | struct arp_packet { | 41 | struct arp_packet { |
| 40 | struct ether_header hdr; | 42 | struct ether_header hdr; |
| @@ -78,15 +80,12 @@ static void pick(struct in_addr *ip) | |||
| 78 | { | 80 | { |
| 79 | unsigned tmp; | 81 | unsigned tmp; |
| 80 | 82 | ||
| 81 | /* use cheaper math than lrand48() mod N */ | ||
| 82 | do { | 83 | do { |
| 83 | tmp = (lrand48() >> 16) & IN_CLASSB_HOST; | 84 | tmp = rand() & IN_CLASSB_HOST; |
| 84 | } while (tmp > (IN_CLASSB_HOST - 0x0200)); | 85 | } while (tmp > (IN_CLASSB_HOST - 0x0200)); |
| 85 | ip->s_addr = htonl((LINKLOCAL_ADDR + 0x0100) + tmp); | 86 | ip->s_addr = htonl((LINKLOCAL_ADDR + 0x0100) + tmp); |
| 86 | } | 87 | } |
| 87 | 88 | ||
| 88 | /* TODO: we need a flag to direct bb_[p]error_msg output to stderr. */ | ||
| 89 | |||
| 90 | /** | 89 | /** |
| 91 | * Broadcast an ARP packet. | 90 | * Broadcast an ARP packet. |
| 92 | */ | 91 | */ |
| @@ -151,7 +150,7 @@ static int run(char *argv[3], const char *intf, struct in_addr *ip) | |||
| 151 | */ | 150 | */ |
| 152 | static unsigned ALWAYS_INLINE ms_rdelay(unsigned secs) | 151 | static unsigned ALWAYS_INLINE ms_rdelay(unsigned secs) |
| 153 | { | 152 | { |
| 154 | return lrand48() % (secs * 1000); | 153 | return rand() % (secs * 1000); |
| 155 | } | 154 | } |
| 156 | 155 | ||
| 157 | /** | 156 | /** |
| @@ -176,29 +175,31 @@ int zcip_main(int argc, char **argv) | |||
| 176 | struct ifreq ifr; | 175 | struct ifreq ifr; |
| 177 | char *intf; | 176 | char *intf; |
| 178 | char *script_av[3]; | 177 | char *script_av[3]; |
| 179 | suseconds_t timeout; // milliseconds | 178 | int timeout_ms; /* must be signed */ |
| 180 | unsigned conflicts; | 179 | unsigned conflicts; |
| 181 | unsigned nprobes; | 180 | unsigned nprobes; |
| 182 | unsigned nclaims; | 181 | unsigned nclaims; |
| 183 | int ready; | 182 | int ready; |
| 184 | int verbose; | 183 | int verbose; |
| 185 | } L; | 184 | } L; |
| 186 | #define null_ip (L.null_ip ) | 185 | #define null_ip (L.null_ip ) |
| 187 | #define null_addr (L.null_addr) | 186 | #define null_addr (L.null_addr ) |
| 188 | #define saddr (L.saddr ) | 187 | #define saddr (L.saddr ) |
| 189 | #define ip (L.ip ) | 188 | #define ip (L.ip ) |
| 190 | #define ifr (L.ifr ) | 189 | #define ifr (L.ifr ) |
| 191 | #define intf (L.intf ) | 190 | #define intf (L.intf ) |
| 192 | #define script_av (L.script_av) | 191 | #define script_av (L.script_av ) |
| 193 | #define timeout (L.timeout ) | 192 | #define timeout_ms (L.timeout_ms) |
| 194 | #define conflicts (L.conflicts) | 193 | #define conflicts (L.conflicts ) |
| 195 | #define nprobes (L.nprobes ) | 194 | #define nprobes (L.nprobes ) |
| 196 | #define nclaims (L.nclaims ) | 195 | #define nclaims (L.nclaims ) |
| 197 | #define ready (L.ready ) | 196 | #define ready (L.ready ) |
| 198 | #define verbose (L.verbose ) | 197 | #define verbose (L.verbose ) |
| 199 | 198 | ||
| 200 | memset(&L, 0, sizeof(L)); | 199 | memset(&L, 0, sizeof(L)); |
| 201 | 200 | ||
| 201 | srand(MONOTONIC_US()); | ||
| 202 | |||
| 202 | #define FOREGROUND (opts & 1) | 203 | #define FOREGROUND (opts & 1) |
| 203 | #define QUIT (opts & 2) | 204 | #define QUIT (opts & 2) |
| 204 | // parse commandline: prog [options] ifname script | 205 | // parse commandline: prog [options] ifname script |
| @@ -282,7 +283,7 @@ int zcip_main(int argc, char **argv) | |||
| 282 | // - defend it, within limits | 283 | // - defend it, within limits |
| 283 | while (1) { | 284 | while (1) { |
| 284 | struct pollfd fds[1]; | 285 | struct pollfd fds[1]; |
| 285 | struct timeval tv1; | 286 | unsigned deadline_us; |
| 286 | struct arp_packet p; | 287 | struct arp_packet p; |
| 287 | 288 | ||
| 288 | int source_ip_conflict = 0; | 289 | int source_ip_conflict = 0; |
| @@ -293,24 +294,18 @@ int zcip_main(int argc, char **argv) | |||
| 293 | fds[0].revents = 0; | 294 | fds[0].revents = 0; |
| 294 | 295 | ||
| 295 | // poll, being ready to adjust current timeout | 296 | // poll, being ready to adjust current timeout |
| 296 | if (!timeout) { | 297 | if (!timeout_ms) { |
| 297 | timeout = ms_rdelay(PROBE_WAIT); | 298 | timeout_ms = ms_rdelay(PROBE_WAIT); |
| 298 | // FIXME setsockopt(fd, SO_ATTACH_FILTER, ...) to | 299 | // FIXME setsockopt(fd, SO_ATTACH_FILTER, ...) to |
| 299 | // make the kernel filter out all packets except | 300 | // make the kernel filter out all packets except |
| 300 | // ones we'd care about. | 301 | // ones we'd care about. |
| 301 | } | 302 | } |
| 302 | // set tv1 to the point in time when we timeout | 303 | // set deadline_us to the point in time when we timeout |
| 303 | gettimeofday(&tv1, NULL); | 304 | deadline_us = MONOTONIC_US() + timeout_ms * 1000; |
| 304 | tv1.tv_usec += (timeout % 1000) * 1000; | ||
| 305 | while (tv1.tv_usec > 1000000) { | ||
| 306 | tv1.tv_usec -= 1000000; | ||
| 307 | tv1.tv_sec++; | ||
| 308 | } | ||
| 309 | tv1.tv_sec += timeout / 1000; | ||
| 310 | 305 | ||
| 311 | VDBG("...wait %ld %s nprobes=%d, nclaims=%d\n", | 306 | VDBG("...wait %d %s nprobes=%u, nclaims=%u\n", |
| 312 | timeout, intf, nprobes, nclaims); | 307 | timeout_ms, intf, nprobes, nclaims); |
| 313 | switch (poll(fds, 1, timeout)) { | 308 | switch (poll(fds, 1, timeout_ms)) { |
| 314 | 309 | ||
| 315 | // timeout | 310 | // timeout |
| 316 | case 0: | 311 | case 0: |
| @@ -321,25 +316,24 @@ int zcip_main(int argc, char **argv) | |||
| 321 | // have been received, so we can progress through the states | 316 | // have been received, so we can progress through the states |
| 322 | if (nprobes < PROBE_NUM) { | 317 | if (nprobes < PROBE_NUM) { |
| 323 | nprobes++; | 318 | nprobes++; |
| 324 | VDBG("probe/%d %s@%s\n", | 319 | VDBG("probe/%u %s@%s\n", |
| 325 | nprobes, intf, inet_ntoa(ip)); | 320 | nprobes, intf, inet_ntoa(ip)); |
| 326 | arp(fd, &saddr, ARPOP_REQUEST, | 321 | arp(fd, &saddr, ARPOP_REQUEST, |
| 327 | ð_addr, null_ip, | 322 | ð_addr, null_ip, |
| 328 | &null_addr, ip); | 323 | &null_addr, ip); |
| 329 | timeout = PROBE_MIN * 1000; | 324 | timeout_ms = PROBE_MIN * 1000; |
| 330 | timeout += ms_rdelay(PROBE_MAX | 325 | timeout_ms += ms_rdelay(PROBE_MAX - PROBE_MIN); |
| 331 | - PROBE_MIN); | ||
| 332 | } | 326 | } |
| 333 | else { | 327 | else { |
| 334 | // Switch to announce state. | 328 | // Switch to announce state. |
| 335 | state = ANNOUNCE; | 329 | state = ANNOUNCE; |
| 336 | nclaims = 0; | 330 | nclaims = 0; |
| 337 | VDBG("announce/%d %s@%s\n", | 331 | VDBG("announce/%u %s@%s\n", |
| 338 | nclaims, intf, inet_ntoa(ip)); | 332 | nclaims, intf, inet_ntoa(ip)); |
| 339 | arp(fd, &saddr, ARPOP_REQUEST, | 333 | arp(fd, &saddr, ARPOP_REQUEST, |
| 340 | ð_addr, ip, | 334 | ð_addr, ip, |
| 341 | ð_addr, ip); | 335 | ð_addr, ip); |
| 342 | timeout = ANNOUNCE_INTERVAL * 1000; | 336 | timeout_ms = ANNOUNCE_INTERVAL * 1000; |
| 343 | } | 337 | } |
| 344 | break; | 338 | break; |
| 345 | case RATE_LIMIT_PROBE: | 339 | case RATE_LIMIT_PROBE: |
| @@ -347,24 +341,24 @@ int zcip_main(int argc, char **argv) | |||
| 347 | // have been received, so we can move immediately to the announce state | 341 | // have been received, so we can move immediately to the announce state |
| 348 | state = ANNOUNCE; | 342 | state = ANNOUNCE; |
| 349 | nclaims = 0; | 343 | nclaims = 0; |
| 350 | VDBG("announce/%d %s@%s\n", | 344 | VDBG("announce/%u %s@%s\n", |
| 351 | nclaims, intf, inet_ntoa(ip)); | 345 | nclaims, intf, inet_ntoa(ip)); |
| 352 | arp(fd, &saddr, ARPOP_REQUEST, | 346 | arp(fd, &saddr, ARPOP_REQUEST, |
| 353 | ð_addr, ip, | 347 | ð_addr, ip, |
| 354 | ð_addr, ip); | 348 | ð_addr, ip); |
| 355 | timeout = ANNOUNCE_INTERVAL * 1000; | 349 | timeout_ms = ANNOUNCE_INTERVAL * 1000; |
| 356 | break; | 350 | break; |
| 357 | case ANNOUNCE: | 351 | case ANNOUNCE: |
| 358 | // timeouts in the ANNOUNCE state mean no conflicting ARP packets | 352 | // timeouts in the ANNOUNCE state mean no conflicting ARP packets |
| 359 | // have been received, so we can progress through the states | 353 | // have been received, so we can progress through the states |
| 360 | if (nclaims < ANNOUNCE_NUM) { | 354 | if (nclaims < ANNOUNCE_NUM) { |
| 361 | nclaims++; | 355 | nclaims++; |
| 362 | VDBG("announce/%d %s@%s\n", | 356 | VDBG("announce/%u %s@%s\n", |
| 363 | nclaims, intf, inet_ntoa(ip)); | 357 | nclaims, intf, inet_ntoa(ip)); |
| 364 | arp(fd, &saddr, ARPOP_REQUEST, | 358 | arp(fd, &saddr, ARPOP_REQUEST, |
| 365 | ð_addr, ip, | 359 | ð_addr, ip, |
| 366 | ð_addr, ip); | 360 | ð_addr, ip); |
| 367 | timeout = ANNOUNCE_INTERVAL * 1000; | 361 | timeout_ms = ANNOUNCE_INTERVAL * 1000; |
| 368 | } | 362 | } |
| 369 | else { | 363 | else { |
| 370 | // Switch to monitor state. | 364 | // Switch to monitor state. |
| @@ -375,7 +369,7 @@ int zcip_main(int argc, char **argv) | |||
| 375 | run(script_av, intf, &ip); | 369 | run(script_av, intf, &ip); |
| 376 | ready = 1; | 370 | ready = 1; |
| 377 | conflicts = 0; | 371 | conflicts = 0; |
| 378 | timeout = -1; // Never timeout in the monitor state. | 372 | timeout_ms = -1; // Never timeout in the monitor state. |
| 379 | 373 | ||
| 380 | // NOTE: all other exit paths | 374 | // NOTE: all other exit paths |
| 381 | // should deconfig ... | 375 | // should deconfig ... |
| @@ -386,14 +380,14 @@ int zcip_main(int argc, char **argv) | |||
| 386 | case DEFEND: | 380 | case DEFEND: |
| 387 | // We won! No ARP replies, so just go back to monitor. | 381 | // We won! No ARP replies, so just go back to monitor. |
| 388 | state = MONITOR; | 382 | state = MONITOR; |
| 389 | timeout = -1; | 383 | timeout_ms = -1; |
| 390 | conflicts = 0; | 384 | conflicts = 0; |
| 391 | break; | 385 | break; |
| 392 | default: | 386 | default: |
| 393 | // Invalid, should never happen. Restart the whole protocol. | 387 | // Invalid, should never happen. Restart the whole protocol. |
| 394 | state = PROBE; | 388 | state = PROBE; |
| 395 | pick(&ip); | 389 | pick(&ip); |
| 396 | timeout = 0; | 390 | timeout_ms = 0; |
| 397 | nprobes = 0; | 391 | nprobes = 0; |
| 398 | nclaims = 0; | 392 | nclaims = 0; |
| 399 | break; | 393 | break; |
| @@ -403,20 +397,17 @@ int zcip_main(int argc, char **argv) | |||
| 403 | case 1: | 397 | case 1: |
| 404 | // We need to adjust the timeout in case we didn't receive | 398 | // We need to adjust the timeout in case we didn't receive |
| 405 | // a conflicting packet. | 399 | // a conflicting packet. |
| 406 | if (timeout > 0) { | 400 | if (timeout_ms > 0) { |
| 407 | struct timeval tv2; | 401 | unsigned diff = deadline_us - MONOTONIC_US(); |
| 408 | 402 | if ((int)(diff) < 0) { | |
| 409 | gettimeofday(&tv2, NULL); | ||
| 410 | if (timercmp(&tv1, &tv2, <)) { | ||
| 411 | // Current time is greater than the expected timeout time. | 403 | // Current time is greater than the expected timeout time. |
| 412 | // Should never happen. | 404 | // Should never happen. |
| 413 | VDBG("missed an expected timeout\n"); | 405 | VDBG("missed an expected timeout\n"); |
| 414 | timeout = 0; | 406 | timeout_ms = 0; |
| 415 | } else { | 407 | } else { |
| 416 | VDBG("adjusting timeout\n"); | 408 | VDBG("adjusting timeout\n"); |
| 417 | timersub(&tv1, &tv2, &tv1); | 409 | timeout_ms = diff / 1000; |
| 418 | timeout = 1000 * tv1.tv_sec | 410 | if (!timeout_ms) timeout_ms = 1; |
| 419 | + tv1.tv_usec / 1000; | ||
| 420 | } | 411 | } |
| 421 | } | 412 | } |
| 422 | 413 | ||
| @@ -484,13 +475,13 @@ int zcip_main(int argc, char **argv) | |||
| 484 | conflicts++; | 475 | conflicts++; |
| 485 | if (conflicts >= MAX_CONFLICTS) { | 476 | if (conflicts >= MAX_CONFLICTS) { |
| 486 | VDBG("%s ratelimit\n", intf); | 477 | VDBG("%s ratelimit\n", intf); |
| 487 | timeout = RATE_LIMIT_INTERVAL * 1000; | 478 | timeout_ms = RATE_LIMIT_INTERVAL * 1000; |
| 488 | state = RATE_LIMIT_PROBE; | 479 | state = RATE_LIMIT_PROBE; |
| 489 | } | 480 | } |
| 490 | 481 | ||
| 491 | // restart the whole protocol | 482 | // restart the whole protocol |
| 492 | pick(&ip); | 483 | pick(&ip); |
| 493 | timeout = 0; | 484 | timeout_ms = 0; |
| 494 | nprobes = 0; | 485 | nprobes = 0; |
| 495 | nclaims = 0; | 486 | nclaims = 0; |
| 496 | } | 487 | } |
| @@ -500,7 +491,7 @@ int zcip_main(int argc, char **argv) | |||
| 500 | if (source_ip_conflict) { | 491 | if (source_ip_conflict) { |
| 501 | VDBG("monitor conflict -- defending\n"); | 492 | VDBG("monitor conflict -- defending\n"); |
| 502 | state = DEFEND; | 493 | state = DEFEND; |
| 503 | timeout = DEFEND_INTERVAL * 1000; | 494 | timeout_ms = DEFEND_INTERVAL * 1000; |
| 504 | arp(fd, &saddr, | 495 | arp(fd, &saddr, |
| 505 | ARPOP_REQUEST, | 496 | ARPOP_REQUEST, |
| 506 | ð_addr, ip, | 497 | ð_addr, ip, |
| @@ -518,7 +509,7 @@ int zcip_main(int argc, char **argv) | |||
| 518 | 509 | ||
| 519 | // restart the whole protocol | 510 | // restart the whole protocol |
| 520 | pick(&ip); | 511 | pick(&ip); |
| 521 | timeout = 0; | 512 | timeout_ms = 0; |
| 522 | nprobes = 0; | 513 | nprobes = 0; |
| 523 | nclaims = 0; | 514 | nclaims = 0; |
| 524 | } | 515 | } |
| @@ -528,7 +519,7 @@ int zcip_main(int argc, char **argv) | |||
| 528 | VDBG("invalid state -- starting over\n"); | 519 | VDBG("invalid state -- starting over\n"); |
| 529 | state = PROBE; | 520 | state = PROBE; |
| 530 | pick(&ip); | 521 | pick(&ip); |
| 531 | timeout = 0; | 522 | timeout_ms = 0; |
| 532 | nprobes = 0; | 523 | nprobes = 0; |
| 533 | nclaims = 0; | 524 | nclaims = 0; |
| 534 | break; | 525 | break; |
