d4754f8bac71513ea73dd88bc22a082d91d82544
[oweals/busybox.git] / networking / ntpd.c
1 /*
2  * NTP client/server, based on OpenNTPD 3.9p1
3  *
4  * Author: Adam Tkac <vonsch@gmail.com>
5  *
6  * Licensed under GPLv2, see file LICENSE in this tarball for details.
7  *
8  * Parts of OpenNTPD clock syncronization code is replaced by
9  * code which is based on ntp-4.2.6, whuch carries the following
10  * copyright notice:
11  *
12  ***********************************************************************
13  *                                                                     *
14  * Copyright (c) University of Delaware 1992-2009                      *
15  *                                                                     *
16  * Permission to use, copy, modify, and distribute this software and   *
17  * its documentation for any purpose with or without fee is hereby     *
18  * granted, provided that the above copyright notice appears in all    *
19  * copies and that both the copyright notice and this permission       *
20  * notice appear in supporting documentation, and that the name        *
21  * University of Delaware not be used in advertising or publicity      *
22  * pertaining to distribution of the software without specific,        *
23  * written prior permission. The University of Delaware makes no       *
24  * representations about the suitability this software for any         *
25  * purpose. It is provided "as is" without express or implied          *
26  * warranty.                                                           *
27  *                                                                     *
28  ***********************************************************************
29  */
30 #include "libbb.h"
31 #include <math.h>
32 #include <netinet/ip.h> /* For IPTOS_LOWDELAY definition */
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 /* Verbosity control (max level of -dddd options accepted).
43  * max 5 is very talkative (and bloated). 2 is non-bloated,
44  * production level setting.
45  */
46 #define MAX_VERBOSE     2
47
48
49 #define RETRY_INTERVAL  5       /* on error, retry in N secs */
50 #define QUERYTIME_MAX   15      /* wait for reply up to N secs */
51
52 #define FREQ_TOLERANCE  0.000015 /* % frequency tolerance (15 PPM) */
53 #define MINPOLL         4       /* % minimum poll interval (6: 64 s) */
54 #define MAXPOLL         12      /* % maximum poll interval (12: 1.1h, 17: 36.4h) (was 17) */
55 #define MINDISP         0.01    /* % minimum dispersion (s) */
56 #define MAXDISP         16      /* maximum dispersion (s) */
57 #define MAXSTRAT        16      /* maximum stratum (infinity metric) */
58 #define MAXDIST         1       /* % distance threshold (s) */
59 #define MIN_SELECTED    1       /* % minimum intersection survivors */
60 #define MIN_CLUSTERED   3       /* % minimum cluster survivors */
61
62 #define MAXDRIFT        0.000500 /* frequency drift we can correct (500 PPM) */
63
64 /* Clock discipline parameters and constants */
65 #define STEP_THRESHOLD  0.128   /* step threshold (s) */
66 #define WATCH_THRESHOLD 150     /* stepout threshold (s). std ntpd uses 900 (11 mins (!)) */
67 /* NB: set WATCH_THRESHOLD to ~60 when debugging to save time) */
68 #define PANIC_THRESHOLD 1000    /* panic threshold (s) */
69
70 /* Poll-adjust threshold.
71  * When we see that offset is small enough compared to discipline jitter,
72  * we grow a counter: += MINPOLL. When it goes over POLLADJ_LIMIT,
73  * we poll_exp++. If offset isn't small, counter -= poll_exp*2,
74  * and when it goes below -POLLADJ_LIMIT, we poll_exp--
75  */
76 #define POLLADJ_LIMIT   30
77 /* If offset < POLLADJ_GATE * discipline_jitter, then we can increase
78  * poll interval (we think we can't improve timekeeping
79  * by staying at smaller poll).
80  */
81 #define POLLADJ_GATE    4
82 /* Compromise Allan intercept (s). doc uses 1500, std ntpd uses 512 */
83 #define ALLAN           512
84 /* PLL loop gain */
85 #define PLL             65536
86 /* FLL loop gain [why it depends on MAXPOLL??] */
87 #define FLL             (MAXPOLL + 1)
88 /* Parameter averaging constant */
89 #define AVG             4
90
91
92 enum {
93         NTP_VERSION     = 4,
94         NTP_MAXSTRATUM  = 15,
95
96         NTP_DIGESTSIZE     = 16,
97         NTP_MSGSIZE_NOAUTH = 48,
98         NTP_MSGSIZE        = (NTP_MSGSIZE_NOAUTH + 4 + NTP_DIGESTSIZE),
99
100         /* Status Masks */
101         MODE_MASK       = (7 << 0),
102         VERSION_MASK    = (7 << 3),
103         VERSION_SHIFT   = 3,
104         LI_MASK         = (3 << 6),
105
106         /* Leap Second Codes (high order two bits of m_status) */
107         LI_NOWARNING    = (0 << 6),    /* no warning */
108         LI_PLUSSEC      = (1 << 6),    /* add a second (61 seconds) */
109         LI_MINUSSEC     = (2 << 6),    /* minus a second (59 seconds) */
110         LI_ALARM        = (3 << 6),    /* alarm condition */
111
112         /* Mode values */
113         MODE_RES0       = 0,    /* reserved */
114         MODE_SYM_ACT    = 1,    /* symmetric active */
115         MODE_SYM_PAS    = 2,    /* symmetric passive */
116         MODE_CLIENT     = 3,    /* client */
117         MODE_SERVER     = 4,    /* server */
118         MODE_BROADCAST  = 5,    /* broadcast */
119         MODE_RES1       = 6,    /* reserved for NTP control message */
120         MODE_RES2       = 7,    /* reserved for private use */
121 };
122
123 //TODO: better base selection
124 #define OFFSET_1900_1970 2208988800UL  /* 1970 - 1900 in seconds */
125
126 #define NUM_DATAPOINTS  8
127
128 typedef struct {
129         uint32_t int_partl;
130         uint32_t fractionl;
131 } l_fixedpt_t;
132
133 typedef struct {
134         uint16_t int_parts;
135         uint16_t fractions;
136 } s_fixedpt_t;
137
138 typedef struct {
139         uint8_t     m_status;     /* status of local clock and leap info */
140         uint8_t     m_stratum;
141         uint8_t     m_ppoll;      /* poll value */
142         int8_t      m_precision_exp;
143         s_fixedpt_t m_rootdelay;
144         s_fixedpt_t m_rootdisp;
145         uint32_t    m_refid;
146         l_fixedpt_t m_reftime;
147         l_fixedpt_t m_orgtime;
148         l_fixedpt_t m_rectime;
149         l_fixedpt_t m_xmttime;
150         uint32_t    m_keyid;
151         uint8_t     m_digest[NTP_DIGESTSIZE];
152 } msg_t;
153
154 typedef struct {
155         double d_recv_time;
156         double d_offset;
157         double d_dispersion;
158 } datapoint_t;
159
160 typedef struct {
161         len_and_sockaddr *p_lsa;
162         char             *p_dotted;
163         /* when to send new query (if p_fd == -1)
164          * or when receive times out (if p_fd >= 0): */
165         time_t           next_action_time;
166         int              p_fd;
167         int              datapoint_idx;
168         uint32_t         lastpkt_refid;
169         uint8_t          lastpkt_leap;
170         uint8_t          lastpkt_stratum;
171         uint8_t          p_reachable_bits;
172         double           p_xmttime;
173         double           lastpkt_recv_time;
174         double           lastpkt_delay;
175         double           lastpkt_rootdelay;
176         double           lastpkt_rootdisp;
177         /* produced by filter algorithm: */
178         double           filter_offset;
179         double           filter_dispersion;
180         double           filter_jitter;
181         datapoint_t      filter_datapoint[NUM_DATAPOINTS];
182         /* last sent packet: */
183         msg_t            p_xmt_msg;
184 } peer_t;
185
186
187 enum {
188         OPT_n = (1 << 0),
189         OPT_q = (1 << 1),
190         OPT_N = (1 << 2),
191         OPT_x = (1 << 3),
192         /* Insert new options above this line. */
193         /* Non-compat options: */
194         OPT_p = (1 << 4),
195         OPT_l = (1 << 5) * ENABLE_FEATURE_NTPD_SERVER,
196 };
197
198 struct globals {
199         /* total round trip delay to currently selected reference clock */
200         double   rootdelay;
201         /* reference timestamp: time when the system clock was last set or corrected */
202         double   reftime;
203         /* total dispersion to currently selected reference clock */
204         double   rootdisp;
205         llist_t  *ntp_peers;
206 #if ENABLE_FEATURE_NTPD_SERVER
207         int      listen_fd;
208 #endif
209         unsigned verbose;
210         unsigned peer_cnt;
211         /* refid: 32-bit code identifying the particular server or reference clock
212          *  in stratum 0 packets this is a four-character ASCII string,
213          *  called the kiss code, used for debugging and monitoring
214          *  in stratum 1 packets this is a four-character ASCII string
215          *  assigned to the reference clock by IANA. Example: "GPS "
216          *  in stratum 2+ packets, it's IPv4 address or 4 first bytes of MD5 hash of IPv6
217          */
218         uint32_t refid;
219         uint8_t  leap;
220         /* precision is defined as the larger of the resolution and time to
221          * read the clock, in log2 units.  For instance, the precision of a
222          * mains-frequency clock incrementing at 60 Hz is 16 ms, even when the
223          * system clock hardware representation is to the nanosecond.
224          *
225          * Delays, jitters of various kinds are clamper down to precision.
226          *
227          * If precision_sec is too large, discipline_jitter gets clamped to it
228          * and if offset is much smaller than discipline_jitter, poll interval
229          * grows even though we really can benefit from staying at smaller one,
230          * collecting non-lagged datapoits and correcting the offset.
231          * (Lagged datapoits exist when poll_exp is large but we still have
232          * systematic offset error - the time distance between datapoints
233          * is significat and older datapoints have smaller offsets.
234          * This makes our offset estimation a bit smaller than reality)
235          * Due to this effect, setting G_precision_sec close to
236          * STEP_THRESHOLD isn't such a good idea - offsets may grow
237          * too big and we will step. I observed it with -6.
238          *
239          * OTOH, setting precision too small would result in futile attempts
240          * to syncronize to the unachievable precision.
241          *
242          * -6 is 1/64 sec, -7 is 1/128 sec and so on.
243          */
244 #define G_precision_exp  -8
245 #define G_precision_sec  (1.0 / (1 << (- G_precision_exp)))
246         uint8_t  stratum;
247         /* Bool. After set to 1, never goes back to 0: */
248 //TODO: fix logic:
249 //      uint8_t  time_was_stepped;
250         uint8_t  adjtimex_was_done;
251
252         uint8_t  discipline_state;      // doc calls it c.state
253         uint8_t  poll_exp;              // s.poll
254         int      polladj_count;         // c.count
255         long     kernel_freq_drift;
256         double   last_update_offset;    // c.last
257         double   last_update_recv_time; // s.t
258         double   discipline_jitter;     // c.jitter
259 //TODO: add s.jitter - grep for it here and see clock_combine() in doc
260 #define USING_KERNEL_PLL_LOOP 1
261 #if !USING_KERNEL_PLL_LOOP
262         double   discipline_freq_drift; // c.freq
263 //TODO: conditionally calculate wander? it's used only for logging
264         double   discipline_wander;     // c.wander
265 #endif
266 };
267 #define G (*ptr_to_globals)
268
269 static const int const_IPTOS_LOWDELAY = IPTOS_LOWDELAY;
270
271
272 #define VERB1 if (MAX_VERBOSE && G.verbose)
273 #define VERB2 if (MAX_VERBOSE >= 2 && G.verbose >= 2)
274 #define VERB3 if (MAX_VERBOSE >= 3 && G.verbose >= 3)
275 #define VERB4 if (MAX_VERBOSE >= 4 && G.verbose >= 4)
276 #define VERB5 if (MAX_VERBOSE >= 5 && G.verbose >= 5)
277
278
279 static double LOG2D(int a)
280 {
281         if (a < 0)
282                 return 1.0 / (1UL << -a);
283         return 1UL << a;
284 }
285 static ALWAYS_INLINE double SQUARE(double x)
286 {
287         return x * x;
288 }
289 static ALWAYS_INLINE double MAXD(double a, double b)
290 {
291         if (a > b)
292                 return a;
293         return b;
294 }
295 static ALWAYS_INLINE double MIND(double a, double b)
296 {
297         if (a < b)
298                 return a;
299         return b;
300 }
301 #define SQRT(x) (sqrt(x))
302
303 static double
304 gettime1900d(void)
305 {
306         struct timeval tv;
307         gettimeofday(&tv, NULL); /* never fails */
308         return (tv.tv_sec + 1.0e-6 * tv.tv_usec + OFFSET_1900_1970);
309 }
310
311 static void
312 d_to_tv(double d, struct timeval *tv)
313 {
314         tv->tv_sec = (long)d;
315         tv->tv_usec = (d - tv->tv_sec) * 1000000;
316 }
317
318 static double
319 lfp_to_d(l_fixedpt_t lfp)
320 {
321         double ret;
322         lfp.int_partl = ntohl(lfp.int_partl);
323         lfp.fractionl = ntohl(lfp.fractionl);
324         ret = (double)lfp.int_partl + ((double)lfp.fractionl / UINT_MAX);
325         return ret;
326 }
327 static double
328 sfp_to_d(s_fixedpt_t sfp)
329 {
330         double ret;
331         sfp.int_parts = ntohs(sfp.int_parts);
332         sfp.fractions = ntohs(sfp.fractions);
333         ret = (double)sfp.int_parts + ((double)sfp.fractions / USHRT_MAX);
334         return ret;
335 }
336 #if ENABLE_FEATURE_NTPD_SERVER
337 static l_fixedpt_t
338 d_to_lfp(double d)
339 {
340         l_fixedpt_t lfp;
341         lfp.int_partl = (uint32_t)d;
342         lfp.fractionl = (uint32_t)((d - lfp.int_partl) * UINT_MAX);
343         lfp.int_partl = htonl(lfp.int_partl);
344         lfp.fractionl = htonl(lfp.fractionl);
345         return lfp;
346 }
347 static s_fixedpt_t
348 d_to_sfp(double d)
349 {
350         s_fixedpt_t sfp;
351         sfp.int_parts = (uint16_t)d;
352         sfp.fractions = (uint16_t)((d - sfp.int_parts) * USHRT_MAX);
353         sfp.int_parts = htons(sfp.int_parts);
354         sfp.fractions = htons(sfp.fractions);
355         return sfp;
356 }
357 #endif
358
359 static double
360 dispersion(const datapoint_t *dp, double t)
361 {
362         return dp->d_dispersion + FREQ_TOLERANCE * (t - dp->d_recv_time);
363 }
364
365 static double
366 root_distance(peer_t *p, double t)
367 {
368         /* The root synchronization distance is the maximum error due to
369          * all causes of the local clock relative to the primary server.
370          * It is defined as half the total delay plus total dispersion
371          * plus peer jitter.
372          */
373         return MAXD(MINDISP, p->lastpkt_rootdelay + p->lastpkt_delay) / 2
374                 + p->lastpkt_rootdisp
375                 + p->filter_dispersion
376                 + FREQ_TOLERANCE * (t - p->lastpkt_recv_time)
377                 + p->filter_jitter;
378 }
379
380 static void
381 set_next(peer_t *p, unsigned t)
382 {
383         p->next_action_time = time(NULL) + t;
384 }
385
386 /*
387  * Peer clock filter and its helpers
388  */
389 static void
390 filter_datapoints(peer_t *p, double t)
391 {
392         int i, idx;
393         double minoff, maxoff, wavg, sum, w;
394         double x = x;
395
396         minoff = maxoff = p->filter_datapoint[0].d_offset;
397         for (i = 1; i < NUM_DATAPOINTS; i++) {
398                 if (minoff > p->filter_datapoint[i].d_offset)
399                         minoff = p->filter_datapoint[i].d_offset;
400                 if (maxoff < p->filter_datapoint[i].d_offset)
401                         maxoff = p->filter_datapoint[i].d_offset;
402         }
403
404         idx = p->datapoint_idx; /* most recent datapoint */
405         /* Average offset:
406          * Drop two outliers and take weighted average of the rest:
407          * most_recent/2 + older1/4 + older2/8 ... + older5/32 + older6/32
408          * we use older6/32, not older6/64 since sum of weights should be 1:
409          * 1/2 + 1/4 + 1/8 + 1/16 + 1/32 + 1/32 = 1
410          */
411         wavg = 0;
412         w = 0.5;
413         //                     n-1
414         //                     ---    dispersion(i)
415         // filter_dispersion =  \     -------------
416         //                      /       (i+1)
417         //                     ---     2
418         //                     i=0
419         sum = 0;
420         for (i = 0; i < NUM_DATAPOINTS; i++) {
421                 VERB4 {
422                         bb_error_msg("datapoint[%d]: off:%f disp:%f(%f) age:%f%s",
423                                 i,
424                                 p->filter_datapoint[idx].d_offset,
425                                 p->filter_datapoint[idx].d_dispersion, dispersion(&p->filter_datapoint[idx], t),
426                                 t - p->filter_datapoint[idx].d_recv_time,
427                                 (minoff == p->filter_datapoint[idx].d_offset || maxoff == p->filter_datapoint[idx].d_offset)
428                                         ? " (outlier by offset)" : ""
429                         );
430                 }
431
432                 sum += dispersion(&p->filter_datapoint[idx], t) / (2 << i);
433
434                 if (minoff == p->filter_datapoint[idx].d_offset) {
435                         minoff -= 1;
436                 } else
437                 if (maxoff == p->filter_datapoint[idx].d_offset) {
438                         maxoff += 1;
439                 } else {
440                         x = p->filter_datapoint[idx].d_offset * w;
441                         wavg += x;
442                         w /= 2;
443                 }
444
445                 idx = (idx - 1) & (NUM_DATAPOINTS - 1);
446         }
447         wavg += x; /* add another older6/64 to form older6/32 */
448         p->filter_offset = wavg;
449         p->filter_dispersion = sum;
450
451         //                       +-----            -----+ ^ 1/2
452         //                       |  n-1                 |
453         //                       |  ---                 |
454         //                  1    |  \                2  |
455         // filter_jitter = --- * |  /  (avg-offset_j)   |
456         //                  n    |  ---                 |
457         //                       |  j=0                 |
458         //                       +-----            -----+
459         // where n is the number of valid datapoints in the filter (n > 1);
460         // if filter_jitter < precision then filter_jitter = precision
461         sum = 0;
462         for (i = 0; i < NUM_DATAPOINTS; i++) {
463                 sum += SQUARE(wavg - p->filter_datapoint[i].d_offset);
464         }
465         sum = SQRT(sum) / NUM_DATAPOINTS;
466         p->filter_jitter = sum > G_precision_sec ? sum : G_precision_sec;
467
468         VERB3 bb_error_msg("filter offset:%f disp:%f jitter:%f",
469                         p->filter_offset, p->filter_dispersion, p->filter_jitter);
470
471 }
472
473 static void
474 reset_peer_stats(peer_t *p, double t, double offset)
475 {
476         int i;
477         for (i = 0; i < NUM_DATAPOINTS; i++) {
478                 if (offset < 16 * STEP_THRESHOLD) {
479                         p->filter_datapoint[i].d_recv_time -= offset;
480                         if (p->filter_datapoint[i].d_offset != 0) {
481                                 p->filter_datapoint[i].d_offset -= offset;
482                         }
483                 } else {
484                         p->filter_datapoint[i].d_recv_time  = t;
485                         p->filter_datapoint[i].d_offset     = 0;
486                         p->filter_datapoint[i].d_dispersion = MAXDISP;
487                 }
488         }
489         if (offset < 16 * STEP_THRESHOLD) {
490                 p->lastpkt_recv_time -= offset;
491         } else {
492                 p->p_reachable_bits = 0;
493                 p->lastpkt_recv_time = t;
494         }
495         filter_datapoints(p, t); /* recalc p->filter_xxx */
496         p->next_action_time -= (time_t)offset;
497         VERB5 bb_error_msg("%s->lastpkt_recv_time=%f", p->p_dotted, p->lastpkt_recv_time);
498 }
499
500 static void
501 add_peers(char *s)
502 {
503         peer_t *p;
504
505         p = xzalloc(sizeof(*p));
506         p->p_lsa = xhost2sockaddr(s, 123);
507         p->p_dotted = xmalloc_sockaddr2dotted_noport(&p->p_lsa->u.sa);
508         p->p_fd = -1;
509         p->p_xmt_msg.m_status = MODE_CLIENT | (NTP_VERSION << 3);
510         p->next_action_time = time(NULL); /* = set_next(p, 0); */
511         reset_peer_stats(p, gettime1900d(), 16 * STEP_THRESHOLD);
512         /* Speed up initial sync: with small offsets from peers,
513          * 3 samples will sync
514          */
515         p->filter_datapoint[6].d_dispersion = 0;
516         p->filter_datapoint[7].d_dispersion = 0;
517
518         llist_add_to(&G.ntp_peers, p);
519         G.peer_cnt++;
520 }
521
522 static int
523 do_sendto(int fd,
524                 const struct sockaddr *from, const struct sockaddr *to, socklen_t addrlen,
525                 msg_t *msg, ssize_t len)
526 {
527         ssize_t ret;
528
529         errno = 0;
530         if (!from) {
531                 ret = sendto(fd, msg, len, MSG_DONTWAIT, to, addrlen);
532         } else {
533                 ret = send_to_from(fd, msg, len, MSG_DONTWAIT, to, from, addrlen);
534         }
535         if (ret != len) {
536                 bb_perror_msg("send failed");
537                 return -1;
538         }
539         return 0;
540 }
541
542 static int
543 send_query_to_peer(peer_t *p)
544 {
545         // Why do we need to bind()?
546         // See what happens when we don't bind:
547         //
548         // socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
549         // setsockopt(3, SOL_IP, IP_TOS, [16], 4) = 0
550         // gettimeofday({1259071266, 327885}, NULL) = 0
551         // sendto(3, "xxx", 48, MSG_DONTWAIT, {sa_family=AF_INET, sin_port=htons(123), sin_addr=inet_addr("10.34.32.125")}, 16) = 48
552         // ^^^ we sent it from some source port picked by kernel.
553         // time(NULL)              = 1259071266
554         // write(2, "ntpd: entering poll 15 secs\n", 28) = 28
555         // poll([{fd=3, events=POLLIN}], 1, 15000) = 1 ([{fd=3, revents=POLLIN}])
556         // recv(3, "yyy", 68, MSG_DONTWAIT) = 48
557         // ^^^ this recv will receive packets to any local port!
558         //
559         // Uncomment this and use strace to see it in action:
560 #define PROBE_LOCAL_ADDR // { len_and_sockaddr lsa; lsa.len = LSA_SIZEOF_SA; getsockname(p->query.fd, &lsa.u.sa, &lsa.len); }
561
562         if (p->p_fd == -1) {
563                 int fd, family;
564                 len_and_sockaddr *local_lsa;
565
566                 family = p->p_lsa->u.sa.sa_family;
567                 p->p_fd = fd = xsocket_type(&local_lsa, family, SOCK_DGRAM);
568                 /* local_lsa has "null" address and port 0 now.
569                  * bind() ensures we have a *particular port* selected by kernel
570                  * and remembered in p->p_fd, thus later recv(p->p_fd)
571                  * receives only packets sent to this port.
572                  */
573                 PROBE_LOCAL_ADDR
574                 xbind(fd, &local_lsa->u.sa, local_lsa->len);
575                 PROBE_LOCAL_ADDR
576 #if ENABLE_FEATURE_IPV6
577                 if (family == AF_INET)
578 #endif
579                         setsockopt(fd, IPPROTO_IP, IP_TOS, &const_IPTOS_LOWDELAY, sizeof(const_IPTOS_LOWDELAY));
580                 free(local_lsa);
581         }
582
583         /*
584          * Send out a random 64-bit number as our transmit time.  The NTP
585          * server will copy said number into the originate field on the
586          * response that it sends us.  This is totally legal per the SNTP spec.
587          *
588          * The impact of this is two fold: we no longer send out the current
589          * system time for the world to see (which may aid an attacker), and
590          * it gives us a (not very secure) way of knowing that we're not
591          * getting spoofed by an attacker that can't capture our traffic
592          * but can spoof packets from the NTP server we're communicating with.
593          *
594          * Save the real transmit timestamp locally.
595          */
596         p->p_xmt_msg.m_xmttime.int_partl = random();
597         p->p_xmt_msg.m_xmttime.fractionl = random();
598         p->p_xmttime = gettime1900d();
599
600         if (do_sendto(p->p_fd, /*from:*/ NULL, /*to:*/ &p->p_lsa->u.sa, /*addrlen:*/ p->p_lsa->len,
601                         &p->p_xmt_msg, NTP_MSGSIZE_NOAUTH) == -1
602         ) {
603                 close(p->p_fd);
604                 p->p_fd = -1;
605                 set_next(p, RETRY_INTERVAL);
606                 return -1;
607         }
608
609         p->p_reachable_bits <<= 1;
610         VERB1 bb_error_msg("sent query to %s", p->p_dotted);
611         set_next(p, QUERYTIME_MAX);
612
613         return 0;
614 }
615
616
617 static void
618 step_time(double offset)
619 {
620         double dtime;
621         struct timeval tv;
622         char buf[80];
623         time_t tval;
624
625         gettimeofday(&tv, NULL); /* never fails */
626         dtime = offset + tv.tv_sec;
627         dtime += 1.0e-6 * tv.tv_usec;
628         d_to_tv(dtime, &tv);
629
630         if (settimeofday(&tv, NULL) == -1)
631                 bb_perror_msg_and_die("settimeofday");
632
633         tval = tv.tv_sec;
634         strftime(buf, sizeof(buf), "%a %b %e %H:%M:%S %Z %Y", localtime(&tval));
635
636         bb_error_msg("setting clock to %s (offset %fs)", buf, offset);
637
638 //      G.time_was_stepped = 1;
639 }
640
641
642 /*
643  * Selection and clustering, and their helpers
644  */
645 typedef struct {
646         peer_t *p;
647         int    type;
648         double edge;
649 } point_t;
650 static int
651 compare_point_edge(const void *aa, const void *bb)
652 {
653         const point_t *a = aa;
654         const point_t *b = bb;
655         if (a->edge < b->edge) {
656                 return -1;
657         }
658         return (a->edge > b->edge);
659 }
660 typedef struct {
661         peer_t *p;
662         double metric;
663 } survivor_t;
664 static int
665 compare_survivor_metric(const void *aa, const void *bb)
666 {
667         const survivor_t *a = aa;
668         const survivor_t *b = bb;
669         if (a->metric < b->metric)
670                 return -1;
671         return (a->metric > b->metric);
672 }
673 static int
674 fit(peer_t *p, double rd)
675 {
676         if (p->p_reachable_bits == 0) {
677                 VERB3 bb_error_msg("peer %s unfit for selection: unreachable", p->p_dotted);
678                 return 0;
679         }
680 //TODO: we never accept such packets anyway, right?
681         if ((p->lastpkt_leap & LI_ALARM) == LI_ALARM
682          || p->lastpkt_stratum >= MAXSTRAT
683         ) {
684                 VERB3 bb_error_msg("peer %s unfit for selection: bad status/stratum", p->p_dotted);
685                 return 0;
686         }
687         /* rd is root_distance(p, t) */
688         if (rd > MAXDIST + FREQ_TOLERANCE * (1 << G.poll_exp)) {
689                 VERB3 bb_error_msg("peer %s unfit for selection: root distance too high", p->p_dotted);
690                 return 0;
691         }
692 //TODO
693 //      /* Do we have a loop? */
694 //      if (p->refid == p->dstaddr || p->refid == s.refid)
695 //              return 0;
696         return 1;
697 }
698 static peer_t*
699 select_and_cluster(double t)
700 {
701         llist_t    *item;
702         int        i, j;
703         int        size = 3 * G.peer_cnt;
704         /* for selection algorithm */
705         point_t    point[size];
706         unsigned   num_points, num_candidates;
707         double     low, high;
708         unsigned   num_falsetickers;
709         /* for cluster algorithm */
710         survivor_t survivor[size];
711         unsigned   num_survivors;
712
713         /* Selection */
714
715         num_points = 0;
716         item = G.ntp_peers;
717         while (item != NULL) {
718                 peer_t *p = (peer_t *) item->data;
719                 double rd = root_distance(p, t);
720                 double offset = p->filter_offset;
721
722                 if (!fit(p, rd)) {
723                         item = item->link;
724                         continue;
725                 }
726
727                 VERB4 bb_error_msg("interval: [%f %f %f] %s",
728                                 offset - rd,
729                                 offset,
730                                 offset + rd,
731                                 p->p_dotted
732                 );
733                 point[num_points].p = p;
734                 point[num_points].type = -1;
735                 point[num_points].edge = offset - rd;
736                 num_points++;
737                 point[num_points].p = p;
738                 point[num_points].type = 0;
739                 point[num_points].edge = offset;
740                 num_points++;
741                 point[num_points].p = p;
742                 point[num_points].type = 1;
743                 point[num_points].edge = offset + rd;
744                 num_points++;
745                 item = item->link;
746         }
747         num_candidates = num_points / 3;
748         if (num_candidates == 0) {
749                 VERB3 bb_error_msg("no valid datapoints, no peer selected");
750                 return NULL; /* never happers? */
751         }
752 //TODO: sorting does not seem to be done in reference code
753         qsort(point, num_points, sizeof(point[0]), compare_point_edge);
754
755         /* Start with the assumption that there are no falsetickers.
756          * Attempt to find a nonempty intersection interval containing
757          * the midpoints of all truechimers.
758          * If a nonempty interval cannot be found, increase the number
759          * of assumed falsetickers by one and try again.
760          * If a nonempty interval is found and the number of falsetickers
761          * is less than the number of truechimers, a majority has been found
762          * and the midpoint of each truechimer represents
763          * the candidates available to the cluster algorithm.
764          */
765         num_falsetickers = 0;
766         while (1) {
767                 int c;
768                 unsigned num_midpoints = 0;
769
770                 low = 1 << 9;
771                 high = - (1 << 9);
772                 c = 0;
773                 for (i = 0; i < num_points; i++) {
774                         /* We want to do:
775                          * if (point[i].type == -1) c++;
776                          * if (point[i].type == 1) c--;
777                          * and it's simpler to do it this way:
778                          */
779                         c -= point[i].type;
780                         if (c >= num_candidates - num_falsetickers) {
781                                 /* If it was c++ and it got big enough... */
782                                 low = point[i].edge;
783                                 break;
784                         }
785                         if (point[i].type == 0)
786                                 num_midpoints++;
787                 }
788                 c = 0;
789                 for (i = num_points-1; i >= 0; i--) {
790                         c += point[i].type;
791                         if (c >= num_candidates - num_falsetickers) {
792                                 high = point[i].edge;
793                                 break;
794                         }
795                         if (point[i].type == 0)
796                                 num_midpoints++;
797                 }
798                 /* If the number of midpoints is greater than the number
799                  * of allowed falsetickers, the intersection contains at
800                  * least one truechimer with no midpoint - bad.
801                  * Also, interval should be nonempty.
802                  */
803                 if (num_midpoints <= num_falsetickers && low < high)
804                         break;
805                 num_falsetickers++;
806                 if (num_falsetickers * 2 >= num_candidates) {
807                         VERB3 bb_error_msg("too many falsetickers:%d (candidates:%d), no peer selected",
808                                         num_falsetickers, num_candidates);
809                         return NULL;
810                 }
811         }
812         VERB3 bb_error_msg("selected interval: [%f, %f]; candidates:%d falsetickers:%d",
813                         low, high, num_candidates, num_falsetickers);
814
815         /* Clustering */
816
817         /* Construct a list of survivors (p, metric)
818          * from the chime list, where metric is dominated
819          * first by stratum and then by root distance.
820          * All other things being equal, this is the order of preference.
821          */
822         num_survivors = 0;
823         for (i = 0; i < num_points; i++) {
824                 peer_t *p;
825
826                 if (point[i].edge < low || point[i].edge > high)
827                         continue;
828                 p = point[i].p;
829                 survivor[num_survivors].p = p;
830 //TODO: save root_distance in point_t and reuse here?
831                 survivor[num_survivors].metric = MAXDIST * p->lastpkt_stratum + root_distance(p, t);
832                 VERB4 bb_error_msg("survivor[%d] metric:%f peer:%s",
833                         num_survivors, survivor[num_survivors].metric, p->p_dotted);
834                 num_survivors++;
835         }
836         /* There must be at least MIN_SELECTED survivors to satisfy the
837          * correctness assertions. Ordinarily, the Byzantine criteria
838          * require four survivors, but for the demonstration here, one
839          * is acceptable.
840          */
841         if (num_survivors < MIN_SELECTED) {
842                 VERB3 bb_error_msg("num_survivors %d < %d, no peer selected",
843                                 num_survivors, MIN_SELECTED);
844                 return NULL;
845         }
846
847 //looks like this is ONLY used by the fact that later we pick survivor[0].
848 //we can avoid sorting then, just find the minimum once!
849         qsort(survivor, num_survivors, sizeof(survivor[0]), compare_survivor_metric);
850
851         /* For each association p in turn, calculate the selection
852          * jitter p->sjitter as the square root of the sum of squares
853          * (p->offset - q->offset) over all q associations. The idea is
854          * to repeatedly discard the survivor with maximum selection
855          * jitter until a termination condition is met.
856          */
857         while (1) {
858                 unsigned max_idx = max_idx;
859                 double max_selection_jitter = max_selection_jitter;
860                 double min_jitter = min_jitter;
861
862                 if (num_survivors <= MIN_CLUSTERED) {
863                         bb_error_msg("num_survivors %d <= %d, not discarding more",
864                                         num_survivors, MIN_CLUSTERED);
865                         break;
866                 }
867
868                 /* To make sure a few survivors are left
869                  * for the clustering algorithm to chew on,
870                  * we stop if the number of survivors
871                  * is less than or equal to MIN_CLUSTERED (3).
872                  */
873                 for (i = 0; i < num_survivors; i++) {
874                         double selection_jitter_sq;
875                         peer_t *p = survivor[i].p;
876
877                         if (i == 0 || p->filter_jitter < min_jitter)
878                                 min_jitter = p->filter_jitter;
879
880                         selection_jitter_sq = 0;
881                         for (j = 0; j < num_survivors; j++) {
882                                 peer_t *q = survivor[j].p;
883 //TODO: where is 1/(n-1) * ... multiplier?
884                                 selection_jitter_sq += SQUARE(p->filter_offset - q->filter_offset);
885                         }
886                         if (i == 0 || selection_jitter_sq > max_selection_jitter) {
887                                 max_selection_jitter = selection_jitter_sq;
888                                 max_idx = i;
889                         }
890                         VERB5 bb_error_msg("survivor %d selection_jitter^2:%f",
891                                         i, selection_jitter_sq);
892                 }
893                 max_selection_jitter = SQRT(max_selection_jitter);
894                 VERB4 bb_error_msg("max_selection_jitter (at %d):%f min_jitter:%f",
895                                 max_idx, max_selection_jitter, min_jitter);
896
897                 /* If the maximum selection jitter is less than the
898                  * minimum peer jitter, then tossing out more survivors
899                  * will not lower the minimum peer jitter, so we might
900                  * as well stop.
901                  */
902                 if (max_selection_jitter < min_jitter) {
903                         VERB3 bb_error_msg("max_selection_jitter:%f < min_jitter:%f, num_survivors:%d, not discarding more",
904                                         max_selection_jitter, min_jitter, num_survivors);
905                         break;
906                 }
907
908                 /* Delete survivor[max_idx] from the list
909                  * and go around again.
910                  */
911                 VERB5 bb_error_msg("dropping survivor %d", max_idx);
912                 num_survivors--;
913                 while (max_idx < num_survivors) {
914                         survivor[max_idx] = survivor[max_idx + 1];
915                         max_idx++;
916                 }
917         }
918
919         /* Pick the best clock. If the old system peer is on the list
920          * and at the same stratum as the first survivor on the list,
921          * then don't do a clock hop. Otherwise, select the first
922          * survivor on the list as the new system peer.
923          */
924 //TODO - see clock_combine()
925         VERB3 bb_error_msg("selected peer %s filter_offset:%f age:%f",
926                         survivor[0].p->p_dotted,
927                         survivor[0].p->filter_offset,
928                         t - survivor[0].p->lastpkt_recv_time
929         );
930         return survivor[0].p;
931 }
932
933
934 /*
935  * Local clock discipline and its helpers
936  */
937 static void
938 set_new_values(int disc_state, double offset, double recv_time)
939 {
940         /* Enter new state and set state variables. Note we use the time
941          * of the last clock filter sample, which must be earlier than
942          * the current time.
943          */
944         VERB3 bb_error_msg("disc_state=%d last_update_offset=%f last_update_recv_time=%f",
945                         disc_state, offset, recv_time);
946         G.discipline_state = disc_state;
947         G.last_update_offset = offset;
948         G.last_update_recv_time = recv_time;
949 }
950 /* Clock state definitions */
951 #define STATE_NSET      0       /* initial state, "nothing is set" */
952 #define STATE_FSET      1       /* frequency set from file */
953 #define STATE_SPIK      2       /* spike detected */
954 #define STATE_FREQ      3       /* initial frequency */
955 #define STATE_SYNC      4       /* clock synchronized (normal operation) */
956 /* Return: -1: decrease poll interval, 0: leave as is, 1: increase */
957 static int
958 update_local_clock(peer_t *p, double t)
959 {
960         int rc;
961         long old_tmx_offset;
962         struct timex tmx;
963         double offset = p->filter_offset;
964         double recv_time = p->lastpkt_recv_time;
965         double abs_offset;
966         double freq_drift;
967         double since_last_update;
968         double etemp, dtemp;
969
970         abs_offset = fabs(offset);
971
972         /* If the offset is too large, give up and go home */
973         if (abs_offset > PANIC_THRESHOLD) {
974                 bb_error_msg_and_die("offset %f far too big, exiting", offset);
975         }
976
977         /* If this is an old update, for instance as the result
978          * of a system peer change, avoid it. We never use
979          * an old sample or the same sample twice.
980          */
981         if (recv_time <= G.last_update_recv_time) {
982                 VERB3 bb_error_msg("same or older datapoint: %f >= %f, not using it",
983                                 G.last_update_recv_time, recv_time);
984                 return 0; /* "leave poll interval as is" */
985         }
986
987         /* Clock state machine transition function. This is where the
988          * action is and defines how the system reacts to large time
989          * and frequency errors.
990          */
991         since_last_update = recv_time - G.reftime;
992         freq_drift = 0;
993         if (G.discipline_state == STATE_FREQ) {
994                 /* Ignore updates until the stepout threshold */
995                 if (since_last_update < WATCH_THRESHOLD) {
996                         VERB3 bb_error_msg("measuring drift, datapoint ignored, %f sec remains",
997                                         WATCH_THRESHOLD - since_last_update);
998                         return 0; /* "leave poll interval as is" */
999                 }
1000                 freq_drift = (offset - G.last_update_offset) / since_last_update;
1001         }
1002
1003         /* There are two main regimes: when the
1004          * offset exceeds the step threshold and when it does not.
1005          */
1006         if (abs_offset > STEP_THRESHOLD) {
1007                 llist_t *item;
1008
1009                 switch (G.discipline_state) {
1010                 case STATE_SYNC:
1011                         /* The first outlyer: ignore it, switch to SPIK state */
1012                         VERB3 bb_error_msg("offset:%f - spike detected", offset);
1013                         G.discipline_state = STATE_SPIK;
1014                         return -1; /* "decrease poll interval" */
1015
1016                 case STATE_SPIK:
1017                         /* Ignore succeeding outlyers until either an inlyer
1018                          * is found or the stepout threshold is exceeded.
1019                          */
1020                         if (since_last_update < WATCH_THRESHOLD) {
1021                                 VERB3 bb_error_msg("spike detected, datapoint ignored, %f sec remains",
1022                                                 WATCH_THRESHOLD - since_last_update);
1023                                 return -1; /* "decrease poll interval" */
1024                         }
1025                         /* fall through: we need to step */
1026                 } /* switch */
1027
1028                 /* Step the time and clamp down the poll interval.
1029                  *
1030                  * In NSET state an initial frequency correction is
1031                  * not available, usually because the frequency file has
1032                  * not yet been written. Since the time is outside the
1033                  * capture range, the clock is stepped. The frequency
1034                  * will be set directly following the stepout interval.
1035                  *
1036                  * In FSET state the initial frequency has been set
1037                  * from the frequency file. Since the time is outside
1038                  * the capture range, the clock is stepped immediately,
1039                  * rather than after the stepout interval. Guys get
1040                  * nervous if it takes 17 minutes to set the clock for
1041                  * the first time.
1042                  *
1043                  * In SPIK state the stepout threshold has expired and
1044                  * the phase is still above the step threshold. Note
1045                  * that a single spike greater than the step threshold
1046                  * is always suppressed, even at the longer poll
1047                  * intervals.
1048                  */
1049                 VERB3 bb_error_msg("stepping time by %f; poll_exp=MINPOLL", offset);
1050                 step_time(offset);
1051                 if (option_mask32 & OPT_q) {
1052                         /* We were only asked to set time once. Done. */
1053                         exit(0);
1054                 }
1055
1056                 G.polladj_count = 0;
1057                 G.poll_exp = MINPOLL;
1058                 G.stratum = MAXSTRAT;
1059                 for (item = G.ntp_peers; item != NULL; item = item->link) {
1060                         peer_t *pp = (peer_t *) item->data;
1061                         reset_peer_stats(pp, t, offset);
1062                 }
1063                 if (G.discipline_state == STATE_NSET) {
1064                         set_new_values(STATE_FREQ, /*offset:*/ 0, recv_time);
1065                         return 1; /* "ok to increase poll interval" */
1066                 }
1067                 set_new_values(STATE_SYNC, /*offset:*/ 0, recv_time);
1068
1069         } else { /* abs_offset <= STEP_THRESHOLD */
1070
1071                 if (G.poll_exp < MINPOLL) {
1072                         VERB3 bb_error_msg("saw small offset %f, disabling burst mode", offset);
1073                         G.poll_exp = MINPOLL;
1074                 }
1075
1076                 /* Compute the clock jitter as the RMS of exponentially
1077                  * weighted offset differences. Used by the poll adjust code.
1078                  */
1079                 etemp = SQUARE(G.discipline_jitter);
1080                 dtemp = SQUARE(MAXD(fabs(offset - G.last_update_offset), G_precision_sec));
1081                 G.discipline_jitter = SQRT(etemp + (dtemp - etemp) / AVG);
1082                 VERB3 bb_error_msg("discipline jitter=%f", G.discipline_jitter);
1083
1084                 switch (G.discipline_state) {
1085                 case STATE_NSET:
1086                         if (option_mask32 & OPT_q) {
1087                                 /* We were only asked to set time once.
1088                                  * The clock is precise enough, no need to step.
1089                                  */
1090                                 exit(0);
1091                         }
1092                         /* This is the first update received and the frequency
1093                          * has not been initialized. The first thing to do
1094                          * is directly measure the oscillator frequency.
1095                          */
1096                         set_new_values(STATE_FREQ, offset, recv_time);
1097                         VERB3 bb_error_msg("transitioning to FREQ, datapoint ignored");
1098                         return -1; /* "decrease poll interval" */
1099
1100 #if 0 /* this is dead code for now */
1101                 case STATE_FSET:
1102                         /* This is the first update and the frequency
1103                          * has been initialized. Adjust the phase, but
1104                          * don't adjust the frequency until the next update.
1105                          */
1106                         set_new_values(STATE_SYNC, offset, recv_time);
1107                         /* freq_drift remains 0 */
1108                         break;
1109 #endif
1110
1111                 case STATE_FREQ:
1112                         /* since_last_update >= WATCH_THRESHOLD, we waited enough.
1113                          * Correct the phase and frequency and switch to SYNC state.
1114                          * freq_drift was already estimated (see code above)
1115                          */
1116                         set_new_values(STATE_SYNC, offset, recv_time);
1117                         break;
1118
1119                 default:
1120                         /* Compute freq_drift due to PLL and FLL contributions.
1121                          *
1122                          * The FLL and PLL frequency gain constants
1123                          * depend on the poll interval and Allan
1124                          * intercept. The FLL is not used below one-half
1125                          * the Allan intercept. Above that the loop gain
1126                          * increases in steps to 1 / AVG.
1127                          */
1128                         if ((1 << G.poll_exp) > ALLAN / 2) {
1129                                 etemp = FLL - G.poll_exp;
1130                                 if (etemp < AVG)
1131                                         etemp = AVG;
1132                                 freq_drift += (offset - G.last_update_offset) / (MAXD(since_last_update, ALLAN) * etemp);
1133                         }
1134                         /* For the PLL the integration interval
1135                          * (numerator) is the minimum of the update
1136                          * interval and poll interval. This allows
1137                          * oversampling, but not undersampling.
1138                          */
1139                         etemp = MIND(since_last_update, (1 << G.poll_exp));
1140                         dtemp = (4 * PLL) << G.poll_exp;
1141                         freq_drift += offset * etemp / SQUARE(dtemp);
1142                         set_new_values(STATE_SYNC, offset, recv_time);
1143                         break;
1144                 }
1145                 G.stratum = p->lastpkt_stratum + 1;
1146         }
1147
1148         G.reftime = t;
1149         G.leap = p->lastpkt_leap;
1150         G.refid = p->lastpkt_refid;
1151         G.rootdelay = p->lastpkt_rootdelay + p->lastpkt_delay;
1152         dtemp = p->filter_jitter; // SQRT(SQUARE(p->filter_jitter) + SQUARE(s.jitter));
1153         dtemp += MAXD(p->filter_dispersion + FREQ_TOLERANCE * (t - p->lastpkt_recv_time) + abs_offset, MINDISP);
1154         G.rootdisp = p->lastpkt_rootdisp + dtemp;
1155         VERB3 bb_error_msg("updating leap/refid/reftime/rootdisp from peer %s", p->p_dotted);
1156
1157         /* We are in STATE_SYNC now, but did not do adjtimex yet.
1158          * (Any other state does not reach this, they all return earlier)
1159          * By this time, freq_drift and G.last_update_offset are set
1160          * to values suitable for adjtimex.
1161          */
1162 #if !USING_KERNEL_PLL_LOOP
1163         /* Calculate the new frequency drift and frequency stability (wander).
1164          * Compute the clock wander as the RMS of exponentially weighted
1165          * frequency differences. This is not used directly, but can,
1166          * along with the jitter, be a highly useful monitoring and
1167          * debugging tool.
1168          */
1169         dtemp = G.discipline_freq_drift + freq_drift;
1170         G.discipline_freq_drift = MAXD(MIND(MAXDRIFT, dtemp), -MAXDRIFT);
1171         etemp = SQUARE(G.discipline_wander);
1172         dtemp = SQUARE(dtemp);
1173         G.discipline_wander = SQRT(etemp + (dtemp - etemp) / AVG);
1174
1175         VERB3 bb_error_msg("discipline freq_drift=%.9f(int:%ld corr:%e) wander=%f",
1176                         G.discipline_freq_drift,
1177                         (long)(G.discipline_freq_drift * 65536e6),
1178                         freq_drift,
1179                         G.discipline_wander);
1180 #endif
1181         VERB3 {
1182                 memset(&tmx, 0, sizeof(tmx));
1183                 if (adjtimex(&tmx) < 0)
1184                         bb_perror_msg_and_die("adjtimex");
1185                 VERB3 bb_error_msg("p adjtimex freq:%ld offset:%ld constant:%ld status:0x%x",
1186                                 tmx.freq, tmx.offset, tmx.constant, tmx.status);
1187         }
1188
1189         old_tmx_offset = 0;
1190         if (!G.adjtimex_was_done) {
1191                 G.adjtimex_was_done = 1;
1192                 /* When we use adjtimex for the very first time,
1193                  * we need to ADD to pre-existing tmx.offset - it may be !0
1194                  */
1195                 memset(&tmx, 0, sizeof(tmx));
1196                 if (adjtimex(&tmx) < 0)
1197                         bb_perror_msg_and_die("adjtimex");
1198                 old_tmx_offset = tmx.offset;
1199         }
1200         memset(&tmx, 0, sizeof(tmx));
1201 #if 0
1202 //doesn't work, offset remains 0 (!) in kernel:
1203 //ntpd:  set adjtimex freq:1786097 tmx.offset:77487
1204 //ntpd: prev adjtimex freq:1786097 tmx.offset:0
1205 //ntpd:  cur adjtimex freq:1786097 tmx.offset:0
1206         tmx.modes = ADJ_FREQUENCY | ADJ_OFFSET;
1207         /* 65536 is one ppm */
1208         tmx.freq = G.discipline_freq_drift * 65536e6;
1209         tmx.offset = G.last_update_offset * 1000000; /* usec */
1210 #endif
1211         tmx.modes = ADJ_OFFSET | ADJ_STATUS | ADJ_TIMECONST;// | ADJ_MAXERROR | ADJ_ESTERROR;
1212         tmx.offset = (G.last_update_offset * 1000000) /* usec */
1213                         /* + (G.last_update_offset < 0 ? -0.5 : 0.5) - too small to bother */
1214                         + old_tmx_offset; /* almost always 0 */
1215         tmx.status = STA_PLL;
1216         //if (sys_leap == LEAP_ADDSECOND)
1217         //      tmx.status |= STA_INS;
1218         //else if (sys_leap == LEAP_DELSECOND)
1219         //      tmx.status |= STA_DEL;
1220         tmx.constant = G.poll_exp - 4;
1221         //tmx.esterror = (u_int32)(clock_jitter * 1e6);
1222         //tmx.maxerror = (u_int32)((sys_rootdelay / 2 + sys_rootdisp) * 1e6);
1223         VERB3 bb_error_msg("b adjtimex freq:%ld offset:%ld constant:%ld status:0x%x",
1224                         tmx.freq, tmx.offset, tmx.constant, tmx.status);
1225         rc = adjtimex(&tmx);
1226         if (rc < 0)
1227                 bb_perror_msg_and_die("adjtimex");
1228         if (G.kernel_freq_drift != tmx.freq / 65536) {
1229                 G.kernel_freq_drift = tmx.freq / 65536;
1230                 VERB2 bb_error_msg("kernel clock drift: %ld ppm", G.kernel_freq_drift);
1231         }
1232         VERB3 {
1233                 bb_error_msg("adjtimex:%d freq:%ld offset:%ld constant:%ld status:0x%x",
1234                                 rc, tmx.freq, tmx.offset, tmx.constant, tmx.status);
1235 #if 0
1236                 /* always gives the same output as above msg */
1237                 memset(&tmx, 0, sizeof(tmx));
1238                 if (adjtimex(&tmx) < 0)
1239                         bb_perror_msg_and_die("adjtimex");
1240                 VERB3 bb_error_msg("c adjtimex freq:%ld offset:%ld constant:%ld status:0x%x",
1241                                 tmx.freq, tmx.offset, tmx.constant, tmx.status);
1242 #endif
1243         }
1244 // #define STA_MODE 0x4000  /* mode (0 = PLL, 1 = FLL) (ro) */ - ?
1245 // it appeared after a while:
1246 //ntpd: p adjtimex freq:-14545653 offset:-5396 constant:10 status:0x41
1247 //ntpd: c adjtimex freq:-14547835 offset:-8307 constant:10 status:0x1
1248 //ntpd: p adjtimex freq:-14547835 offset:-6398 constant:10 status:0x41
1249 //ntpd: c adjtimex freq:-14550486 offset:-10158 constant:10 status:0x1
1250 //ntpd: p adjtimex freq:-14550486 offset:-6132 constant:10 status:0x41
1251 //ntpd: c adjtimex freq:-14636129 offset:-10158 constant:10 status:0x4001
1252 //ntpd: p adjtimex freq:-14636129 offset:-10002 constant:10 status:0x4041
1253 //ntpd: c adjtimex freq:-14636245 offset:-7497 constant:10 status:0x1
1254 //ntpd: p adjtimex freq:-14636245 offset:-4573 constant:10 status:0x41
1255 //ntpd: c adjtimex freq:-14642034 offset:-11715 constant:10 status:0x1
1256 //ntpd: p adjtimex freq:-14642034 offset:-4098 constant:10 status:0x41
1257 //ntpd: c adjtimex freq:-14699112 offset:-11746 constant:10 status:0x4001
1258 //ntpd: p adjtimex freq:-14699112 offset:-4239 constant:10 status:0x4041
1259 //ntpd: c adjtimex freq:-14762330 offset:-12786 constant:10 status:0x4001
1260 //ntpd: p adjtimex freq:-14762330 offset:-4434 constant:10 status:0x4041
1261 //ntpd: b adjtimex freq:0 offset:-9669 constant:8 status:0x1
1262 //ntpd: adjtimex:0 freq:-14809095 offset:-9669 constant:10 status:0x4001
1263 //ntpd: c adjtimex freq:-14809095 offset:-9669 constant:10 status:0x4001
1264
1265         return 1; /* "ok to increase poll interval" */
1266 }
1267
1268
1269 /*
1270  * We've got a new reply packet from a peer, process it
1271  * (helpers first)
1272  */
1273 static unsigned
1274 retry_interval(void)
1275 {
1276         /* Local problem, want to retry soon */
1277         unsigned interval, r;
1278         interval = RETRY_INTERVAL;
1279         r = random();
1280         interval += r % (unsigned)(RETRY_INTERVAL / 4);
1281         VERB3 bb_error_msg("chose retry interval:%u", interval);
1282         return interval;
1283 }
1284 static unsigned
1285 poll_interval(int exponent) /* exp is always -1 or 0 */
1286 {
1287         /* Want to send next packet at (1 << G.poll_exp) + small random value */
1288         unsigned interval, r;
1289         exponent += G.poll_exp; /* G.poll_exp is always > 0 */
1290         /* never true: if (exp < 0) exp = 0; */
1291         interval = 1 << exponent;
1292         r = random();
1293         interval += ((r & (interval-1)) >> 4) + ((r >> 8) & 1); /* + 1/16 of interval, max */
1294         VERB3 bb_error_msg("chose poll interval:%u (poll_exp:%d exp:%d)", interval, G.poll_exp, exponent);
1295         return interval;
1296 }
1297 static void
1298 recv_and_process_peer_pkt(peer_t *p)
1299 {
1300         int         rc;
1301         ssize_t     size;
1302         msg_t       msg;
1303         double      T1, T2, T3, T4;
1304         unsigned    interval;
1305         datapoint_t *datapoint;
1306         peer_t      *q;
1307
1308         /* We can recvfrom here and check from.IP, but some multihomed
1309          * ntp servers reply from their *other IP*.
1310          * TODO: maybe we should check at least what we can: from.port == 123?
1311          */
1312         size = recv(p->p_fd, &msg, sizeof(msg), MSG_DONTWAIT);
1313         if (size == -1) {
1314                 bb_perror_msg("recv(%s) error", p->p_dotted);
1315                 if (errno == EHOSTUNREACH || errno == EHOSTDOWN
1316                  || errno == ENETUNREACH || errno == ENETDOWN
1317                  || errno == ECONNREFUSED || errno == EADDRNOTAVAIL
1318                  || errno == EAGAIN
1319                 ) {
1320 //TODO: always do this?
1321                         set_next(p, retry_interval());
1322                         goto close_sock;
1323                 }
1324                 xfunc_die();
1325         }
1326
1327         if (size != NTP_MSGSIZE_NOAUTH && size != NTP_MSGSIZE) {
1328                 bb_error_msg("malformed packet received from %s", p->p_dotted);
1329                 goto bail;
1330         }
1331
1332         if (msg.m_orgtime.int_partl != p->p_xmt_msg.m_xmttime.int_partl
1333          || msg.m_orgtime.fractionl != p->p_xmt_msg.m_xmttime.fractionl
1334         ) {
1335                 goto bail;
1336         }
1337
1338         if ((msg.m_status & LI_ALARM) == LI_ALARM
1339          || msg.m_stratum == 0
1340          || msg.m_stratum > NTP_MAXSTRATUM
1341         ) {
1342 // TODO: stratum 0 responses may have commands in 32-bit m_refid field:
1343 // "DENY", "RSTR" - peer does not like us at all
1344 // "RATE" - peer is overloaded, reduce polling freq
1345                 interval = poll_interval(0);
1346                 bb_error_msg("reply from %s: not synced, next query in %us", p->p_dotted, interval);
1347                 goto close_sock;
1348         }
1349
1350 //      /*
1351 //       * Verify the server is synchronized with valid stratum and
1352 //       * reference time not later than the transmit time.
1353 //       */
1354 //      if (p->lastpkt_leap == NOSYNC || p->lastpkt_stratum >= MAXSTRAT)
1355 //              return;                 /* unsynchronized */
1356 //
1357 //      /* Verify valid root distance */
1358 //      if (msg.m_rootdelay / 2 + msg.m_rootdisp >= MAXDISP || p->lastpkt_reftime > msg.m_xmt)
1359 //              return;                 /* invalid header values */
1360
1361         p->lastpkt_leap = msg.m_status;
1362         p->lastpkt_rootdelay = sfp_to_d(msg.m_rootdelay);
1363         p->lastpkt_rootdisp = sfp_to_d(msg.m_rootdisp);
1364         p->lastpkt_refid = msg.m_refid;
1365
1366         /*
1367          * From RFC 2030 (with a correction to the delay math):
1368          *
1369          * Timestamp Name          ID   When Generated
1370          * ------------------------------------------------------------
1371          * Originate Timestamp     T1   time request sent by client
1372          * Receive Timestamp       T2   time request received by server
1373          * Transmit Timestamp      T3   time reply sent by server
1374          * Destination Timestamp   T4   time reply received by client
1375          *
1376          * The roundtrip delay and local clock offset are defined as
1377          *
1378          * delay = (T4 - T1) - (T3 - T2); offset = ((T2 - T1) + (T3 - T4)) / 2
1379          */
1380         T1 = p->p_xmttime;
1381         T2 = lfp_to_d(msg.m_rectime);
1382         T3 = lfp_to_d(msg.m_xmttime);
1383         T4 = gettime1900d();
1384
1385         p->lastpkt_recv_time = T4;
1386
1387         VERB5 bb_error_msg("%s->lastpkt_recv_time=%f", p->p_dotted, p->lastpkt_recv_time);
1388         p->datapoint_idx = p->p_reachable_bits ? (p->datapoint_idx + 1) % NUM_DATAPOINTS : 0;
1389         datapoint = &p->filter_datapoint[p->datapoint_idx];
1390         datapoint->d_recv_time = T4;
1391         datapoint->d_offset    = ((T2 - T1) + (T3 - T4)) / 2;
1392         /* The delay calculation is a special case. In cases where the
1393          * server and client clocks are running at different rates and
1394          * with very fast networks, the delay can appear negative. In
1395          * order to avoid violating the Principle of Least Astonishment,
1396          * the delay is clamped not less than the system precision.
1397          */
1398         p->lastpkt_delay = (T4 - T1) - (T3 - T2);
1399         datapoint->d_dispersion = LOG2D(msg.m_precision_exp) + G_precision_sec;
1400         if (!p->p_reachable_bits) {
1401                 /* 1st datapoint ever - replicate offset in every element */
1402                 int i;
1403                 for (i = 1; i < NUM_DATAPOINTS; i++) {
1404                         p->filter_datapoint[i].d_offset = datapoint->d_offset;
1405                 }
1406         }
1407
1408         p->p_reachable_bits |= 1;
1409         VERB1 {
1410                 bb_error_msg("reply from %s: reach 0x%02x offset %f delay %f",
1411                         p->p_dotted,
1412                         p->p_reachable_bits,
1413                         datapoint->d_offset, p->lastpkt_delay);
1414         }
1415
1416         /* Muck with statictics and update the clock */
1417         filter_datapoints(p, T4);
1418         q = select_and_cluster(T4);
1419         rc = -1;
1420         if (q)
1421                 rc = update_local_clock(q, T4);
1422
1423         if (rc != 0) {
1424                 /* Adjust the poll interval by comparing the current offset
1425                  * with the clock jitter. If the offset is less than
1426                  * the clock jitter times a constant, then the averaging interval
1427                  * is increased, otherwise it is decreased. A bit of hysteresis
1428                  * helps calm the dance. Works best using burst mode.
1429                  */
1430                 VERB4 if (rc > 0) {
1431                         bb_error_msg("offset:%f POLLADJ_GATE*discipline_jitter:%f poll:%s",
1432                                 q->filter_offset, POLLADJ_GATE * G.discipline_jitter,
1433                                 fabs(q->filter_offset) < POLLADJ_GATE * G.discipline_jitter
1434                                         ? "grows" : "falls"
1435                         );
1436                 }
1437                 if (rc > 0 && fabs(q->filter_offset) < POLLADJ_GATE * G.discipline_jitter) {
1438                         /* was += G.poll_exp but it is a bit
1439                          * too optimistic for my taste at high poll_exp's */
1440                         G.polladj_count += MINPOLL;
1441                         if (G.polladj_count > POLLADJ_LIMIT) {
1442                                 G.polladj_count = 0;
1443                                 if (G.poll_exp < MAXPOLL) {
1444                                         G.poll_exp++;
1445                                         VERB3 bb_error_msg("polladj: discipline_jitter:%f ++poll_exp=%d",
1446                                                         G.discipline_jitter, G.poll_exp);
1447                                 }
1448                         } else {
1449                                 VERB3 bb_error_msg("polladj: incr:%d", G.polladj_count);
1450                         }
1451                 } else {
1452                         G.polladj_count -= G.poll_exp * 2;
1453                         if (G.polladj_count < -POLLADJ_LIMIT) {
1454                                 G.polladj_count = 0;
1455                                 if (G.poll_exp > MINPOLL) {
1456                                         G.poll_exp--;
1457                                         VERB3 bb_error_msg("polladj: discipline_jitter:%f --poll_exp=%d",
1458                                                         G.discipline_jitter, G.poll_exp);
1459                                 }
1460                         } else {
1461                                 VERB3 bb_error_msg("polladj: decr:%d", G.polladj_count);
1462                         }
1463                 }
1464         }
1465
1466         /* Decide when to send new query for this peer */
1467         interval = poll_interval(0);
1468         set_next(p, interval);
1469
1470  close_sock:
1471         /* We do not expect any more packets from this peer for now.
1472          * Closing the socket informs kernel about it.
1473          * We open a new socket when we send a new query.
1474          */
1475         close(p->p_fd);
1476         p->p_fd = -1;
1477  bail:
1478         return;
1479 }
1480
1481 #if ENABLE_FEATURE_NTPD_SERVER
1482 static void
1483 recv_and_process_client_pkt(void /*int fd*/)
1484 {
1485         ssize_t          size;
1486         uint8_t          version;
1487         double           rectime;
1488         len_and_sockaddr *to;
1489         struct sockaddr  *from;
1490         msg_t            msg;
1491         uint8_t          query_status;
1492         l_fixedpt_t      query_xmttime;
1493
1494         to = get_sock_lsa(G.listen_fd);
1495         from = xzalloc(to->len);
1496
1497         size = recv_from_to(G.listen_fd, &msg, sizeof(msg), MSG_DONTWAIT, from, &to->u.sa, to->len);
1498         if (size != NTP_MSGSIZE_NOAUTH && size != NTP_MSGSIZE) {
1499                 char *addr;
1500                 if (size < 0) {
1501                         if (errno == EAGAIN)
1502                                 goto bail;
1503                         bb_perror_msg_and_die("recv");
1504                 }
1505                 addr = xmalloc_sockaddr2dotted_noport(from);
1506                 bb_error_msg("malformed packet received from %s: size %u", addr, (int)size);
1507                 free(addr);
1508                 goto bail;
1509         }
1510
1511         query_status = msg.m_status;
1512         query_xmttime = msg.m_xmttime;
1513
1514         /* Build a reply packet */
1515         memset(&msg, 0, sizeof(msg));
1516         msg.m_status = G.stratum < MAXSTRAT ? G.leap : LI_ALARM;
1517         msg.m_status |= (query_status & VERSION_MASK);
1518         msg.m_status |= ((query_status & MODE_MASK) == MODE_CLIENT) ?
1519                          MODE_SERVER : MODE_SYM_PAS;
1520         msg.m_stratum = G.stratum;
1521         msg.m_ppoll = G.poll_exp;
1522         msg.m_precision_exp = G_precision_exp;
1523         rectime = gettime1900d();
1524         msg.m_xmttime = msg.m_rectime = d_to_lfp(rectime);
1525         msg.m_reftime = d_to_lfp(G.reftime);
1526         msg.m_orgtime = query_xmttime;
1527         msg.m_rootdelay = d_to_sfp(G.rootdelay);
1528 //simple code does not do this, fix simple code!
1529         msg.m_rootdisp = d_to_sfp(G.rootdisp);
1530         version = (query_status & VERSION_MASK); /* ... >> VERSION_SHIFT - done below instead */
1531         msg.m_refid = G.refid; // (version > (3 << VERSION_SHIFT)) ? G.refid : G.refid3;
1532
1533         /* We reply from the local address packet was sent to,
1534          * this makes to/from look swapped here: */
1535         do_sendto(G.listen_fd,
1536                 /*from:*/ &to->u.sa, /*to:*/ from, /*addrlen:*/ to->len,
1537                 &msg, size);
1538
1539  bail:
1540         free(to);
1541         free(from);
1542 }
1543 #endif
1544
1545 /* Upstream ntpd's options:
1546  *
1547  * -4   Force DNS resolution of host names to the IPv4 namespace.
1548  * -6   Force DNS resolution of host names to the IPv6 namespace.
1549  * -a   Require cryptographic authentication for broadcast client,
1550  *      multicast client and symmetric passive associations.
1551  *      This is the default.
1552  * -A   Do not require cryptographic authentication for broadcast client,
1553  *      multicast client and symmetric passive associations.
1554  *      This is almost never a good idea.
1555  * -b   Enable the client to synchronize to broadcast servers.
1556  * -c conffile
1557  *      Specify the name and path of the configuration file,
1558  *      default /etc/ntp.conf
1559  * -d   Specify debugging mode. This option may occur more than once,
1560  *      with each occurrence indicating greater detail of display.
1561  * -D level
1562  *      Specify debugging level directly.
1563  * -f driftfile
1564  *      Specify the name and path of the frequency file.
1565  *      This is the same operation as the "driftfile FILE"
1566  *      configuration command.
1567  * -g   Normally, ntpd exits with a message to the system log
1568  *      if the offset exceeds the panic threshold, which is 1000 s
1569  *      by default. This option allows the time to be set to any value
1570  *      without restriction; however, this can happen only once.
1571  *      If the threshold is exceeded after that, ntpd will exit
1572  *      with a message to the system log. This option can be used
1573  *      with the -q and -x options. See the tinker command for other options.
1574  * -i jaildir
1575  *      Chroot the server to the directory jaildir. This option also implies
1576  *      that the server attempts to drop root privileges at startup
1577  *      (otherwise, chroot gives very little additional security).
1578  *      You may need to also specify a -u option.
1579  * -k keyfile
1580  *      Specify the name and path of the symmetric key file,
1581  *      default /etc/ntp/keys. This is the same operation
1582  *      as the "keys FILE" configuration command.
1583  * -l logfile
1584  *      Specify the name and path of the log file. The default
1585  *      is the system log file. This is the same operation as
1586  *      the "logfile FILE" configuration command.
1587  * -L   Do not listen to virtual IPs. The default is to listen.
1588  * -n   Don't fork.
1589  * -N   To the extent permitted by the operating system,
1590  *      run the ntpd at the highest priority.
1591  * -p pidfile
1592  *      Specify the name and path of the file used to record the ntpd
1593  *      process ID. This is the same operation as the "pidfile FILE"
1594  *      configuration command.
1595  * -P priority
1596  *      To the extent permitted by the operating system,
1597  *      run the ntpd at the specified priority.
1598  * -q   Exit the ntpd just after the first time the clock is set.
1599  *      This behavior mimics that of the ntpdate program, which is
1600  *      to be retired. The -g and -x options can be used with this option.
1601  *      Note: The kernel time discipline is disabled with this option.
1602  * -r broadcastdelay
1603  *      Specify the default propagation delay from the broadcast/multicast
1604  *      server to this client. This is necessary only if the delay
1605  *      cannot be computed automatically by the protocol.
1606  * -s statsdir
1607  *      Specify the directory path for files created by the statistics
1608  *      facility. This is the same operation as the "statsdir DIR"
1609  *      configuration command.
1610  * -t key
1611  *      Add a key number to the trusted key list. This option can occur
1612  *      more than once.
1613  * -u user[:group]
1614  *      Specify a user, and optionally a group, to switch to.
1615  * -v variable
1616  * -V variable
1617  *      Add a system variable listed by default.
1618  * -x   Normally, the time is slewed if the offset is less than the step
1619  *      threshold, which is 128 ms by default, and stepped if above
1620  *      the threshold. This option sets the threshold to 600 s, which is
1621  *      well within the accuracy window to set the clock manually.
1622  *      Note: since the slew rate of typical Unix kernels is limited
1623  *      to 0.5 ms/s, each second of adjustment requires an amortization
1624  *      interval of 2000 s. Thus, an adjustment as much as 600 s
1625  *      will take almost 14 days to complete. This option can be used
1626  *      with the -g and -q options. See the tinker command for other options.
1627  *      Note: The kernel time discipline is disabled with this option.
1628  */
1629
1630 /* By doing init in a separate function we decrease stack usage
1631  * in main loop.
1632  */
1633 static NOINLINE void ntp_init(char **argv)
1634 {
1635         unsigned opts;
1636         llist_t *peers;
1637
1638         srandom(getpid());
1639
1640         if (getuid())
1641                 bb_error_msg_and_die(bb_msg_you_must_be_root);
1642
1643         /* Set some globals */
1644 #if 0
1645         /* With constant b = 100, G.precision_exp is also constant -6.
1646          * Uncomment this to verify.
1647          */
1648         {
1649                 int prec = 0;
1650                 int b;
1651 # if 0
1652                 struct timespec tp;
1653                 /* We can use sys_clock_getres but assuming 10ms tick should be fine */
1654                 clock_getres(CLOCK_REALTIME, &tp);
1655                 tp.tv_sec = 0;
1656                 tp.tv_nsec = 10000000;
1657                 b = 1000000000 / tp.tv_nsec;  /* convert to Hz */
1658 # else
1659                 b = 100; /* b = 1000000000/10000000 = 100 */
1660 # endif
1661                 while (b > 1)
1662                         prec--, b >>= 1;
1663                 /*G.precision_exp = prec;*/
1664                 /*G.precision_sec = (1.0 / (1 << (- prec)));*/
1665                 bb_error_msg("G.precision_exp:%d sec:%f", prec, G_precision_sec); /* -6 */
1666         }
1667 #endif
1668         G.stratum = MAXSTRAT;
1669         G.poll_exp = 1; /* should use MINPOLL, but 1 speeds up initial sync */
1670         G.reftime = G.last_update_recv_time = gettime1900d();
1671
1672         /* Parse options */
1673         peers = NULL;
1674         opt_complementary = "dd:p::"; /* d: counter, p: list */
1675         opts = getopt32(argv,
1676                         "nqNx" /* compat */
1677                         "p:"IF_FEATURE_NTPD_SERVER("l") /* NOT compat */
1678                         "d" /* compat */
1679                         "46aAbgL", /* compat, ignored */
1680                         &peers, &G.verbose);
1681         if (!(opts & (OPT_p|OPT_l)))
1682                 bb_show_usage();
1683 //      if (opts & OPT_x) /* disable stepping, only slew is allowed */
1684 //              G.time_was_stepped = 1;
1685         while (peers)
1686                 add_peers(llist_pop(&peers));
1687         if (!(opts & OPT_n)) {
1688                 bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO, argv);
1689                 logmode = LOGMODE_NONE;
1690         }
1691 #if ENABLE_FEATURE_NTPD_SERVER
1692         G.listen_fd = -1;
1693         if (opts & OPT_l) {
1694                 G.listen_fd = create_and_bind_dgram_or_die(NULL, 123);
1695                 socket_want_pktinfo(G.listen_fd);
1696                 setsockopt(G.listen_fd, IPPROTO_IP, IP_TOS, &const_IPTOS_LOWDELAY, sizeof(const_IPTOS_LOWDELAY));
1697         }
1698 #endif
1699         /* I hesitate to set -20 prio. -15 should be high enough for timekeeping */
1700         if (opts & OPT_N)
1701                 setpriority(PRIO_PROCESS, 0, -15);
1702
1703         bb_signals((1 << SIGTERM) | (1 << SIGINT), record_signo);
1704         bb_signals((1 << SIGPIPE) | (1 << SIGHUP), SIG_IGN);
1705 }
1706
1707 int ntpd_main(int argc UNUSED_PARAM, char **argv) MAIN_EXTERNALLY_VISIBLE;
1708 int ntpd_main(int argc UNUSED_PARAM, char **argv)
1709 {
1710         struct globals g;
1711         struct pollfd *pfd;
1712         peer_t **idx2peer;
1713
1714         memset(&g, 0, sizeof(g));
1715         SET_PTR_TO_GLOBALS(&g);
1716
1717         ntp_init(argv);
1718
1719         {
1720                 /* if ENABLE_FEATURE_NTPD_SERVER, + 1 for listen_fd: */
1721                 unsigned cnt = g.peer_cnt + ENABLE_FEATURE_NTPD_SERVER;
1722                 idx2peer = xzalloc(sizeof(idx2peer[0]) * cnt);
1723                 pfd = xzalloc(sizeof(pfd[0]) * cnt);
1724         }
1725
1726         while (!bb_got_signal) {
1727                 llist_t *item;
1728                 unsigned i, j;
1729                 unsigned sent_cnt, trial_cnt;
1730                 int nfds, timeout;
1731                 time_t cur_time, nextaction;
1732
1733                 /* Nothing between here and poll() blocks for any significant time */
1734
1735                 cur_time = time(NULL);
1736                 nextaction = cur_time + 3600;
1737
1738                 i = 0;
1739 #if ENABLE_FEATURE_NTPD_SERVER
1740                 if (g.listen_fd != -1) {
1741                         pfd[0].fd = g.listen_fd;
1742                         pfd[0].events = POLLIN;
1743                         i++;
1744                 }
1745 #endif
1746                 /* Pass over peer list, send requests, time out on receives */
1747                 sent_cnt = trial_cnt = 0;
1748                 for (item = g.ntp_peers; item != NULL; item = item->link) {
1749                         peer_t *p = (peer_t *) item->data;
1750
1751                         /* Overflow-safe "if (p->next_action_time <= cur_time) ..." */
1752                         if ((int)(cur_time - p->next_action_time) >= 0) {
1753                                 if (p->p_fd == -1) {
1754                                         /* Time to send new req */
1755                                         trial_cnt++;
1756                                         if (send_query_to_peer(p) == 0)
1757                                                 sent_cnt++;
1758                                 } else {
1759                                         /* Timed out waiting for reply */
1760                                         close(p->p_fd);
1761                                         p->p_fd = -1;
1762                                         timeout = poll_interval(-1); /* try a bit faster */
1763                                         bb_error_msg("timed out waiting for %s, reach 0x%02x, next query in %us",
1764                                                         p->p_dotted, p->p_reachable_bits, timeout);
1765                                         set_next(p, timeout);
1766                                 }
1767                         }
1768
1769                         if (p->next_action_time < nextaction)
1770                                 nextaction = p->next_action_time;
1771
1772                         if (p->p_fd >= 0) {
1773                                 /* Wait for reply from this peer */
1774                                 pfd[i].fd = p->p_fd;
1775                                 pfd[i].events = POLLIN;
1776                                 idx2peer[i] = p;
1777                                 i++;
1778                         }
1779                 }
1780
1781 //              if ((trial_cnt > 0 && sent_cnt == 0) || g.peer_cnt == 0) {
1782 //                      G.time_was_stepped = 1;
1783 //              }
1784
1785                 timeout = nextaction - cur_time;
1786                 if (timeout < 1)
1787                         timeout = 1;
1788
1789                 /* Here we may block */
1790                 VERB2 bb_error_msg("poll %us, sockets:%u", timeout, i);
1791                 nfds = poll(pfd, i, timeout * 1000);
1792                 if (nfds <= 0)
1793                         continue;
1794
1795                 /* Process any received packets */
1796                 j = 0;
1797 #if ENABLE_FEATURE_NTPD_SERVER
1798                 if (g.listen_fd != -1) {
1799                         if (pfd[0].revents /* & (POLLIN|POLLERR)*/) {
1800                                 nfds--;
1801                                 recv_and_process_client_pkt(/*g.listen_fd*/);
1802                         }
1803                         j = 1;
1804                 }
1805 #endif
1806                 for (; nfds != 0 && j < i; j++) {
1807                         if (pfd[j].revents /* & (POLLIN|POLLERR)*/) {
1808                                 nfds--;
1809                                 recv_and_process_peer_pkt(idx2peer[j]);
1810                         }
1811                 }
1812         } /* while (!bb_got_signal) */
1813
1814         kill_myself_with_sig(bb_got_signal);
1815 }
1816
1817
1818
1819
1820
1821
1822 /*** openntpd-4.6 uses only adjtime, not adjtimex ***/
1823
1824 /*** ntp-4.2.6/ntpd/ntp_loopfilter.c - adjtimex usage ***/
1825
1826 #if 0
1827 static double
1828 direct_freq(double fp_offset)
1829 {
1830
1831 #ifdef KERNEL_PLL
1832         /*
1833          * If the kernel is enabled, we need the residual offset to
1834          * calculate the frequency correction.
1835          */
1836         if (pll_control && kern_enable) {
1837                 memset(&ntv, 0, sizeof(ntv));
1838                 ntp_adjtime(&ntv);
1839 #ifdef STA_NANO
1840                 clock_offset = ntv.offset / 1e9;
1841 #else /* STA_NANO */
1842                 clock_offset = ntv.offset / 1e6;
1843 #endif /* STA_NANO */
1844                 drift_comp = FREQTOD(ntv.freq);
1845         }
1846 #endif /* KERNEL_PLL */
1847         set_freq((fp_offset - clock_offset) / (current_time - clock_epoch) + drift_comp);
1848         wander_resid = 0;
1849         return drift_comp;
1850 }
1851
1852 static void
1853 set_freq(double freq) /* frequency update */
1854 {
1855         char tbuf[80];
1856
1857         drift_comp = freq;
1858
1859 #ifdef KERNEL_PLL
1860         /*
1861          * If the kernel is enabled, update the kernel frequency.
1862          */
1863         if (pll_control && kern_enable) {
1864                 memset(&ntv, 0, sizeof(ntv));
1865                 ntv.modes = MOD_FREQUENCY;
1866                 ntv.freq = DTOFREQ(drift_comp);
1867                 ntp_adjtime(&ntv);
1868                 snprintf(tbuf, sizeof(tbuf), "kernel %.3f PPM", drift_comp * 1e6);
1869                 report_event(EVNT_FSET, NULL, tbuf);
1870         } else {
1871                 snprintf(tbuf, sizeof(tbuf), "ntpd %.3f PPM", drift_comp * 1e6);
1872                 report_event(EVNT_FSET, NULL, tbuf);
1873         }
1874 #else /* KERNEL_PLL */
1875         snprintf(tbuf, sizeof(tbuf), "ntpd %.3f PPM", drift_comp * 1e6);
1876         report_event(EVNT_FSET, NULL, tbuf);
1877 #endif /* KERNEL_PLL */
1878 }
1879
1880 ...
1881 ...
1882 ...
1883
1884 #ifdef KERNEL_PLL
1885         /*
1886          * This code segment works when clock adjustments are made using
1887          * precision time kernel support and the ntp_adjtime() system
1888          * call. This support is available in Solaris 2.6 and later,
1889          * Digital Unix 4.0 and later, FreeBSD, Linux and specially
1890          * modified kernels for HP-UX 9 and Ultrix 4. In the case of the
1891          * DECstation 5000/240 and Alpha AXP, additional kernel
1892          * modifications provide a true microsecond clock and nanosecond
1893          * clock, respectively.
1894          *
1895          * Important note: The kernel discipline is used only if the
1896          * step threshold is less than 0.5 s, as anything higher can
1897          * lead to overflow problems. This might occur if some misguided
1898          * lad set the step threshold to something ridiculous.
1899          */
1900         if (pll_control && kern_enable) {
1901
1902 #define MOD_BITS (MOD_OFFSET | MOD_MAXERROR | MOD_ESTERROR | MOD_STATUS | MOD_TIMECONST)
1903
1904                 /*
1905                  * We initialize the structure for the ntp_adjtime()
1906                  * system call. We have to convert everything to
1907                  * microseconds or nanoseconds first. Do not update the
1908                  * system variables if the ext_enable flag is set. In
1909                  * this case, the external clock driver will update the
1910                  * variables, which will be read later by the local
1911                  * clock driver. Afterwards, remember the time and
1912                  * frequency offsets for jitter and stability values and
1913                  * to update the frequency file.
1914                  */
1915                 memset(&ntv,  0, sizeof(ntv));
1916                 if (ext_enable) {
1917                         ntv.modes = MOD_STATUS;
1918                 } else {
1919 #ifdef STA_NANO
1920                         ntv.modes = MOD_BITS | MOD_NANO;
1921 #else /* STA_NANO */
1922                         ntv.modes = MOD_BITS;
1923 #endif /* STA_NANO */
1924                         if (clock_offset < 0)
1925                                 dtemp = -.5;
1926                         else
1927                                 dtemp = .5;
1928 #ifdef STA_NANO
1929                         ntv.offset = (int32)(clock_offset * 1e9 + dtemp);
1930                         ntv.constant = sys_poll;
1931 #else /* STA_NANO */
1932                         ntv.offset = (int32)(clock_offset * 1e6 + dtemp);
1933                         ntv.constant = sys_poll - 4;
1934 #endif /* STA_NANO */
1935                         ntv.esterror = (u_int32)(clock_jitter * 1e6);
1936                         ntv.maxerror = (u_int32)((sys_rootdelay / 2 + sys_rootdisp) * 1e6);
1937                         ntv.status = STA_PLL;
1938
1939                         /*
1940                          * Enable/disable the PPS if requested.
1941                          */
1942                         if (pps_enable) {
1943                                 if (!(pll_status & STA_PPSTIME))
1944                                         report_event(EVNT_KERN,
1945                                             NULL, "PPS enabled");
1946                                 ntv.status |= STA_PPSTIME | STA_PPSFREQ;
1947                         } else {
1948                                 if (pll_status & STA_PPSTIME)
1949                                         report_event(EVNT_KERN,
1950                                             NULL, "PPS disabled");
1951                                 ntv.status &= ~(STA_PPSTIME |
1952                                     STA_PPSFREQ);
1953                         }
1954                         if (sys_leap == LEAP_ADDSECOND)
1955                                 ntv.status |= STA_INS;
1956                         else if (sys_leap == LEAP_DELSECOND)
1957                                 ntv.status |= STA_DEL;
1958                 }
1959
1960                 /*
1961                  * Pass the stuff to the kernel. If it squeals, turn off
1962                  * the pps. In any case, fetch the kernel offset,
1963                  * frequency and jitter.
1964                  */
1965                 if (ntp_adjtime(&ntv) == TIME_ERROR) {
1966                         if (!(ntv.status & STA_PPSSIGNAL))
1967                                 report_event(EVNT_KERN, NULL,
1968                                     "PPS no signal");
1969                 }
1970                 pll_status = ntv.status;
1971 #ifdef STA_NANO
1972                 clock_offset = ntv.offset / 1e9;
1973 #else /* STA_NANO */
1974                 clock_offset = ntv.offset / 1e6;
1975 #endif /* STA_NANO */
1976                 clock_frequency = FREQTOD(ntv.freq);
1977
1978                 /*
1979                  * If the kernel PPS is lit, monitor its performance.
1980                  */
1981                 if (ntv.status & STA_PPSTIME) {
1982 #ifdef STA_NANO
1983                         clock_jitter = ntv.jitter / 1e9;
1984 #else /* STA_NANO */
1985                         clock_jitter = ntv.jitter / 1e6;
1986 #endif /* STA_NANO */
1987                 }
1988
1989 #if defined(STA_NANO) && NTP_API == 4
1990                 /*
1991                  * If the TAI changes, update the kernel TAI.
1992                  */
1993                 if (loop_tai != sys_tai) {
1994                         loop_tai = sys_tai;
1995                         ntv.modes = MOD_TAI;
1996                         ntv.constant = sys_tai;
1997                         ntp_adjtime(&ntv);
1998                 }
1999 #endif /* STA_NANO */
2000         }
2001 #endif /* KERNEL_PLL */
2002 #endif