1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30#include "libbb.h"
31#include <math.h>
32#include <netinet/ip.h>
33#include <sys/timex.h>
34#ifndef IPTOS_LOWDELAY
35# define IPTOS_LOWDELAY 0x10
36#endif
37#ifndef IP_PKTINFO
38# error "Sorry, your kernel has to support IP_PKTINFO"
39#endif
40
41
42
43
44
45
46#define MAX_VERBOSE 2
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78#define RETRY_INTERVAL 5
79#define RESPONSE_INTERVAL 15
80#define INITIAL_SAMLPES 4
81
82
83
84
85
86#define STEP_THRESHOLD 0.125
87#define WATCH_THRESHOLD 128
88
89
90
91#define FREQ_TOLERANCE 0.000015
92#define BURSTPOLL 0
93#define MINPOLL 5
94#define BIGPOLL 10
95#define MAXPOLL 12
96
97
98
99#define POLLDOWN_OFFSET (STEP_THRESHOLD / 4)
100#define MINDISP 0.01
101#define MAXDISP 16
102#define MAXSTRAT 16
103#define MAXDIST 1
104#define MIN_SELECTED 1
105#define MIN_CLUSTERED 3
106
107#define MAXDRIFT 0.000500
108
109
110
111
112
113
114
115
116#define POLLADJ_LIMIT 36
117
118
119
120
121#define POLLADJ_GATE 4
122
123#define ALLAN 512
124
125#define PLL 65536
126
127#define FLL (MAXPOLL + 1)
128
129#define AVG 4
130
131
132enum {
133 NTP_VERSION = 4,
134 NTP_MAXSTRATUM = 15,
135
136 NTP_DIGESTSIZE = 16,
137 NTP_MSGSIZE_NOAUTH = 48,
138 NTP_MSGSIZE = (NTP_MSGSIZE_NOAUTH + 4 + NTP_DIGESTSIZE),
139
140
141 MODE_MASK = (7 << 0),
142 VERSION_MASK = (7 << 3),
143 VERSION_SHIFT = 3,
144 LI_MASK = (3 << 6),
145
146
147 LI_NOWARNING = (0 << 6),
148 LI_PLUSSEC = (1 << 6),
149 LI_MINUSSEC = (2 << 6),
150 LI_ALARM = (3 << 6),
151
152
153 MODE_RES0 = 0,
154 MODE_SYM_ACT = 1,
155 MODE_SYM_PAS = 2,
156 MODE_CLIENT = 3,
157 MODE_SERVER = 4,
158 MODE_BROADCAST = 5,
159 MODE_RES1 = 6,
160 MODE_RES2 = 7,
161};
162
163
164#define OFFSET_1900_1970 2208988800UL
165
166#define NUM_DATAPOINTS 8
167
168typedef struct {
169 uint32_t int_partl;
170 uint32_t fractionl;
171} l_fixedpt_t;
172
173typedef struct {
174 uint16_t int_parts;
175 uint16_t fractions;
176} s_fixedpt_t;
177
178typedef struct {
179 uint8_t m_status;
180 uint8_t m_stratum;
181 uint8_t m_ppoll;
182 int8_t m_precision_exp;
183 s_fixedpt_t m_rootdelay;
184 s_fixedpt_t m_rootdisp;
185 uint32_t m_refid;
186 l_fixedpt_t m_reftime;
187 l_fixedpt_t m_orgtime;
188 l_fixedpt_t m_rectime;
189 l_fixedpt_t m_xmttime;
190 uint32_t m_keyid;
191 uint8_t m_digest[NTP_DIGESTSIZE];
192} msg_t;
193
194typedef struct {
195 double d_recv_time;
196 double d_offset;
197 double d_dispersion;
198} datapoint_t;
199
200typedef struct {
201 len_and_sockaddr *p_lsa;
202 char *p_dotted;
203
204
205 int p_fd;
206 int datapoint_idx;
207 uint32_t lastpkt_refid;
208 uint8_t lastpkt_status;
209 uint8_t lastpkt_stratum;
210 uint8_t reachable_bits;
211 double next_action_time;
212 double p_xmttime;
213 double lastpkt_recv_time;
214 double lastpkt_delay;
215 double lastpkt_rootdelay;
216 double lastpkt_rootdisp;
217
218 double filter_offset;
219 double filter_dispersion;
220 double filter_jitter;
221 datapoint_t filter_datapoint[NUM_DATAPOINTS];
222
223 msg_t p_xmt_msg;
224} peer_t;
225
226
227#define USING_KERNEL_PLL_LOOP 1
228#define USING_INITIAL_FREQ_ESTIMATION 0
229
230enum {
231 OPT_n = (1 << 0),
232 OPT_q = (1 << 1),
233 OPT_N = (1 << 2),
234 OPT_x = (1 << 3),
235
236
237 OPT_w = (1 << 4),
238 OPT_p = (1 << 5),
239 OPT_S = (1 << 6),
240 OPT_l = (1 << 7) * ENABLE_FEATURE_NTPD_SERVER,
241};
242
243struct globals {
244 double cur_time;
245
246 double rootdelay;
247
248 double reftime;
249
250 double rootdisp;
251
252 double last_script_run;
253 char *script_name;
254 llist_t *ntp_peers;
255#if ENABLE_FEATURE_NTPD_SERVER
256 int listen_fd;
257#endif
258 unsigned verbose;
259 unsigned peer_cnt;
260
261
262
263
264
265
266
267 uint32_t refid;
268 uint8_t ntp_status;
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293#define G_precision_exp -8
294#define G_precision_sec (1.0 / (1 << (- G_precision_exp)))
295 uint8_t stratum;
296
297 smallint initial_poll_complete;
298
299#define STATE_NSET 0
300
301#define STATE_SPIK 2
302
303#define STATE_SYNC 4
304 uint8_t discipline_state;
305 uint8_t poll_exp;
306 int polladj_count;
307 long kernel_freq_drift;
308 peer_t *last_update_peer;
309 double last_update_offset;
310 double last_update_recv_time;
311 double discipline_jitter;
312
313
314#if !USING_KERNEL_PLL_LOOP
315 double discipline_freq_drift;
316
317 double discipline_wander;
318#endif
319};
320#define G (*ptr_to_globals)
321
322static const int const_IPTOS_LOWDELAY = IPTOS_LOWDELAY;
323
324
325#define VERB1 if (MAX_VERBOSE && G.verbose)
326#define VERB2 if (MAX_VERBOSE >= 2 && G.verbose >= 2)
327#define VERB3 if (MAX_VERBOSE >= 3 && G.verbose >= 3)
328#define VERB4 if (MAX_VERBOSE >= 4 && G.verbose >= 4)
329#define VERB5 if (MAX_VERBOSE >= 5 && G.verbose >= 5)
330
331
332static double LOG2D(int a)
333{
334 if (a < 0)
335 return 1.0 / (1UL << -a);
336 return 1UL << a;
337}
338static ALWAYS_INLINE double SQUARE(double x)
339{
340 return x * x;
341}
342static ALWAYS_INLINE double MAXD(double a, double b)
343{
344 if (a > b)
345 return a;
346 return b;
347}
348static ALWAYS_INLINE double MIND(double a, double b)
349{
350 if (a < b)
351 return a;
352 return b;
353}
354static NOINLINE double my_SQRT(double X)
355{
356 union {
357 float f;
358 int32_t i;
359 } v;
360 double invsqrt;
361 double Xhalf = X * 0.5;
362
363
364 v.f = X;
365
366 v.i = 0x5f375a86 - (v.i >> 1);
367 invsqrt = v.f;
368
369
370
371
372
373
374
375 invsqrt = invsqrt * (1.5 - Xhalf * invsqrt * invsqrt);
376
377
378
379
380
381
382 return X * invsqrt;
383}
384static ALWAYS_INLINE double SQRT(double X)
385{
386
387 if (sizeof(float) != 4)
388 return sqrt(X);
389
390
391 return my_SQRT(X);
392}
393
394static double
395gettime1900d(void)
396{
397 struct timeval tv;
398 gettimeofday(&tv, NULL);
399 G.cur_time = tv.tv_sec + (1.0e-6 * tv.tv_usec) + OFFSET_1900_1970;
400 return G.cur_time;
401}
402
403static void
404d_to_tv(double d, struct timeval *tv)
405{
406 tv->tv_sec = (long)d;
407 tv->tv_usec = (d - tv->tv_sec) * 1000000;
408}
409
410static double
411lfp_to_d(l_fixedpt_t lfp)
412{
413 double ret;
414 lfp.int_partl = ntohl(lfp.int_partl);
415 lfp.fractionl = ntohl(lfp.fractionl);
416 ret = (double)lfp.int_partl + ((double)lfp.fractionl / UINT_MAX);
417 return ret;
418}
419static double
420sfp_to_d(s_fixedpt_t sfp)
421{
422 double ret;
423 sfp.int_parts = ntohs(sfp.int_parts);
424 sfp.fractions = ntohs(sfp.fractions);
425 ret = (double)sfp.int_parts + ((double)sfp.fractions / USHRT_MAX);
426 return ret;
427}
428#if ENABLE_FEATURE_NTPD_SERVER
429static l_fixedpt_t
430d_to_lfp(double d)
431{
432 l_fixedpt_t lfp;
433 lfp.int_partl = (uint32_t)d;
434 lfp.fractionl = (uint32_t)((d - lfp.int_partl) * UINT_MAX);
435 lfp.int_partl = htonl(lfp.int_partl);
436 lfp.fractionl = htonl(lfp.fractionl);
437 return lfp;
438}
439static s_fixedpt_t
440d_to_sfp(double d)
441{
442 s_fixedpt_t sfp;
443 sfp.int_parts = (uint16_t)d;
444 sfp.fractions = (uint16_t)((d - sfp.int_parts) * USHRT_MAX);
445 sfp.int_parts = htons(sfp.int_parts);
446 sfp.fractions = htons(sfp.fractions);
447 return sfp;
448}
449#endif
450
451static double
452dispersion(const datapoint_t *dp)
453{
454 return dp->d_dispersion + FREQ_TOLERANCE * (G.cur_time - dp->d_recv_time);
455}
456
457static double
458root_distance(peer_t *p)
459{
460
461
462
463
464
465 return MAXD(MINDISP, p->lastpkt_rootdelay + p->lastpkt_delay) / 2
466 + p->lastpkt_rootdisp
467 + p->filter_dispersion
468 + FREQ_TOLERANCE * (G.cur_time - p->lastpkt_recv_time)
469 + p->filter_jitter;
470}
471
472static void
473set_next(peer_t *p, unsigned t)
474{
475 p->next_action_time = G.cur_time + t;
476}
477
478
479
480
481static void
482filter_datapoints(peer_t *p)
483{
484 int i, idx;
485 int got_newest;
486 double minoff, maxoff, wavg, sum, w;
487 double x = x;
488 double oldest_off = oldest_off;
489 double oldest_age = oldest_age;
490 double newest_off = newest_off;
491 double newest_age = newest_age;
492
493 minoff = maxoff = p->filter_datapoint[0].d_offset;
494 for (i = 1; i < NUM_DATAPOINTS; i++) {
495 if (minoff > p->filter_datapoint[i].d_offset)
496 minoff = p->filter_datapoint[i].d_offset;
497 if (maxoff < p->filter_datapoint[i].d_offset)
498 maxoff = p->filter_datapoint[i].d_offset;
499 }
500
501 idx = p->datapoint_idx;
502
503
504
505
506
507
508 wavg = 0;
509 w = 0.5;
510
511
512
513
514
515
516
517 got_newest = 0;
518 sum = 0;
519 for (i = 0; i < NUM_DATAPOINTS; i++) {
520 VERB4 {
521 bb_error_msg("datapoint[%d]: off:%f disp:%f(%f) age:%f%s",
522 i,
523 p->filter_datapoint[idx].d_offset,
524 p->filter_datapoint[idx].d_dispersion, dispersion(&p->filter_datapoint[idx]),
525 G.cur_time - p->filter_datapoint[idx].d_recv_time,
526 (minoff == p->filter_datapoint[idx].d_offset || maxoff == p->filter_datapoint[idx].d_offset)
527 ? " (outlier by offset)" : ""
528 );
529 }
530
531 sum += dispersion(&p->filter_datapoint[idx]) / (2 << i);
532
533 if (minoff == p->filter_datapoint[idx].d_offset) {
534 minoff -= 1;
535 } else
536 if (maxoff == p->filter_datapoint[idx].d_offset) {
537 maxoff += 1;
538 } else {
539 oldest_off = p->filter_datapoint[idx].d_offset;
540 oldest_age = G.cur_time - p->filter_datapoint[idx].d_recv_time;
541 if (!got_newest) {
542 got_newest = 1;
543 newest_off = oldest_off;
544 newest_age = oldest_age;
545 }
546 x = oldest_off * w;
547 wavg += x;
548 w /= 2;
549 }
550
551 idx = (idx - 1) & (NUM_DATAPOINTS - 1);
552 }
553 p->filter_dispersion = sum;
554 wavg += x;
555
556
557
558
559
560
561
562
563 x = oldest_age - newest_age;
564 if (x != 0) {
565 x = newest_age / x;
566 if (x < 1) {
567 x = (newest_off - oldest_off) * x;
568 wavg += x;
569 }
570 }
571 p->filter_offset = wavg;
572
573
574
575
576
577
578
579
580
581
582
583
584 sum = 0;
585 for (i = 0; i < NUM_DATAPOINTS; i++) {
586 sum += SQUARE(wavg - p->filter_datapoint[i].d_offset);
587 }
588 sum = SQRT(sum / NUM_DATAPOINTS);
589 p->filter_jitter = sum > G_precision_sec ? sum : G_precision_sec;
590
591 VERB3 bb_error_msg("filter offset:%f(corr:%e) disp:%f jitter:%f",
592 p->filter_offset, x,
593 p->filter_dispersion,
594 p->filter_jitter);
595
596}
597
598static void
599reset_peer_stats(peer_t *p, double offset)
600{
601 int i;
602 bool small_ofs = fabs(offset) < 16 * STEP_THRESHOLD;
603
604 for (i = 0; i < NUM_DATAPOINTS; i++) {
605 if (small_ofs) {
606 p->filter_datapoint[i].d_recv_time -= offset;
607 if (p->filter_datapoint[i].d_offset != 0) {
608 p->filter_datapoint[i].d_offset -= offset;
609 }
610 } else {
611 p->filter_datapoint[i].d_recv_time = G.cur_time;
612 p->filter_datapoint[i].d_offset = 0;
613 p->filter_datapoint[i].d_dispersion = MAXDISP;
614 }
615 }
616 if (small_ofs) {
617 p->lastpkt_recv_time -= offset;
618 } else {
619 p->reachable_bits = 0;
620 p->lastpkt_recv_time = G.cur_time;
621 }
622 filter_datapoints(p);
623 p->next_action_time -= offset;
624 VERB5 bb_error_msg("%s->lastpkt_recv_time=%f", p->p_dotted, p->lastpkt_recv_time);
625}
626
627static void
628add_peers(char *s)
629{
630 peer_t *p;
631
632 p = xzalloc(sizeof(*p));
633 p->p_lsa = xhost2sockaddr(s, 123);
634 p->p_dotted = xmalloc_sockaddr2dotted_noport(&p->p_lsa->u.sa);
635 p->p_fd = -1;
636 p->p_xmt_msg.m_status = MODE_CLIENT | (NTP_VERSION << 3);
637 p->next_action_time = G.cur_time;
638 reset_peer_stats(p, 16 * STEP_THRESHOLD);
639
640 llist_add_to(&G.ntp_peers, p);
641 G.peer_cnt++;
642}
643
644static int
645do_sendto(int fd,
646 const struct sockaddr *from, const struct sockaddr *to, socklen_t addrlen,
647 msg_t *msg, ssize_t len)
648{
649 ssize_t ret;
650
651 errno = 0;
652 if (!from) {
653 ret = sendto(fd, msg, len, MSG_DONTWAIT, to, addrlen);
654 } else {
655 ret = send_to_from(fd, msg, len, MSG_DONTWAIT, to, from, addrlen);
656 }
657 if (ret != len) {
658 bb_perror_msg("send failed");
659 return -1;
660 }
661 return 0;
662}
663
664static void
665send_query_to_peer(peer_t *p)
666{
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683#define PROBE_LOCAL_ADDR
684
685 if (p->p_fd == -1) {
686 int fd, family;
687 len_and_sockaddr *local_lsa;
688
689 family = p->p_lsa->u.sa.sa_family;
690 p->p_fd = fd = xsocket_type(&local_lsa, family, SOCK_DGRAM);
691
692
693
694
695
696 PROBE_LOCAL_ADDR
697 xbind(fd, &local_lsa->u.sa, local_lsa->len);
698 PROBE_LOCAL_ADDR
699#if ENABLE_FEATURE_IPV6
700 if (family == AF_INET)
701#endif
702 setsockopt(fd, IPPROTO_IP, IP_TOS, &const_IPTOS_LOWDELAY, sizeof(const_IPTOS_LOWDELAY));
703 free(local_lsa);
704 }
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719 p->p_xmt_msg.m_xmttime.int_partl = random();
720 p->p_xmt_msg.m_xmttime.fractionl = random();
721 p->p_xmttime = gettime1900d();
722
723 if (do_sendto(p->p_fd, NULL, &p->p_lsa->u.sa, p->p_lsa->len,
724 &p->p_xmt_msg, NTP_MSGSIZE_NOAUTH) == -1
725 ) {
726 close(p->p_fd);
727 p->p_fd = -1;
728 set_next(p, RETRY_INTERVAL);
729 return;
730 }
731
732 p->reachable_bits <<= 1;
733 VERB1 bb_error_msg("sent query to %s", p->p_dotted);
734 set_next(p, RESPONSE_INTERVAL);
735}
736
737
738
739
740
741
742
743
744
745static void run_script(const char *action, double offset)
746{
747 char *argv[3];
748 char *env1, *env2, *env3, *env4;
749
750 if (!G.script_name)
751 return;
752
753 argv[0] = (char*) G.script_name;
754 argv[1] = (char*) action;
755 argv[2] = NULL;
756
757 VERB1 bb_error_msg("executing '%s %s'", G.script_name, action);
758
759 env1 = xasprintf("%s=%u", "stratum", G.stratum);
760 putenv(env1);
761 env2 = xasprintf("%s=%ld", "freq_drift_ppm", G.kernel_freq_drift);
762 putenv(env2);
763 env3 = xasprintf("%s=%u", "poll_interval", 1 << G.poll_exp);
764 putenv(env3);
765 env4 = xasprintf("%s=%f", "offset", offset);
766 putenv(env4);
767
768
769
770
771
772
773
774
775
776 spawn(argv);
777
778 unsetenv("stratum");
779 unsetenv("freq_drift_ppm");
780 unsetenv("poll_interval");
781 unsetenv("offset");
782 free(env1);
783 free(env2);
784 free(env3);
785 free(env4);
786
787 G.last_script_run = G.cur_time;
788}
789
790static NOINLINE void
791step_time(double offset)
792{
793 llist_t *item;
794 double dtime;
795 struct timeval tv;
796 char buf[80];
797 time_t tval;
798
799 gettimeofday(&tv, NULL);
800 dtime = offset + tv.tv_sec;
801 dtime += 1.0e-6 * tv.tv_usec;
802 d_to_tv(dtime, &tv);
803
804 if (settimeofday(&tv, NULL) == -1)
805 bb_perror_msg_and_die("settimeofday");
806
807 tval = tv.tv_sec;
808 strftime(buf, sizeof(buf), "%a %b %e %H:%M:%S %Z %Y", localtime(&tval));
809
810 bb_error_msg("setting clock to %s (offset %fs)", buf, offset);
811
812
813
814
815 for (item = G.ntp_peers; item != NULL; item = item->link) {
816 peer_t *pp = (peer_t *) item->data;
817 reset_peer_stats(pp, offset);
818 }
819
820 G.cur_time -= offset;
821 G.last_update_recv_time -= offset;
822 G.last_script_run -= offset;
823}
824
825
826
827
828
829typedef struct {
830 peer_t *p;
831 int type;
832 double edge;
833 double opt_rd;
834} point_t;
835static int
836compare_point_edge(const void *aa, const void *bb)
837{
838 const point_t *a = aa;
839 const point_t *b = bb;
840 if (a->edge < b->edge) {
841 return -1;
842 }
843 return (a->edge > b->edge);
844}
845typedef struct {
846 peer_t *p;
847 double metric;
848} survivor_t;
849static int
850compare_survivor_metric(const void *aa, const void *bb)
851{
852 const survivor_t *a = aa;
853 const survivor_t *b = bb;
854 if (a->metric < b->metric) {
855 return -1;
856 }
857 return (a->metric > b->metric);
858}
859static int
860fit(peer_t *p, double rd)
861{
862 if ((p->reachable_bits & (p->reachable_bits-1)) == 0) {
863
864 VERB3 bb_error_msg("peer %s unfit for selection: unreachable", p->p_dotted);
865 return 0;
866 }
867#if 0
868 if ((p->lastpkt_status & LI_ALARM) == LI_ALARM
869 || p->lastpkt_stratum >= MAXSTRAT
870 ) {
871 VERB3 bb_error_msg("peer %s unfit for selection: bad status/stratum", p->p_dotted);
872 return 0;
873 }
874#endif
875
876 if (rd > MAXDIST + FREQ_TOLERANCE * (1 << G.poll_exp)) {
877 VERB3 bb_error_msg("peer %s unfit for selection: root distance too high", p->p_dotted);
878 return 0;
879 }
880
881
882
883
884 return 1;
885}
886static peer_t*
887select_and_cluster(void)
888{
889 peer_t *p;
890 llist_t *item;
891 int i, j;
892 int size = 3 * G.peer_cnt;
893
894 point_t point[size];
895 unsigned num_points, num_candidates;
896 double low, high;
897 unsigned num_falsetickers;
898
899 survivor_t survivor[size];
900 unsigned num_survivors;
901
902
903
904 num_points = 0;
905 item = G.ntp_peers;
906 if (G.initial_poll_complete) while (item != NULL) {
907 double rd, offset;
908
909 p = (peer_t *) item->data;
910 rd = root_distance(p);
911 offset = p->filter_offset;
912 if (!fit(p, rd)) {
913 item = item->link;
914 continue;
915 }
916
917 VERB4 bb_error_msg("interval: [%f %f %f] %s",
918 offset - rd,
919 offset,
920 offset + rd,
921 p->p_dotted
922 );
923 point[num_points].p = p;
924 point[num_points].type = -1;
925 point[num_points].edge = offset - rd;
926 point[num_points].opt_rd = rd;
927 num_points++;
928 point[num_points].p = p;
929 point[num_points].type = 0;
930 point[num_points].edge = offset;
931 point[num_points].opt_rd = rd;
932 num_points++;
933 point[num_points].p = p;
934 point[num_points].type = 1;
935 point[num_points].edge = offset + rd;
936 point[num_points].opt_rd = rd;
937 num_points++;
938 item = item->link;
939 }
940 num_candidates = num_points / 3;
941 if (num_candidates == 0) {
942 VERB3 bb_error_msg("no valid datapoints, no peer selected");
943 return NULL;
944 }
945
946 qsort(point, num_points, sizeof(point[0]), compare_point_edge);
947
948
949
950
951
952
953
954
955
956
957
958 num_falsetickers = 0;
959 while (1) {
960 int c;
961 unsigned num_midpoints = 0;
962
963 low = 1 << 9;
964 high = - (1 << 9);
965 c = 0;
966 for (i = 0; i < num_points; i++) {
967
968
969
970
971
972 c -= point[i].type;
973 if (c >= num_candidates - num_falsetickers) {
974
975 low = point[i].edge;
976 break;
977 }
978 if (point[i].type == 0)
979 num_midpoints++;
980 }
981 c = 0;
982 for (i = num_points-1; i >= 0; i--) {
983 c += point[i].type;
984 if (c >= num_candidates - num_falsetickers) {
985 high = point[i].edge;
986 break;
987 }
988 if (point[i].type == 0)
989 num_midpoints++;
990 }
991
992
993
994
995
996 if (num_midpoints <= num_falsetickers && low < high)
997 break;
998 num_falsetickers++;
999 if (num_falsetickers * 2 >= num_candidates) {
1000 VERB3 bb_error_msg("too many falsetickers:%d (candidates:%d), no peer selected",
1001 num_falsetickers, num_candidates);
1002 return NULL;
1003 }
1004 }
1005 VERB3 bb_error_msg("selected interval: [%f, %f]; candidates:%d falsetickers:%d",
1006 low, high, num_candidates, num_falsetickers);
1007
1008
1009
1010
1011
1012
1013
1014
1015 num_survivors = 0;
1016 for (i = 0; i < num_points; i++) {
1017 if (point[i].edge < low || point[i].edge > high)
1018 continue;
1019 p = point[i].p;
1020 survivor[num_survivors].p = p;
1021
1022 survivor[num_survivors].metric = MAXDIST * p->lastpkt_stratum + point[i].opt_rd;
1023 VERB4 bb_error_msg("survivor[%d] metric:%f peer:%s",
1024 num_survivors, survivor[num_survivors].metric, p->p_dotted);
1025 num_survivors++;
1026 }
1027
1028
1029
1030
1031
1032 if (num_survivors < MIN_SELECTED) {
1033 VERB3 bb_error_msg("num_survivors %d < %d, no peer selected",
1034 num_survivors, MIN_SELECTED);
1035 return NULL;
1036 }
1037
1038
1039
1040 qsort(survivor, num_survivors, sizeof(survivor[0]), compare_survivor_metric);
1041
1042
1043
1044
1045
1046
1047
1048 while (1) {
1049 unsigned max_idx = max_idx;
1050 double max_selection_jitter = max_selection_jitter;
1051 double min_jitter = min_jitter;
1052
1053 if (num_survivors <= MIN_CLUSTERED) {
1054 VERB3 bb_error_msg("num_survivors %d <= %d, not discarding more",
1055 num_survivors, MIN_CLUSTERED);
1056 break;
1057 }
1058
1059
1060
1061
1062
1063
1064 for (i = 0; i < num_survivors; i++) {
1065 double selection_jitter_sq;
1066
1067 p = survivor[i].p;
1068 if (i == 0 || p->filter_jitter < min_jitter)
1069 min_jitter = p->filter_jitter;
1070
1071 selection_jitter_sq = 0;
1072 for (j = 0; j < num_survivors; j++) {
1073 peer_t *q = survivor[j].p;
1074 selection_jitter_sq += SQUARE(p->filter_offset - q->filter_offset);
1075 }
1076 if (i == 0 || selection_jitter_sq > max_selection_jitter) {
1077 max_selection_jitter = selection_jitter_sq;
1078 max_idx = i;
1079 }
1080 VERB5 bb_error_msg("survivor %d selection_jitter^2:%f",
1081 i, selection_jitter_sq);
1082 }
1083 max_selection_jitter = SQRT(max_selection_jitter / num_survivors);
1084 VERB4 bb_error_msg("max_selection_jitter (at %d):%f min_jitter:%f",
1085 max_idx, max_selection_jitter, min_jitter);
1086
1087
1088
1089
1090
1091
1092 if (max_selection_jitter < min_jitter) {
1093 VERB3 bb_error_msg("max_selection_jitter:%f < min_jitter:%f, num_survivors:%d, not discarding more",
1094 max_selection_jitter, min_jitter, num_survivors);
1095 break;
1096 }
1097
1098
1099
1100
1101 VERB5 bb_error_msg("dropping survivor %d", max_idx);
1102 num_survivors--;
1103 while (max_idx < num_survivors) {
1104 survivor[max_idx] = survivor[max_idx + 1];
1105 max_idx++;
1106 }
1107 }
1108
1109 if (0) {
1110
1111
1112
1113
1114
1115
1116
1117
1118 double x, y, z, w;
1119 y = z = w = 0;
1120 for (i = 0; i < num_survivors; i++) {
1121 p = survivor[i].p;
1122 x = root_distance(p);
1123 y += 1 / x;
1124 z += p->filter_offset / x;
1125 w += SQUARE(p->filter_offset - survivor[0].p->filter_offset) / x;
1126 }
1127
1128
1129 }
1130
1131
1132
1133
1134
1135
1136 p = survivor[0].p;
1137 if (G.last_update_peer
1138 && G.last_update_peer->lastpkt_stratum <= p->lastpkt_stratum
1139 ) {
1140
1141 for (i = 1; i < num_survivors; i++) {
1142 if (G.last_update_peer == survivor[i].p) {
1143 VERB4 bb_error_msg("keeping old synced peer");
1144 p = G.last_update_peer;
1145 goto keep_old;
1146 }
1147 }
1148 }
1149 G.last_update_peer = p;
1150 keep_old:
1151 VERB3 bb_error_msg("selected peer %s filter_offset:%f age:%f",
1152 p->p_dotted,
1153 p->filter_offset,
1154 G.cur_time - p->lastpkt_recv_time
1155 );
1156 return p;
1157}
1158
1159
1160
1161
1162
1163static void
1164set_new_values(int disc_state, double offset, double recv_time)
1165{
1166
1167
1168
1169
1170 VERB3 bb_error_msg("disc_state=%d last update offset=%f recv_time=%f",
1171 disc_state, offset, recv_time);
1172 G.discipline_state = disc_state;
1173 G.last_update_offset = offset;
1174 G.last_update_recv_time = recv_time;
1175}
1176
1177static NOINLINE int
1178update_local_clock(peer_t *p)
1179{
1180 int rc;
1181 struct timex tmx;
1182
1183 double offset = p->filter_offset;
1184 double recv_time = p->lastpkt_recv_time;
1185 double abs_offset;
1186#if !USING_KERNEL_PLL_LOOP
1187 double freq_drift;
1188#endif
1189 double since_last_update;
1190 double etemp, dtemp;
1191
1192 abs_offset = fabs(offset);
1193
1194#if 0
1195
1196
1197
1198 if (abs_offset > PANIC_THRESHOLD) {
1199 bb_error_msg_and_die("offset %f far too big, exiting", offset);
1200 }
1201#endif
1202
1203
1204
1205
1206
1207 if (recv_time <= G.last_update_recv_time) {
1208 VERB3 bb_error_msg("same or older datapoint: %f >= %f, not using it",
1209 G.last_update_recv_time, recv_time);
1210 return 0;
1211 }
1212
1213
1214
1215
1216
1217 since_last_update = recv_time - G.reftime;
1218#if !USING_KERNEL_PLL_LOOP
1219 freq_drift = 0;
1220#endif
1221#if USING_INITIAL_FREQ_ESTIMATION
1222 if (G.discipline_state == STATE_FREQ) {
1223
1224 if (since_last_update < WATCH_THRESHOLD) {
1225 VERB3 bb_error_msg("measuring drift, datapoint ignored, %f sec remains",
1226 WATCH_THRESHOLD - since_last_update);
1227 return 0;
1228 }
1229# if !USING_KERNEL_PLL_LOOP
1230 freq_drift = (offset - G.last_update_offset) / since_last_update;
1231# endif
1232 }
1233#endif
1234
1235
1236
1237
1238 if (abs_offset > STEP_THRESHOLD) {
1239 switch (G.discipline_state) {
1240 case STATE_SYNC:
1241
1242 VERB3 bb_error_msg("offset:%f - spike detected", offset);
1243 G.discipline_state = STATE_SPIK;
1244 return -1;
1245
1246 case STATE_SPIK:
1247
1248
1249
1250 if (since_last_update < WATCH_THRESHOLD) {
1251 VERB3 bb_error_msg("spike detected, datapoint ignored, %f sec remains",
1252 WATCH_THRESHOLD - since_last_update);
1253 return -1;
1254 }
1255
1256 }
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279 VERB3 bb_error_msg("stepping time by %f; poll_exp=MINPOLL", offset);
1280 step_time(offset);
1281 if (option_mask32 & OPT_q) {
1282
1283 exit(0);
1284 }
1285
1286 G.polladj_count = 0;
1287 G.poll_exp = MINPOLL;
1288 G.stratum = MAXSTRAT;
1289
1290 run_script("step", offset);
1291
1292#if USING_INITIAL_FREQ_ESTIMATION
1293 if (G.discipline_state == STATE_NSET) {
1294 set_new_values(STATE_FREQ, 0, recv_time);
1295 return 1;
1296 }
1297#endif
1298 set_new_values(STATE_SYNC, 0, recv_time);
1299
1300 } else {
1301
1302 if (G.poll_exp < MINPOLL && G.initial_poll_complete) {
1303 VERB3 bb_error_msg("small offset:%f, disabling burst mode", offset);
1304 G.polladj_count = 0;
1305 G.poll_exp = MINPOLL;
1306 }
1307
1308
1309
1310
1311 etemp = SQUARE(G.discipline_jitter);
1312 dtemp = SQUARE(MAXD(fabs(offset - G.last_update_offset), G_precision_sec));
1313 G.discipline_jitter = SQRT(etemp + (dtemp - etemp) / AVG);
1314 VERB3 bb_error_msg("discipline jitter=%f", G.discipline_jitter);
1315
1316 switch (G.discipline_state) {
1317 case STATE_NSET:
1318 if (option_mask32 & OPT_q) {
1319
1320
1321
1322 exit(0);
1323 }
1324#if USING_INITIAL_FREQ_ESTIMATION
1325
1326
1327
1328
1329 set_new_values(STATE_FREQ, offset, recv_time);
1330#else
1331 set_new_values(STATE_SYNC, offset, recv_time);
1332#endif
1333 VERB3 bb_error_msg("transitioning to FREQ, datapoint ignored");
1334 return 0;
1335
1336#if 0
1337 case STATE_FSET:
1338
1339
1340
1341
1342 set_new_values(STATE_SYNC, offset, recv_time);
1343
1344 break;
1345#endif
1346
1347#if USING_INITIAL_FREQ_ESTIMATION
1348 case STATE_FREQ:
1349
1350
1351
1352
1353 set_new_values(STATE_SYNC, offset, recv_time);
1354 break;
1355#endif
1356
1357 default:
1358#if !USING_KERNEL_PLL_LOOP
1359
1360
1361
1362
1363
1364
1365
1366
1367 if ((1 << G.poll_exp) > ALLAN / 2) {
1368 etemp = FLL - G.poll_exp;
1369 if (etemp < AVG)
1370 etemp = AVG;
1371 freq_drift += (offset - G.last_update_offset) / (MAXD(since_last_update, ALLAN) * etemp);
1372 }
1373
1374
1375
1376
1377
1378 etemp = MIND(since_last_update, (1 << G.poll_exp));
1379 dtemp = (4 * PLL) << G.poll_exp;
1380 freq_drift += offset * etemp / SQUARE(dtemp);
1381#endif
1382 set_new_values(STATE_SYNC, offset, recv_time);
1383 break;
1384 }
1385 if (G.stratum != p->lastpkt_stratum + 1) {
1386 G.stratum = p->lastpkt_stratum + 1;
1387 run_script("stratum", offset);
1388 }
1389 }
1390
1391 G.reftime = G.cur_time;
1392 G.ntp_status = p->lastpkt_status;
1393 G.refid = p->lastpkt_refid;
1394 G.rootdelay = p->lastpkt_rootdelay + p->lastpkt_delay;
1395 dtemp = p->filter_jitter;
1396 dtemp += MAXD(p->filter_dispersion + FREQ_TOLERANCE * (G.cur_time - p->lastpkt_recv_time) + abs_offset, MINDISP);
1397 G.rootdisp = p->lastpkt_rootdisp + dtemp;
1398 VERB3 bb_error_msg("updating leap/refid/reftime/rootdisp from peer %s", p->p_dotted);
1399
1400
1401
1402
1403
1404
1405#if !USING_KERNEL_PLL_LOOP
1406
1407
1408
1409
1410
1411
1412 dtemp = G.discipline_freq_drift + freq_drift;
1413 G.discipline_freq_drift = MAXD(MIND(MAXDRIFT, dtemp), -MAXDRIFT);
1414 etemp = SQUARE(G.discipline_wander);
1415 dtemp = SQUARE(dtemp);
1416 G.discipline_wander = SQRT(etemp + (dtemp - etemp) / AVG);
1417
1418 VERB3 bb_error_msg("discipline freq_drift=%.9f(int:%ld corr:%e) wander=%f",
1419 G.discipline_freq_drift,
1420 (long)(G.discipline_freq_drift * 65536e6),
1421 freq_drift,
1422 G.discipline_wander);
1423#endif
1424 VERB3 {
1425 memset(&tmx, 0, sizeof(tmx));
1426 if (adjtimex(&tmx) < 0)
1427 bb_perror_msg_and_die("adjtimex");
1428 VERB3 bb_error_msg("p adjtimex freq:%ld offset:%ld constant:%ld status:0x%x",
1429 tmx.freq, tmx.offset, tmx.constant, tmx.status);
1430 }
1431
1432 memset(&tmx, 0, sizeof(tmx));
1433#if 0
1434
1435
1436
1437
1438 tmx.modes = ADJ_FREQUENCY | ADJ_OFFSET;
1439
1440 tmx.freq = G.discipline_freq_drift * 65536e6;
1441 tmx.offset = G.last_update_offset * 1000000;
1442#endif
1443 tmx.modes = ADJ_OFFSET | ADJ_STATUS | ADJ_TIMECONST;
1444 tmx.offset = (G.last_update_offset * 1000000);
1445
1446 tmx.status = STA_PLL;
1447 if (G.ntp_status & LI_PLUSSEC)
1448 tmx.status |= STA_INS;
1449 if (G.ntp_status & LI_MINUSSEC)
1450 tmx.status |= STA_DEL;
1451 tmx.constant = G.poll_exp - 4;
1452
1453
1454 rc = adjtimex(&tmx);
1455 if (rc < 0)
1456 bb_perror_msg_and_die("adjtimex");
1457
1458
1459
1460 VERB3 bb_error_msg("adjtimex:%d freq:%ld offset:%ld constant:%ld status:0x%x",
1461 rc, tmx.freq, tmx.offset, tmx.constant, tmx.status);
1462#if 0
1463 VERB3 {
1464
1465 memset(&tmx, 0, sizeof(tmx));
1466 if (adjtimex(&tmx) < 0)
1467 bb_perror_msg_and_die("adjtimex");
1468 VERB3 bb_error_msg("c adjtimex freq:%ld offset:%ld constant:%ld status:0x%x",
1469 tmx.freq, tmx.offset, tmx.constant, tmx.status);
1470 }
1471#endif
1472 G.kernel_freq_drift = tmx.freq / 65536;
1473 VERB2 bb_error_msg("update peer:%s, offset:%f, clock drift:%ld ppm",
1474 p->p_dotted, G.last_update_offset, G.kernel_freq_drift);
1475
1476 return 1;
1477}
1478
1479
1480
1481
1482
1483
1484static unsigned
1485retry_interval(void)
1486{
1487
1488 unsigned interval, r;
1489 interval = RETRY_INTERVAL;
1490 r = random();
1491 interval += r % (unsigned)(RETRY_INTERVAL / 4);
1492 VERB3 bb_error_msg("chose retry interval:%u", interval);
1493 return interval;
1494}
1495static unsigned
1496poll_interval(int exponent)
1497{
1498 unsigned interval, r;
1499 exponent = G.poll_exp + exponent;
1500 if (exponent < 0)
1501 exponent = 0;
1502 interval = 1 << exponent;
1503 r = random();
1504 interval += ((r & (interval-1)) >> 4) + ((r >> 8) & 1);
1505 VERB3 bb_error_msg("chose poll interval:%u (poll_exp:%d exp:%d)", interval, G.poll_exp, exponent);
1506 return interval;
1507}
1508static NOINLINE void
1509recv_and_process_peer_pkt(peer_t *p)
1510{
1511 int rc;
1512 ssize_t size;
1513 msg_t msg;
1514 double T1, T2, T3, T4;
1515 unsigned interval;
1516 datapoint_t *datapoint;
1517 peer_t *q;
1518
1519
1520
1521
1522
1523 size = recv(p->p_fd, &msg, sizeof(msg), MSG_DONTWAIT);
1524 if (size == -1) {
1525 bb_perror_msg("recv(%s) error", p->p_dotted);
1526 if (errno == EHOSTUNREACH || errno == EHOSTDOWN
1527 || errno == ENETUNREACH || errno == ENETDOWN
1528 || errno == ECONNREFUSED || errno == EADDRNOTAVAIL
1529 || errno == EAGAIN
1530 ) {
1531
1532 interval = retry_interval();
1533 goto set_next_and_close_sock;
1534 }
1535 xfunc_die();
1536 }
1537
1538 if (size != NTP_MSGSIZE_NOAUTH && size != NTP_MSGSIZE) {
1539 bb_error_msg("malformed packet received from %s", p->p_dotted);
1540 goto bail;
1541 }
1542
1543 if (msg.m_orgtime.int_partl != p->p_xmt_msg.m_xmttime.int_partl
1544 || msg.m_orgtime.fractionl != p->p_xmt_msg.m_xmttime.fractionl
1545 ) {
1546 goto bail;
1547 }
1548
1549 if ((msg.m_status & LI_ALARM) == LI_ALARM
1550 || msg.m_stratum == 0
1551 || msg.m_stratum > NTP_MAXSTRATUM
1552 ) {
1553
1554
1555
1556 interval = poll_interval(0);
1557 bb_error_msg("reply from %s: not synced, next query in %us", p->p_dotted, interval);
1558 goto set_next_and_close_sock;
1559 }
1560
1561
1562
1563
1564
1565 p->lastpkt_status = msg.m_status;
1566 p->lastpkt_stratum = msg.m_stratum;
1567 p->lastpkt_rootdelay = sfp_to_d(msg.m_rootdelay);
1568 p->lastpkt_rootdisp = sfp_to_d(msg.m_rootdisp);
1569 p->lastpkt_refid = msg.m_refid;
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585 T1 = p->p_xmttime;
1586 T2 = lfp_to_d(msg.m_rectime);
1587 T3 = lfp_to_d(msg.m_xmttime);
1588 T4 = G.cur_time;
1589
1590 p->lastpkt_recv_time = T4;
1591
1592 VERB5 bb_error_msg("%s->lastpkt_recv_time=%f", p->p_dotted, p->lastpkt_recv_time);
1593 p->datapoint_idx = p->reachable_bits ? (p->datapoint_idx + 1) % NUM_DATAPOINTS : 0;
1594 datapoint = &p->filter_datapoint[p->datapoint_idx];
1595 datapoint->d_recv_time = T4;
1596 datapoint->d_offset = ((T2 - T1) + (T3 - T4)) / 2;
1597
1598
1599
1600
1601
1602
1603 p->lastpkt_delay = (T4 - T1) - (T3 - T2);
1604 if (p->lastpkt_delay < G_precision_sec)
1605 p->lastpkt_delay = G_precision_sec;
1606 datapoint->d_dispersion = LOG2D(msg.m_precision_exp) + G_precision_sec;
1607 if (!p->reachable_bits) {
1608
1609 int i;
1610 for (i = 1; i < NUM_DATAPOINTS; i++) {
1611 p->filter_datapoint[i].d_offset = datapoint->d_offset;
1612 }
1613 }
1614
1615 p->reachable_bits |= 1;
1616 if ((MAX_VERBOSE && G.verbose) || (option_mask32 & OPT_w)) {
1617 bb_error_msg("reply from %s: reach 0x%02x offset %f delay %f status 0x%02x strat %d refid 0x%08x rootdelay %f",
1618 p->p_dotted,
1619 p->reachable_bits,
1620 datapoint->d_offset,
1621 p->lastpkt_delay,
1622 p->lastpkt_status,
1623 p->lastpkt_stratum,
1624 p->lastpkt_refid,
1625 p->lastpkt_rootdelay
1626
1627
1628
1629 );
1630 }
1631
1632
1633 filter_datapoints(p);
1634 q = select_and_cluster();
1635 rc = -1;
1636 if (q) {
1637 rc = 0;
1638 if (!(option_mask32 & OPT_w)) {
1639 rc = update_local_clock(q);
1640
1641
1642
1643 if (fabs(q->filter_offset) >= POLLDOWN_OFFSET) {
1644 VERB3 bb_error_msg("offset:%f > POLLDOWN_OFFSET", q->filter_offset);
1645 goto poll_down;
1646 }
1647 }
1648 }
1649
1650
1651 if (rc != 0) {
1652
1653
1654
1655
1656
1657
1658 VERB4 if (rc > 0) {
1659 bb_error_msg("offset:%f POLLADJ_GATE*discipline_jitter:%f poll:%s",
1660 q->filter_offset, POLLADJ_GATE * G.discipline_jitter,
1661 fabs(q->filter_offset) < POLLADJ_GATE * G.discipline_jitter
1662 ? "grows" : "falls"
1663 );
1664 }
1665 if (rc > 0 && fabs(q->filter_offset) < POLLADJ_GATE * G.discipline_jitter) {
1666
1667
1668 G.polladj_count += MINPOLL;
1669 if (G.polladj_count > POLLADJ_LIMIT) {
1670 G.polladj_count = 0;
1671 if (G.poll_exp < MAXPOLL) {
1672 G.poll_exp++;
1673 VERB3 bb_error_msg("polladj: discipline_jitter:%f ++poll_exp=%d",
1674 G.discipline_jitter, G.poll_exp);
1675 }
1676 } else {
1677 VERB3 bb_error_msg("polladj: incr:%d", G.polladj_count);
1678 }
1679 } else {
1680 G.polladj_count -= G.poll_exp * 2;
1681 if (G.polladj_count < -POLLADJ_LIMIT || G.poll_exp >= BIGPOLL) {
1682 poll_down:
1683 G.polladj_count = 0;
1684 if (G.poll_exp > MINPOLL) {
1685 llist_t *item;
1686
1687 G.poll_exp--;
1688
1689
1690
1691
1692
1693
1694 for (item = G.ntp_peers; item != NULL; item = item->link) {
1695 peer_t *pp = (peer_t *) item->data;
1696 if (pp->p_fd < 0)
1697 pp->next_action_time -= (1 << G.poll_exp);
1698 }
1699 VERB3 bb_error_msg("polladj: discipline_jitter:%f --poll_exp=%d",
1700 G.discipline_jitter, G.poll_exp);
1701 }
1702 } else {
1703 VERB3 bb_error_msg("polladj: decr:%d", G.polladj_count);
1704 }
1705 }
1706 }
1707
1708
1709 interval = poll_interval(0);
1710
1711 set_next_and_close_sock:
1712 set_next(p, interval);
1713
1714
1715
1716
1717 close(p->p_fd);
1718 p->p_fd = -1;
1719 bail:
1720 return;
1721}
1722
1723#if ENABLE_FEATURE_NTPD_SERVER
1724static NOINLINE void
1725recv_and_process_client_pkt(void )
1726{
1727 ssize_t size;
1728 uint8_t version;
1729 len_and_sockaddr *to;
1730 struct sockaddr *from;
1731 msg_t msg;
1732 uint8_t query_status;
1733 l_fixedpt_t query_xmttime;
1734
1735 to = get_sock_lsa(G.listen_fd);
1736 from = xzalloc(to->len);
1737
1738 size = recv_from_to(G.listen_fd, &msg, sizeof(msg), MSG_DONTWAIT, from, &to->u.sa, to->len);
1739 if (size != NTP_MSGSIZE_NOAUTH && size != NTP_MSGSIZE) {
1740 char *addr;
1741 if (size < 0) {
1742 if (errno == EAGAIN)
1743 goto bail;
1744 bb_perror_msg_and_die("recv");
1745 }
1746 addr = xmalloc_sockaddr2dotted_noport(from);
1747 bb_error_msg("malformed packet received from %s: size %u", addr, (int)size);
1748 free(addr);
1749 goto bail;
1750 }
1751
1752 query_status = msg.m_status;
1753 query_xmttime = msg.m_xmttime;
1754
1755
1756 memset(&msg, 0, sizeof(msg));
1757 msg.m_status = G.stratum < MAXSTRAT ? G.ntp_status : LI_ALARM;
1758 msg.m_status |= (query_status & VERSION_MASK);
1759 msg.m_status |= ((query_status & MODE_MASK) == MODE_CLIENT) ?
1760 MODE_SERVER : MODE_SYM_PAS;
1761 msg.m_stratum = G.stratum;
1762 msg.m_ppoll = G.poll_exp;
1763 msg.m_precision_exp = G_precision_exp;
1764
1765 msg.m_rectime = d_to_lfp(G.cur_time);
1766 msg.m_xmttime = d_to_lfp(gettime1900d());
1767 msg.m_reftime = d_to_lfp(G.reftime);
1768 msg.m_orgtime = query_xmttime;
1769 msg.m_rootdelay = d_to_sfp(G.rootdelay);
1770
1771 msg.m_rootdisp = d_to_sfp(G.rootdisp);
1772 version = (query_status & VERSION_MASK);
1773 msg.m_refid = G.refid;
1774
1775
1776
1777 do_sendto(G.listen_fd,
1778 &to->u.sa, from, to->len,
1779 &msg, size);
1780
1781 bail:
1782 free(to);
1783 free(from);
1784}
1785#endif
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875static NOINLINE void ntp_init(char **argv)
1876{
1877 unsigned opts;
1878 llist_t *peers;
1879
1880 srandom(getpid());
1881
1882 if (getuid())
1883 bb_error_msg_and_die(bb_msg_you_must_be_root);
1884
1885
1886 G.stratum = MAXSTRAT;
1887 if (BURSTPOLL != 0)
1888 G.poll_exp = BURSTPOLL;
1889 G.last_script_run = G.reftime = G.last_update_recv_time = gettime1900d();
1890
1891
1892 peers = NULL;
1893 opt_complementary = "dd:p::wn";
1894 opts = getopt32(argv,
1895 "nqNx"
1896 "wp:S:"IF_FEATURE_NTPD_SERVER("l")
1897 "d"
1898 "46aAbgL",
1899 &peers, &G.script_name, &G.verbose);
1900 if (!(opts & (OPT_p|OPT_l)))
1901 bb_show_usage();
1902
1903
1904 while (peers)
1905 add_peers(llist_pop(&peers));
1906 if (!(opts & OPT_n)) {
1907 bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO, argv);
1908 logmode = LOGMODE_NONE;
1909 }
1910#if ENABLE_FEATURE_NTPD_SERVER
1911 G.listen_fd = -1;
1912 if (opts & OPT_l) {
1913 G.listen_fd = create_and_bind_dgram_or_die(NULL, 123);
1914 socket_want_pktinfo(G.listen_fd);
1915 setsockopt(G.listen_fd, IPPROTO_IP, IP_TOS, &const_IPTOS_LOWDELAY, sizeof(const_IPTOS_LOWDELAY));
1916 }
1917#endif
1918
1919 if (opts & OPT_N)
1920 setpriority(PRIO_PROCESS, 0, -15);
1921
1922 bb_signals((1 << SIGTERM) | (1 << SIGINT), record_signo);
1923
1924 bb_signals((1 << SIGPIPE) | (1 << SIGCHLD), SIG_IGN);
1925}
1926
1927int ntpd_main(int argc UNUSED_PARAM, char **argv) MAIN_EXTERNALLY_VISIBLE;
1928int ntpd_main(int argc UNUSED_PARAM, char **argv)
1929{
1930#undef G
1931 struct globals G;
1932 struct pollfd *pfd;
1933 peer_t **idx2peer;
1934 unsigned cnt;
1935
1936 memset(&G, 0, sizeof(G));
1937 SET_PTR_TO_GLOBALS(&G);
1938
1939 ntp_init(argv);
1940
1941
1942 cnt = G.peer_cnt + ENABLE_FEATURE_NTPD_SERVER;
1943 idx2peer = xzalloc(sizeof(idx2peer[0]) * cnt);
1944 pfd = xzalloc(sizeof(pfd[0]) * cnt);
1945
1946
1947
1948
1949
1950
1951
1952
1953 cnt = G.peer_cnt * (INITIAL_SAMLPES + 1);
1954
1955 while (!bb_got_signal) {
1956 llist_t *item;
1957 unsigned i, j;
1958 int nfds, timeout;
1959 double nextaction;
1960
1961
1962
1963 nextaction = G.cur_time + 3600;
1964
1965 i = 0;
1966#if ENABLE_FEATURE_NTPD_SERVER
1967 if (G.listen_fd != -1) {
1968 pfd[0].fd = G.listen_fd;
1969 pfd[0].events = POLLIN;
1970 i++;
1971 }
1972#endif
1973
1974 for (item = G.ntp_peers; item != NULL; item = item->link) {
1975 peer_t *p = (peer_t *) item->data;
1976
1977 if (p->next_action_time <= G.cur_time) {
1978 if (p->p_fd == -1) {
1979
1980 if (--cnt == 0) {
1981 G.initial_poll_complete = 1;
1982 }
1983 send_query_to_peer(p);
1984 } else {
1985
1986 close(p->p_fd);
1987 p->p_fd = -1;
1988 timeout = poll_interval(-2);
1989 bb_error_msg("timed out waiting for %s, reach 0x%02x, next query in %us",
1990 p->p_dotted, p->reachable_bits, timeout);
1991 set_next(p, timeout);
1992 }
1993 }
1994
1995 if (p->next_action_time < nextaction)
1996 nextaction = p->next_action_time;
1997
1998 if (p->p_fd >= 0) {
1999
2000 pfd[i].fd = p->p_fd;
2001 pfd[i].events = POLLIN;
2002 idx2peer[i] = p;
2003 i++;
2004 }
2005 }
2006
2007 timeout = nextaction - G.cur_time;
2008 if (timeout < 0)
2009 timeout = 0;
2010 timeout++;
2011
2012
2013 VERB2 bb_error_msg("poll %us, sockets:%u, poll interval:%us", timeout, i, 1 << G.poll_exp);
2014 nfds = poll(pfd, i, timeout * 1000);
2015 gettime1900d();
2016 if (nfds <= 0) {
2017 if (G.script_name && G.cur_time - G.last_script_run > 11*60) {
2018
2019 run_script("periodic", G.last_update_offset);
2020 gettime1900d();
2021 }
2022 continue;
2023 }
2024
2025
2026 j = 0;
2027#if ENABLE_FEATURE_NTPD_SERVER
2028 if (G.listen_fd != -1) {
2029 if (pfd[0].revents ) {
2030 nfds--;
2031 recv_and_process_client_pkt();
2032 gettime1900d();
2033 }
2034 j = 1;
2035 }
2036#endif
2037 for (; nfds != 0 && j < i; j++) {
2038 if (pfd[j].revents ) {
2039 nfds--;
2040 recv_and_process_peer_pkt(idx2peer[j]);
2041 gettime1900d();
2042 }
2043 }
2044 }
2045
2046 kill_myself_with_sig(bb_got_signal);
2047}
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058#if 0
2059static double
2060direct_freq(double fp_offset)
2061{
2062
2063#ifdef KERNEL_PLL
2064
2065
2066
2067
2068 if (pll_control && kern_enable) {
2069 memset(&ntv, 0, sizeof(ntv));
2070 ntp_adjtime(&ntv);
2071#ifdef STA_NANO
2072 clock_offset = ntv.offset / 1e9;
2073#else
2074 clock_offset = ntv.offset / 1e6;
2075#endif
2076 drift_comp = FREQTOD(ntv.freq);
2077 }
2078#endif
2079 set_freq((fp_offset - clock_offset) / (current_time - clock_epoch) + drift_comp);
2080 wander_resid = 0;
2081 return drift_comp;
2082}
2083
2084static void
2085set_freq(double freq)
2086{
2087 char tbuf[80];
2088
2089 drift_comp = freq;
2090
2091#ifdef KERNEL_PLL
2092
2093
2094
2095 if (pll_control && kern_enable) {
2096 memset(&ntv, 0, sizeof(ntv));
2097 ntv.modes = MOD_FREQUENCY;
2098 ntv.freq = DTOFREQ(drift_comp);
2099 ntp_adjtime(&ntv);
2100 snprintf(tbuf, sizeof(tbuf), "kernel %.3f PPM", drift_comp * 1e6);
2101 report_event(EVNT_FSET, NULL, tbuf);
2102 } else {
2103 snprintf(tbuf, sizeof(tbuf), "ntpd %.3f PPM", drift_comp * 1e6);
2104 report_event(EVNT_FSET, NULL, tbuf);
2105 }
2106#else
2107 snprintf(tbuf, sizeof(tbuf), "ntpd %.3f PPM", drift_comp * 1e6);
2108 report_event(EVNT_FSET, NULL, tbuf);
2109#endif
2110}
2111
2112...
2113...
2114...
2115
2116#ifdef KERNEL_PLL
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132 if (pll_control && kern_enable) {
2133
2134#define MOD_BITS (MOD_OFFSET | MOD_MAXERROR | MOD_ESTERROR | MOD_STATUS | MOD_TIMECONST)
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147 memset(&ntv, 0, sizeof(ntv));
2148 if (ext_enable) {
2149 ntv.modes = MOD_STATUS;
2150 } else {
2151#ifdef STA_NANO
2152 ntv.modes = MOD_BITS | MOD_NANO;
2153#else
2154 ntv.modes = MOD_BITS;
2155#endif
2156 if (clock_offset < 0)
2157 dtemp = -.5;
2158 else
2159 dtemp = .5;
2160#ifdef STA_NANO
2161 ntv.offset = (int32)(clock_offset * 1e9 + dtemp);
2162 ntv.constant = sys_poll;
2163#else
2164 ntv.offset = (int32)(clock_offset * 1e6 + dtemp);
2165 ntv.constant = sys_poll - 4;
2166#endif
2167 ntv.esterror = (u_int32)(clock_jitter * 1e6);
2168 ntv.maxerror = (u_int32)((sys_rootdelay / 2 + sys_rootdisp) * 1e6);
2169 ntv.status = STA_PLL;
2170
2171
2172
2173
2174 if (pps_enable) {
2175 if (!(pll_status & STA_PPSTIME))
2176 report_event(EVNT_KERN,
2177 NULL, "PPS enabled");
2178 ntv.status |= STA_PPSTIME | STA_PPSFREQ;
2179 } else {
2180 if (pll_status & STA_PPSTIME)
2181 report_event(EVNT_KERN,
2182 NULL, "PPS disabled");
2183 ntv.status &= ~(STA_PPSTIME |
2184 STA_PPSFREQ);
2185 }
2186 if (sys_leap == LEAP_ADDSECOND)
2187 ntv.status |= STA_INS;
2188 else if (sys_leap == LEAP_DELSECOND)
2189 ntv.status |= STA_DEL;
2190 }
2191
2192
2193
2194
2195
2196
2197 if (ntp_adjtime(&ntv) == TIME_ERROR) {
2198 if (!(ntv.status & STA_PPSSIGNAL))
2199 report_event(EVNT_KERN, NULL,
2200 "PPS no signal");
2201 }
2202 pll_status = ntv.status;
2203#ifdef STA_NANO
2204 clock_offset = ntv.offset / 1e9;
2205#else
2206 clock_offset = ntv.offset / 1e6;
2207#endif
2208 clock_frequency = FREQTOD(ntv.freq);
2209
2210
2211
2212
2213 if (ntv.status & STA_PPSTIME) {
2214#ifdef STA_NANO
2215 clock_jitter = ntv.jitter / 1e9;
2216#else
2217 clock_jitter = ntv.jitter / 1e6;
2218#endif
2219 }
2220
2221#if defined(STA_NANO) && NTP_API == 4
2222
2223
2224
2225 if (loop_tai != sys_tai) {
2226 loop_tai = sys_tai;
2227 ntv.modes = MOD_TAI;
2228 ntv.constant = sys_tai;
2229 ntp_adjtime(&ntv);
2230 }
2231#endif
2232 }
2233#endif
2234#endif
2235