Home | History | Annotate | Line # | Download | only in sys
timex.h revision 1.1.1.6
      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_ */
    310