aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2012-03-08 03:27:49 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2012-03-08 03:27:49 +0100
commitd98dc92d6a8bcc68287310c3e33a77efb9fcbe3b (patch)
treeee64345e19b3089f85de681bdf79f4f1ac458e44
parent4e3beb2e1db3d4739a5a924e003938a9815f98e5 (diff)
downloadbusybox-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.c83
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
214typedef struct { 214typedef 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
517filter_datapoints(peer_t *p) 517filter_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 */