diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2012-03-08 03:27:49 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2012-03-08 03:27:49 +0100 |
commit | d98dc92d6a8bcc68287310c3e33a77efb9fcbe3b (patch) | |
tree | ee64345e19b3089f85de681bdf79f4f1ac458e44 | |
parent | 4e3beb2e1db3d4739a5a924e003938a9815f98e5 (diff) | |
download | busybox-w32-d98dc92d6a8bcc68287310c3e33a77efb9fcbe3b.tar.gz busybox-w32-d98dc92d6a8bcc68287310c3e33a77efb9fcbe3b.tar.bz2 busybox-w32-d98dc92d6a8bcc68287310c3e33a77efb9fcbe3b.zip |
ntpd: drop offset averaging code
function old new delta
filter_datapoints 475 174 -301
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/ntpd.c | 83 |
1 files changed, 60 insertions, 23 deletions
diff --git a/networking/ntpd.c b/networking/ntpd.c index 9c16b2b6b..2bd53f884 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c | |||
@@ -212,8 +212,8 @@ typedef struct { | |||
212 | } msg_t; | 212 | } msg_t; |
213 | 213 | ||
214 | typedef struct { | 214 | typedef struct { |
215 | double d_recv_time; | ||
216 | double d_offset; | 215 | double d_offset; |
216 | double d_recv_time; | ||
217 | double d_dispersion; | 217 | double d_dispersion; |
218 | } datapoint_t; | 218 | } datapoint_t; |
219 | 219 | ||
@@ -517,23 +517,34 @@ static void | |||
517 | filter_datapoints(peer_t *p) | 517 | filter_datapoints(peer_t *p) |
518 | { | 518 | { |
519 | int i, idx; | 519 | int i, idx; |
520 | double sum, wavg; | ||
521 | datapoint_t *fdp; | ||
522 | |||
523 | #if 0 | ||
524 | /* Simulations have shown that use of *averaged* offset for p->filter_offset | ||
525 | * is in fact worse than simply using last received one: with large poll intervals | ||
526 | * (>= 2048) averaging code uses offset values which are outdated by hours, | ||
527 | * and time/frequency correction goes totally wrong when fed essentially bogus offsets. | ||
528 | */ | ||
520 | int got_newest; | 529 | int got_newest; |
521 | double minoff, maxoff, wavg, sum, w; | 530 | double minoff, maxoff, w; |
522 | double x = x; /* for compiler */ | 531 | double x = x; /* for compiler */ |
523 | double oldest_off = oldest_off; | 532 | double oldest_off = oldest_off; |
524 | double oldest_age = oldest_age; | 533 | double oldest_age = oldest_age; |
525 | double newest_off = newest_off; | 534 | double newest_off = newest_off; |
526 | double newest_age = newest_age; | 535 | double newest_age = newest_age; |
527 | 536 | ||
528 | minoff = maxoff = p->filter_datapoint[0].d_offset; | 537 | fdp = p->filter_datapoint; |
538 | |||
539 | minoff = maxoff = fdp[0].d_offset; | ||
529 | for (i = 1; i < NUM_DATAPOINTS; i++) { | 540 | for (i = 1; i < NUM_DATAPOINTS; i++) { |
530 | if (minoff > p->filter_datapoint[i].d_offset) | 541 | if (minoff > fdp[i].d_offset) |
531 | minoff = p->filter_datapoint[i].d_offset; | 542 | minoff = fdp[i].d_offset; |
532 | if (maxoff < p->filter_datapoint[i].d_offset) | 543 | if (maxoff < fdp[i].d_offset) |
533 | maxoff = p->filter_datapoint[i].d_offset; | 544 | maxoff = fdp[i].d_offset; |
534 | } | 545 | } |
535 | 546 | ||
536 | idx = p->datapoint_idx; /* most recent datapoint */ | 547 | idx = p->datapoint_idx; /* most recent datapoint's index */ |
537 | /* Average offset: | 548 | /* Average offset: |
538 | * Drop two outliers and take weighted average of the rest: | 549 | * Drop two outliers and take weighted average of the rest: |
539 | * most_recent/2 + older1/4 + older2/8 ... + older5/32 + older6/32 | 550 | * most_recent/2 + older1/4 + older2/8 ... + older5/32 + older6/32 |
@@ -555,24 +566,24 @@ filter_datapoints(peer_t *p) | |||
555 | VERB4 { | 566 | VERB4 { |
556 | bb_error_msg("datapoint[%d]: off:%f disp:%f(%f) age:%f%s", | 567 | bb_error_msg("datapoint[%d]: off:%f disp:%f(%f) age:%f%s", |
557 | i, | 568 | i, |
558 | p->filter_datapoint[idx].d_offset, | 569 | fdp[idx].d_offset, |
559 | p->filter_datapoint[idx].d_dispersion, dispersion(&p->filter_datapoint[idx]), | 570 | fdp[idx].d_dispersion, dispersion(&fdp[idx]), |
560 | G.cur_time - p->filter_datapoint[idx].d_recv_time, | 571 | G.cur_time - fdp[idx].d_recv_time, |
561 | (minoff == p->filter_datapoint[idx].d_offset || maxoff == p->filter_datapoint[idx].d_offset) | 572 | (minoff == fdp[idx].d_offset || maxoff == fdp[idx].d_offset) |
562 | ? " (outlier by offset)" : "" | 573 | ? " (outlier by offset)" : "" |
563 | ); | 574 | ); |
564 | } | 575 | } |
565 | 576 | ||
566 | sum += dispersion(&p->filter_datapoint[idx]) / (2 << i); | 577 | sum += dispersion(&fdp[idx]) / (2 << i); |
567 | 578 | ||
568 | if (minoff == p->filter_datapoint[idx].d_offset) { | 579 | if (minoff == fdp[idx].d_offset) { |
569 | minoff -= 1; /* so that we don't match it ever again */ | 580 | minoff -= 1; /* so that we don't match it ever again */ |
570 | } else | 581 | } else |
571 | if (maxoff == p->filter_datapoint[idx].d_offset) { | 582 | if (maxoff == fdp[idx].d_offset) { |
572 | maxoff += 1; | 583 | maxoff += 1; |
573 | } else { | 584 | } else { |
574 | oldest_off = p->filter_datapoint[idx].d_offset; | 585 | oldest_off = fdp[idx].d_offset; |
575 | oldest_age = G.cur_time - p->filter_datapoint[idx].d_recv_time; | 586 | oldest_age = G.cur_time - fdp[idx].d_recv_time; |
576 | if (!got_newest) { | 587 | if (!got_newest) { |
577 | got_newest = 1; | 588 | got_newest = 1; |
578 | newest_off = oldest_off; | 589 | newest_off = oldest_off; |
@@ -605,6 +616,32 @@ filter_datapoints(peer_t *p) | |||
605 | } | 616 | } |
606 | p->filter_offset = wavg; | 617 | p->filter_offset = wavg; |
607 | 618 | ||
619 | #else | ||
620 | |||
621 | fdp = p->filter_datapoint; | ||
622 | idx = p->datapoint_idx; /* most recent datapoint's index */ | ||
623 | |||
624 | /* filter_offset: simply use the most recent value */ | ||
625 | p->filter_offset = fdp[idx].d_offset; | ||
626 | |||
627 | /* n-1 | ||
628 | * --- dispersion(i) | ||
629 | * filter_dispersion = \ ------------- | ||
630 | * / (i+1) | ||
631 | * --- 2 | ||
632 | * i=0 | ||
633 | */ | ||
634 | wavg = 0; | ||
635 | sum = 0; | ||
636 | for (i = 0; i < NUM_DATAPOINTS; i++) { | ||
637 | sum += dispersion(&fdp[idx]) / (2 << i); | ||
638 | wavg += fdp[idx].d_offset; | ||
639 | idx = (idx - 1) & (NUM_DATAPOINTS - 1); | ||
640 | } | ||
641 | wavg /= NUM_DATAPOINTS; | ||
642 | p->filter_dispersion = sum; | ||
643 | #endif | ||
644 | |||
608 | /* +----- -----+ ^ 1/2 | 645 | /* +----- -----+ ^ 1/2 |
609 | * | n-1 | | 646 | * | n-1 | |
610 | * | --- | | 647 | * | --- | |
@@ -618,13 +655,13 @@ filter_datapoints(peer_t *p) | |||
618 | */ | 655 | */ |
619 | sum = 0; | 656 | sum = 0; |
620 | for (i = 0; i < NUM_DATAPOINTS; i++) { | 657 | for (i = 0; i < NUM_DATAPOINTS; i++) { |
621 | sum += SQUARE(wavg - p->filter_datapoint[i].d_offset); | 658 | sum += SQUARE(wavg - fdp[i].d_offset); |
622 | } | 659 | } |
623 | sum = SQRT(sum / NUM_DATAPOINTS); | 660 | sum = SQRT(sum / NUM_DATAPOINTS); |
624 | p->filter_jitter = sum > G_precision_sec ? sum : G_precision_sec; | 661 | p->filter_jitter = sum > G_precision_sec ? sum : G_precision_sec; |
625 | 662 | ||
626 | VERB3 bb_error_msg("filter offset:%+f(corr:%e) disp:%f jitter:%f", | 663 | VERB3 bb_error_msg("filter offset:%+f disp:%f jitter:%f", |
627 | p->filter_offset, x, | 664 | p->filter_offset, |
628 | p->filter_dispersion, | 665 | p->filter_dispersion, |
629 | p->filter_jitter); | 666 | p->filter_jitter); |
630 | } | 667 | } |
@@ -1667,15 +1704,15 @@ recv_and_process_peer_pkt(peer_t *p) | |||
1667 | 1704 | ||
1668 | p->reachable_bits |= 1; | 1705 | p->reachable_bits |= 1; |
1669 | if ((MAX_VERBOSE && G.verbose) || (option_mask32 & OPT_w)) { | 1706 | if ((MAX_VERBOSE && G.verbose) || (option_mask32 & OPT_w)) { |
1670 | bb_error_msg("reply from:%s reach:0x%02x offset:%+f delay:%f status:0x%02x strat:%d refid:0x%08x rootdelay:%f", | 1707 | bb_error_msg("reply from:%s offset:%+f delay:%f status:0x%02x strat:%d refid:0x%08x rootdelay:%f reach:0x%02x", |
1671 | p->p_dotted, | 1708 | p->p_dotted, |
1672 | p->reachable_bits, | ||
1673 | datapoint->d_offset, | 1709 | datapoint->d_offset, |
1674 | p->lastpkt_delay, | 1710 | p->lastpkt_delay, |
1675 | p->lastpkt_status, | 1711 | p->lastpkt_status, |
1676 | p->lastpkt_stratum, | 1712 | p->lastpkt_stratum, |
1677 | p->lastpkt_refid, | 1713 | p->lastpkt_refid, |
1678 | p->lastpkt_rootdelay | 1714 | p->lastpkt_rootdelay, |
1715 | p->reachable_bits | ||
1679 | /* not shown: m_ppoll, m_precision_exp, m_rootdisp, | 1716 | /* not shown: m_ppoll, m_precision_exp, m_rootdisp, |
1680 | * m_reftime, m_orgtime, m_rectime, m_xmttime | 1717 | * m_reftime, m_orgtime, m_rectime, m_xmttime |
1681 | */ | 1718 | */ |