Annotation of embedaddon/ntp/kernel/sys/timex.h, revision 1.1

1.1     ! misho       1: /******************************************************************************
        !             2:  *                                                                            *
        !             3:  * Copyright (c) David L. Mills 1993, 1994                                    *
        !             4:  *                                                                            *
        !             5:  * Permission to use, copy, modify, and distribute this software and its      *
        !             6:  * documentation for any purpose and without fee is hereby granted, provided  *
        !             7:  * that the above copyright notice appears in all copies and that both the    *
        !             8:  * copyright notice and this permission notice appear in supporting           *
        !             9:  * documentation, and that the name University of Delaware not be used in     *
        !            10:  * advertising or publicity pertaining to distribution of the software        *
        !            11:  * without specific, written prior permission.  The University of Delaware    *
        !            12:  * makes no representations about the suitability this software for any       *
        !            13:  * purpose.  It is provided "as is" without express or implied warranty.      *
        !            14:  *                                                                            *
        !            15:  ******************************************************************************/
        !            16: 
        !            17: /*
        !            18:  * Modification history timex.h
        !            19:  *
        !            20:  * 26 Sep 94   David L. Mills
        !            21:  *     Added defines for hybrid phase/frequency-lock loop.
        !            22:  *
        !            23:  * 19 Mar 94   David L. Mills
        !            24:  *     Moved defines from kernel routines to header file and added new
        !            25:  *     defines for PPS phase-lock loop.
        !            26:  *
        !            27:  * 20 Feb 94   David L. Mills
        !            28:  *     Revised status codes and structures for external clock and PPS
        !            29:  *     signal discipline.
        !            30:  *
        !            31:  * 28 Nov 93   David L. Mills
        !            32:  *     Adjusted parameters to improve stability and increase poll
        !            33:  *     interval.
        !            34:  *
        !            35:  * 17 Sep 93    David L. Mills
        !            36:  *      Created file
        !            37:  */
        !            38: /*
        !            39:  * This header file defines the Network Time Protocol (NTP) interfaces
        !            40:  * for user and daemon application programs. These are implemented using
        !            41:  * private syscalls and data structures and require specific kernel
        !            42:  * support.
        !            43:  *
        !            44:  * NAME
        !            45:  *     ntp_gettime - NTP user application interface
        !            46:  *
        !            47:  * SYNOPSIS
        !            48:  *     #include <sys/timex.h>
        !            49:  *
        !            50:  *     int syscall(SYS_ntp_gettime, tptr)
        !            51:  *
        !            52:  *     int SYS_ntp_gettime             defined in syscall.h header file
        !            53:  *     struct ntptimeval *tptr         pointer to ntptimeval structure
        !            54:  *
        !            55:  * NAME
        !            56:  *     ntp_adjtime - NTP daemon application interface
        !            57:  *
        !            58:  * SYNOPSIS
        !            59:  *     #include <sys/timex.h>
        !            60:  *
        !            61:  *     int syscall(SYS_ntp_adjtime, mode, tptr)
        !            62:  *
        !            63:  *     int SYS_ntp_adjtime             defined in syscall.h header file
        !            64:  *     struct timex *tptr              pointer to timex structure
        !            65:  *
        !            66:  */
        !            67: #ifndef _SYS_TIMEX_H_
        !            68: #define _SYS_TIMEX_H_ 1
        !            69: 
        !            70: #ifndef MSDOS                  /* Microsoft specific */
        !            71: #include <sys/syscall.h>
        !            72: #endif /* MSDOS */
        !            73: 
        !            74: /*
        !            75:  * The following defines establish the engineering parameters of the
        !            76:  * phase-lock loop (PLL) model used in the kernel implementation. These
        !            77:  * parameters have been carefully chosen by analysis for good stability
        !            78:  * and wide dynamic range.
        !            79:  *
        !            80:  * The hz variable is defined in the kernel build environment. It
        !            81:  * establishes the timer interrupt frequency, 100 Hz for the SunOS
        !            82:  * kernel, 256 Hz for the Ultrix kernel and 1024 Hz for the OSF/1
        !            83:  * kernel. SHIFT_HZ expresses the same value as the nearest power of two
        !            84:  * in order to avoid hardware multiply operations.
        !            85:  *
        !            86:  * SHIFT_KG and SHIFT_KF establish the damping of the PLL and are chosen
        !            87:  * for a slightly underdamped convergence characteristic. SHIFT_KH
        !            88:  * establishes the damping of the FLL and is chosen by wisdom and black
        !            89:  * art.
        !            90:  *
        !            91:  * MAXTC establishes the maximum time constant of the PLL. With the
        !            92:  * SHIFT_KG and SHIFT_KF values given and a time constant range from
        !            93:  * zero to MAXTC, the PLL will converge in 15 minutes to 16 hours,
        !            94:  * respectively.
        !            95:  */
        !            96: #define SHIFT_HZ 7             /* log2(hz) */
        !            97: #define SHIFT_KG 6             /* phase factor (shift) */
        !            98: #define SHIFT_KF 16            /* PLL frequency factor (shift) */
        !            99: #define SHIFT_KH 2             /* FLL frequency factor (shift) */
        !           100: #define MAXTC 6                        /* maximum time constant (shift) */
        !           101: 
        !           102: /*
        !           103:  * The following defines establish the scaling of the various variables
        !           104:  * used by the PLL. They are chosen to allow the greatest precision
        !           105:  * possible without overflow of a 32-bit word.
        !           106:  *
        !           107:  * SHIFT_SCALE defines the scaling (shift) of the time_phase variable,
        !           108:  * which serves as a an extension to the low-order bits of the system
        !           109:  * clock variable time.tv_usec.
        !           110:  *
        !           111:  * SHIFT_UPDATE defines the scaling (shift) of the time_offset variable,
        !           112:  * which represents the current time offset with respect to standard
        !           113:  * time.
        !           114:  *
        !           115:  * SHIFT_USEC defines the scaling (shift) of the time_freq and
        !           116:  * time_tolerance variables, which represent the current frequency
        !           117:  * offset and maximum frequency tolerance.
        !           118:  *
        !           119:  * FINEUSEC is 1 us in SHIFT_UPDATE units of the time_phase variable.
        !           120:  */
        !           121: #define SHIFT_SCALE 22         /* phase scale (shift) */
        !           122: #define SHIFT_UPDATE (SHIFT_KG + MAXTC) /* time offset scale (shift) */
        !           123: #define SHIFT_USEC 16          /* frequency offset scale (shift) */
        !           124: #define FINEUSEC (1L << SHIFT_SCALE) /* 1 us in phase units */
        !           125: 
        !           126: /*
        !           127:  * The following defines establish the performance envelope of the PLL.
        !           128:  * They insure it operates within predefined limits, in order to satisfy
        !           129:  * correctness assertions. An excursion which exceeds these bounds is
        !           130:  * clamped to the bound and operation proceeds accordingly. In practice,
        !           131:  * this can occur only if something has failed or is operating out of
        !           132:  * tolerance, but otherwise the PLL continues to operate in a stable
        !           133:  * mode.
        !           134:  *
        !           135:  * MAXPHASE must be set greater than or equal to CLOCK.MAX (128 ms), as
        !           136:  * defined in the NTP specification. CLOCK.MAX establishes the maximum
        !           137:  * time offset allowed before the system time is reset, rather than
        !           138:  * incrementally adjusted. Here, the maximum offset is clamped to
        !           139:  * MAXPHASE only in order to prevent overflow errors due to defective
        !           140:  * protocol implementations.
        !           141:  *
        !           142:  * MAXFREQ is the maximum frequency tolerance of the CPU clock
        !           143:  * oscillator plus the maximum slew rate allowed by the protocol. It
        !           144:  * should be set to at least the frequency tolerance of the oscillator
        !           145:  * plus 100 ppm for vernier frequency adjustments. If the kernel
        !           146:  * PPS discipline code is configured (PPS_SYNC), the oscillator time and
        !           147:  * frequency are disciplined to an external source, presumably with
        !           148:  * negligible time and frequency error relative to UTC, and MAXFREQ can
        !           149:  * be reduced.
        !           150:  *
        !           151:  * MAXTIME is the maximum jitter tolerance of the PPS signal if the
        !           152:  * kernel PPS discipline code is configured (PPS_SYNC).
        !           153:  *
        !           154:  * MINSEC and MAXSEC define the lower and upper bounds on the interval
        !           155:  * between protocol updates.
        !           156:  */
        !           157: #define MAXPHASE 512000L       /* max phase error (us) */
        !           158: #ifdef PPS_SYNC
        !           159: #define MAXFREQ (512L << SHIFT_USEC) /* max freq error (100 ppm) */
        !           160: #define MAXTIME (200L << PPS_AVG) /* max PPS error (jitter) (200 us) */
        !           161: #else
        !           162: #define MAXFREQ (512L << SHIFT_USEC) /* max freq error (200 ppm) */
        !           163: #endif /* PPS_SYNC */
        !           164: #define MINSEC 16L             /* min interval between updates (s) */
        !           165: #define MAXSEC 1200L           /* max interval between updates (s) */
        !           166: 
        !           167: #ifdef PPS_SYNC
        !           168: /*
        !           169:  * The following defines are used only if a pulse-per-second (PPS)
        !           170:  * signal is available and connected via a modem control lead, such as
        !           171:  * produced by the optional ppsclock feature incorporated in the Sun
        !           172:  * asynch driver. They establish the design parameters of the frequency-
        !           173:  * lock loop used to discipline the CPU clock oscillator to the PPS
        !           174:  * signal.
        !           175:  *
        !           176:  * PPS_AVG is the averaging factor for the frequency loop, as well as
        !           177:  * the time and frequency dispersion.
        !           178:  *
        !           179:  * PPS_SHIFT and PPS_SHIFTMAX specify the minimum and maximum
        !           180:  * calibration intervals, respectively, in seconds as a power of two.
        !           181:  *
        !           182:  * PPS_VALID is the maximum interval before the PPS signal is considered
        !           183:  * invalid and protocol updates used directly instead.
        !           184:  *
        !           185:  * MAXGLITCH is the maximum interval before a time offset of more than
        !           186:  * MAXTIME is believed.
        !           187:  */
        !           188: #define PPS_AVG 2              /* pps averaging constant (shift) */
        !           189: #define PPS_SHIFT 2            /* min interval duration (s) (shift) */
        !           190: #define PPS_SHIFTMAX 8         /* max interval duration (s) (shift) */
        !           191: #define PPS_VALID 120          /* pps signal watchdog max (s) */
        !           192: #define MAXGLITCH 30           /* pps signal glitch max (s) */
        !           193: #endif /* PPS_SYNC */
        !           194: 
        !           195: /*
        !           196:  * The following defines and structures define the user interface for
        !           197:  * the ntp_gettime() and ntp_adjtime() system calls.
        !           198:  *
        !           199:  * Control mode codes (timex.modes)
        !           200:  */
        !           201: #define MOD_OFFSET     0x0001  /* set time offset */
        !           202: #define MOD_FREQUENCY  0x0002  /* set frequency offset */
        !           203: #define MOD_MAXERROR   0x0004  /* set maximum time error */
        !           204: #define MOD_ESTERROR   0x0008  /* set estimated time error */
        !           205: #define MOD_STATUS     0x0010  /* set clock status bits */
        !           206: #define MOD_TIMECONST  0x0020  /* set pll time constant */
        !           207: #define MOD_CANSCALE   0x0040  /* kernel can scale offset field */
        !           208: #define MOD_DOSCALE    0x0080  /* userland wants to scale offset field */
        !           209: 
        !           210: /*
        !           211:  * Status codes (timex.status)
        !           212:  */
        !           213: #define STA_PLL                0x0001  /* enable PLL updates (rw) */
        !           214: #define STA_PPSFREQ    0x0002  /* enable PPS freq discipline (rw) */
        !           215: #define STA_PPSTIME    0x0004  /* enable PPS time discipline (rw) */
        !           216: #define STA_FLL                0x0008  /* select frequency-lock mode (rw) */
        !           217: 
        !           218: #define STA_INS                0x0010  /* insert leap (rw) */
        !           219: #define STA_DEL                0x0020  /* delete leap (rw) */
        !           220: #define STA_UNSYNC     0x0040  /* clock unsynchronized (rw) */
        !           221: #define STA_FREQHOLD   0x0080  /* hold frequency (rw) */
        !           222: 
        !           223: #define STA_PPSSIGNAL  0x0100  /* PPS signal present (ro) */
        !           224: #define STA_PPSJITTER  0x0200  /* PPS signal jitter exceeded (ro) */
        !           225: #define STA_PPSWANDER  0x0400  /* PPS signal wander exceeded (ro) */
        !           226: #define STA_PPSERROR   0x0800  /* PPS signal calibration error (ro) */
        !           227: 
        !           228: #define STA_CLOCKERR   0x1000  /* clock hardware fault (ro) */
        !           229: 
        !           230: #define STA_RONLY (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | \
        !           231:     STA_PPSERROR | STA_CLOCKERR) /* read-only bits */
        !           232: 
        !           233: /*
        !           234:  * Clock states (time_state)
        !           235:  */
        !           236: #define TIME_OK                0       /* no leap second warning */
        !           237: #define TIME_INS       1       /* insert leap second warning */
        !           238: #define TIME_DEL       2       /* delete leap second warning */
        !           239: #define TIME_OOP       3       /* leap second in progress */
        !           240: #define TIME_WAIT      4       /* leap second has occurred */
        !           241: #define TIME_ERROR     5       /* clock not synchronized */
        !           242: 
        !           243: /*
        !           244:  * NTP user interface (ntp_gettime()) - used to read kernel clock values
        !           245:  *
        !           246:  * Note: maximum error = NTP synch distance = dispersion + delay / 2;
        !           247:  * estimated error = NTP dispersion.
        !           248:  */
        !           249: struct ntptimeval {
        !           250:        struct timeval time;    /* current time (ro) */
        !           251:        long maxerror;          /* maximum error (us) (ro) */
        !           252:        long esterror;          /* estimated error (us) (ro) */
        !           253: };
        !           254: 
        !           255: /*
        !           256:  * NTP daemon interface - (ntp_adjtime()) used to discipline CPU clock
        !           257:  * oscillator
        !           258:  */
        !           259: struct timex {
        !           260:        unsigned int modes;     /* clock mode bits (wo) */
        !           261:        long offset;            /* time offset (us) (rw) */
        !           262:        long freq;              /* frequency offset (scaled ppm) (rw) */
        !           263:        long maxerror;          /* maximum error (us) (rw) */
        !           264:        long esterror;          /* estimated error (us) (rw) */
        !           265:        int status;             /* clock status bits (rw) */
        !           266:        long constant;          /* pll time constant (rw) */
        !           267:        long precision;         /* clock precision (us) (ro) */
        !           268:        long tolerance;         /* clock frequency tolerance (scaled
        !           269:                                 * ppm) (ro) */
        !           270:        /*
        !           271:         * The following read-only structure members are implemented
        !           272:         * only if the PPS signal discipline is configured in the
        !           273:         * kernel.
        !           274:         */
        !           275:        long ppsfreq;           /* pps frequency (scaled ppm) (ro) */
        !           276:        long jitter;            /* pps jitter (us) (ro) */
        !           277:        int shift;              /* interval duration (s) (shift) (ro) */
        !           278:        long stabil;            /* pps stability (scaled ppm) (ro) */
        !           279:        long jitcnt;            /* jitter limit exceeded (ro) */
        !           280:        long calcnt;            /* calibration intervals (ro) */
        !           281:        long errcnt;            /* calibration errors (ro) */
        !           282:        long stbcnt;            /* stability limit exceeded (ro) */
        !           283: 
        !           284: };
        !           285: #ifdef __FreeBSD__
        !           286: 
        !           287: /*
        !           288:  * sysctl identifiers underneath kern.ntp_pll
        !           289:  */
        !           290: #define NTP_PLL_GETTIME        1       /* used by ntp_gettime() */
        !           291: #define NTP_PLL_MAXID  2       /* number of valid ids */
        !           292: 
        !           293: #define NTP_PLL_NAMES { \
        !           294:                          { 0, 0 }, \
        !           295:                          { "gettime", CTLTYPE_STRUCT }, \
        !           296:                      }
        !           297: 
        !           298: #ifndef KERNEL
        !           299: #include <sys/cdefs.h>
        !           300: 
        !           301: __BEGIN_DECLS
        !           302: extern int ntp_gettime        __P((struct ntptimeval *));
        !           303: extern int ntp_adjtime        __P((struct timex *));
        !           304: __END_DECLS
        !           305: 
        !           306: #endif /* not KERNEL */
        !           307: 
        !           308: #endif /* __FreeBSD__ */
        !           309: #endif /* _SYS_TIMEX_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>