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