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