1*8d741a5dSApple OSS Distributions /*- 2*8d741a5dSApple OSS Distributions *********************************************************************** 3*8d741a5dSApple OSS Distributions * * 4*8d741a5dSApple OSS Distributions * Copyright (c) David L. Mills 1993-2001 * 5*8d741a5dSApple OSS Distributions * Copyright (c) Poul-Henning Kamp 2000-2001 * 6*8d741a5dSApple OSS Distributions * * 7*8d741a5dSApple OSS Distributions * Permission to use, copy, modify, and distribute this software and * 8*8d741a5dSApple OSS Distributions * its documentation for any purpose and without fee is hereby * 9*8d741a5dSApple OSS Distributions * granted, provided that the above copyright notice appears in all * 10*8d741a5dSApple OSS Distributions * copies and that both the copyright notice and this permission * 11*8d741a5dSApple OSS Distributions * notice appear in supporting documentation, and that the name * 12*8d741a5dSApple OSS Distributions * University of Delaware not be used in advertising or publicity * 13*8d741a5dSApple OSS Distributions * pertaining to distribution of the software without specific, * 14*8d741a5dSApple OSS Distributions * written prior permission. The University of Delaware makes no * 15*8d741a5dSApple OSS Distributions * representations about the suitability this software for any * 16*8d741a5dSApple OSS Distributions * purpose. It is provided "as is" without express or implied * 17*8d741a5dSApple OSS Distributions * warranty. * 18*8d741a5dSApple OSS Distributions * * 19*8d741a5dSApple OSS Distributions *********************************************************************** 20*8d741a5dSApple OSS Distributions * 21*8d741a5dSApple OSS Distributions * $FreeBSD$ 22*8d741a5dSApple OSS Distributions * 23*8d741a5dSApple OSS Distributions * This header file defines the Network Time Protocol (NTP) interfaces 24*8d741a5dSApple OSS Distributions * for user and daemon application programs. 25*8d741a5dSApple OSS Distributions * 26*8d741a5dSApple OSS Distributions * This file was originally created 17 Sep 93 by David L. Mills, Professor 27*8d741a5dSApple OSS Distributions * of University of Delaware, building on work which had already been ongoing 28*8d741a5dSApple OSS Distributions * for a decade and a half at that point in time. 29*8d741a5dSApple OSS Distributions * 30*8d741a5dSApple OSS Distributions * In 2000 the APIs got a upgrade from microseconds to nanoseconds, 31*8d741a5dSApple OSS Distributions * a joint work between Poul-Henning Kamp and David L. Mills. 32*8d741a5dSApple OSS Distributions * 33*8d741a5dSApple OSS Distributions */ 34*8d741a5dSApple OSS Distributions 35*8d741a5dSApple OSS Distributions /* 36*8d741a5dSApple OSS Distributions * Copyright (c) 2017 Apple Computer, Inc. All rights reserved. 37*8d741a5dSApple OSS Distributions * 38*8d741a5dSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 39*8d741a5dSApple OSS Distributions * 40*8d741a5dSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 41*8d741a5dSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 42*8d741a5dSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 43*8d741a5dSApple OSS Distributions * compliance with the License. The rights granted to you under the License 44*8d741a5dSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 45*8d741a5dSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 46*8d741a5dSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 47*8d741a5dSApple OSS Distributions * terms of an Apple operating system software license agreement. 48*8d741a5dSApple OSS Distributions * 49*8d741a5dSApple OSS Distributions * Please obtain a copy of the License at 50*8d741a5dSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 51*8d741a5dSApple OSS Distributions * 52*8d741a5dSApple OSS Distributions * The Original Code and all software distributed under the License are 53*8d741a5dSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 54*8d741a5dSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 55*8d741a5dSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 56*8d741a5dSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 57*8d741a5dSApple OSS Distributions * Please see the License for the specific language governing rights and 58*8d741a5dSApple OSS Distributions * limitations under the License. 59*8d741a5dSApple OSS Distributions * 60*8d741a5dSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 61*8d741a5dSApple OSS Distributions */ 62*8d741a5dSApple OSS Distributions 63*8d741a5dSApple OSS Distributions #ifndef _SYS_TIMEX_H_ 64*8d741a5dSApple OSS Distributions #define _SYS_TIMEX_H_ 1 65*8d741a5dSApple OSS Distributions 66*8d741a5dSApple OSS Distributions #include <sys/time.h> 67*8d741a5dSApple OSS Distributions 68*8d741a5dSApple OSS Distributions #define NTP_API 4 /* NTP API version */ 69*8d741a5dSApple OSS Distributions 70*8d741a5dSApple OSS Distributions /* 71*8d741a5dSApple OSS Distributions * The following defines establish the performance envelope of the 72*8d741a5dSApple OSS Distributions * kernel discipline loop. Phase or frequency errors greater than 73*8d741a5dSApple OSS Distributions * NAXPHASE or MAXFREQ are clamped to these maxima. For update intervals 74*8d741a5dSApple OSS Distributions * less than MINSEC, the loop always operates in PLL mode; while, for 75*8d741a5dSApple OSS Distributions * update intervals greater than MAXSEC, the loop always operates in FLL 76*8d741a5dSApple OSS Distributions * mode. Between these two limits the operating mode is selected by the 77*8d741a5dSApple OSS Distributions * STA_FLL bit in the status word. 78*8d741a5dSApple OSS Distributions */ 79*8d741a5dSApple OSS Distributions 80*8d741a5dSApple OSS Distributions #define MAXPHASE 500000000L /* max phase error (ns) */ 81*8d741a5dSApple OSS Distributions #define MAXFREQ 500000L /* max freq error (ns/s) */ 82*8d741a5dSApple OSS Distributions #define MINSEC 256 /* min FLL update interval (s) */ 83*8d741a5dSApple OSS Distributions #define MAXSEC 2048 /* max PLL update interval (s) */ 84*8d741a5dSApple OSS Distributions #define NANOSECOND 1000000000L /* nanoseconds in one second */ 85*8d741a5dSApple OSS Distributions #define SCALE_PPM (65536 / 1000) /* crude ns/s to scaled PPM */ 86*8d741a5dSApple OSS Distributions #define MAXTC 10 /* max time constant */ 87*8d741a5dSApple OSS Distributions 88*8d741a5dSApple OSS Distributions /* Codes for PPS (pulse-per-second) signals or leap seconds are not used but kept 89*8d741a5dSApple OSS Distributions * unchanged and commented for future compatibility. 90*8d741a5dSApple OSS Distributions */ 91*8d741a5dSApple OSS Distributions 92*8d741a5dSApple OSS Distributions /* 93*8d741a5dSApple OSS Distributions * Control mode codes (timex.modes) 94*8d741a5dSApple OSS Distributions */ 95*8d741a5dSApple OSS Distributions #define MOD_OFFSET 0x0001 /* set time offset */ 96*8d741a5dSApple OSS Distributions #define MOD_FREQUENCY 0x0002 /* set frequency offset */ 97*8d741a5dSApple OSS Distributions #define MOD_MAXERROR 0x0004 /* set maximum time error */ 98*8d741a5dSApple OSS Distributions #define MOD_ESTERROR 0x0008 /* set estimated time error */ 99*8d741a5dSApple OSS Distributions #define MOD_STATUS 0x0010 /* set clock status bits */ 100*8d741a5dSApple OSS Distributions #define MOD_TIMECONST 0x0020 /* set PLL time constant */ 101*8d741a5dSApple OSS Distributions #define MOD_PPSMAX 0x0040 /* set PPS maximum averaging time */ 102*8d741a5dSApple OSS Distributions #define MOD_TAI 0x0080 /* set TAI offset */ 103*8d741a5dSApple OSS Distributions #define MOD_MICRO 0x1000 /* select microsecond resolution */ 104*8d741a5dSApple OSS Distributions #define MOD_NANO 0x2000 /* select nanosecond resolution */ 105*8d741a5dSApple OSS Distributions #define MOD_CLKB 0x4000 /* select clock B */ 106*8d741a5dSApple OSS Distributions #define MOD_CLKA 0x8000 /* select clock A */ 107*8d741a5dSApple OSS Distributions 108*8d741a5dSApple OSS Distributions /* 109*8d741a5dSApple OSS Distributions * Status codes (timex.status) 110*8d741a5dSApple OSS Distributions */ 111*8d741a5dSApple OSS Distributions #define STA_PLL 0x0001 /* enable PLL updates (rw) */ 112*8d741a5dSApple OSS Distributions #define STA_PPSFREQ 0x0002 /* enable PPS freq discipline (rw) */ 113*8d741a5dSApple OSS Distributions #define STA_PPSTIME 0x0004 /* enable PPS time discipline (rw) */ 114*8d741a5dSApple OSS Distributions #define STA_FLL 0x0008 /* enable FLL mode (rw) */ 115*8d741a5dSApple OSS Distributions #define STA_INS 0x0010 /* insert leap (rw) */ 116*8d741a5dSApple OSS Distributions #define STA_DEL 0x0020 /* delete leap (rw) */ 117*8d741a5dSApple OSS Distributions #define STA_UNSYNC 0x0040 /* clock unsynchronized (rw) */ 118*8d741a5dSApple OSS Distributions #define STA_FREQHOLD 0x0080 /* hold frequency (rw) */ 119*8d741a5dSApple OSS Distributions #define STA_PPSSIGNAL 0x0100 /* PPS signal present (ro) */ 120*8d741a5dSApple OSS Distributions #define STA_PPSJITTER 0x0200 /* PPS signal jitter exceeded (ro) */ 121*8d741a5dSApple OSS Distributions #define STA_PPSWANDER 0x0400 /* PPS signal wander exceeded (ro) */ 122*8d741a5dSApple OSS Distributions #define STA_PPSERROR 0x0800 /* PPS signal calibration error (ro) */ 123*8d741a5dSApple OSS Distributions #define STA_CLOCKERR 0x1000 /* clock hardware fault (ro) */ 124*8d741a5dSApple OSS Distributions #define STA_NANO 0x2000 /* resolution (0 = us, 1 = ns) (ro) */ 125*8d741a5dSApple OSS Distributions #define STA_MODE 0x4000 /* mode (0 = PLL, 1 = FLL) (ro) */ 126*8d741a5dSApple OSS Distributions #define STA_CLK 0x8000 /* clock source (0 = A, 1 = B) (ro) */ 127*8d741a5dSApple OSS Distributions 128*8d741a5dSApple OSS Distributions #define STA_RONLY (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | \ 129*8d741a5dSApple OSS Distributions STA_PPSERROR | STA_CLOCKERR | STA_NANO | STA_MODE | STA_CLK) 130*8d741a5dSApple OSS Distributions 131*8d741a5dSApple OSS Distributions #define STA_SUPPORTED (STA_PLL | STA_FLL | STA_UNSYNC | STA_FREQHOLD | \ 132*8d741a5dSApple OSS Distributions STA_CLOCKERR | STA_NANO | STA_MODE | STA_CLK) 133*8d741a5dSApple OSS Distributions 134*8d741a5dSApple OSS Distributions /* 135*8d741a5dSApple OSS Distributions * Clock states (ntptimeval.time_state) 136*8d741a5dSApple OSS Distributions */ 137*8d741a5dSApple OSS Distributions #define TIME_OK 0 /* no leap second warning */ 138*8d741a5dSApple OSS Distributions #define TIME_INS 1 /* insert leap second warning */ 139*8d741a5dSApple OSS Distributions #define TIME_DEL 2 /* delete leap second warning */ 140*8d741a5dSApple OSS Distributions #define TIME_OOP 3 /* leap second in progress */ 141*8d741a5dSApple OSS Distributions #define TIME_WAIT 4 /* leap second has occurred */ 142*8d741a5dSApple OSS Distributions #define TIME_ERROR 5 /* error (see status word) */ 143*8d741a5dSApple OSS Distributions 144*8d741a5dSApple OSS Distributions /* 145*8d741a5dSApple OSS Distributions * NTP user interface -- ntp_gettime - used to read kernel clock values 146*8d741a5dSApple OSS Distributions */ 147*8d741a5dSApple OSS Distributions struct ntptimeval { 148*8d741a5dSApple OSS Distributions struct timespec time; /* current time (ns) (ro) */ 149*8d741a5dSApple OSS Distributions long maxerror; /* maximum error (us) (ro) */ 150*8d741a5dSApple OSS Distributions long esterror; /* estimated error (us) (ro) */ 151*8d741a5dSApple OSS Distributions long tai; /* TAI offset */ 152*8d741a5dSApple OSS Distributions int time_state; /* time status */ 153*8d741a5dSApple OSS Distributions }; 154*8d741a5dSApple OSS Distributions 155*8d741a5dSApple OSS Distributions /* 156*8d741a5dSApple OSS Distributions * NTP daemon interface -- ntp_adjtime -- used to discipline CPU clock 157*8d741a5dSApple OSS Distributions * oscillator and control/determine status. 158*8d741a5dSApple OSS Distributions * 159*8d741a5dSApple OSS Distributions * Note: The offset, precision and jitter members are in microseconds if 160*8d741a5dSApple OSS Distributions * STA_NANO is zero and nanoseconds if not. 161*8d741a5dSApple OSS Distributions */ 162*8d741a5dSApple OSS Distributions struct timex { 163*8d741a5dSApple OSS Distributions unsigned int modes; /* clock mode bits (wo) */ 164*8d741a5dSApple OSS Distributions long offset; /* time offset (ns/us) (rw) */ 165*8d741a5dSApple OSS Distributions long freq; /* frequency offset (scaled PPM) (rw) */ 166*8d741a5dSApple OSS Distributions long maxerror; /* maximum error (us) (rw) */ 167*8d741a5dSApple OSS Distributions long esterror; /* estimated error (us) (rw) */ 168*8d741a5dSApple OSS Distributions int status; /* clock status bits (rw) */ 169*8d741a5dSApple OSS Distributions long constant; /* poll interval (log2 s) (rw) */ 170*8d741a5dSApple OSS Distributions long precision; /* clock precision (ns/us) (ro) */ 171*8d741a5dSApple OSS Distributions long tolerance; /* clock frequency tolerance (scaled 172*8d741a5dSApple OSS Distributions * PPM) (ro) */ 173*8d741a5dSApple OSS Distributions /* 174*8d741a5dSApple OSS Distributions * The following read-only structure members are used by 175*8d741a5dSApple OSS Distributions * the PPS signal discipline that is currently not supported. 176*8d741a5dSApple OSS Distributions * They are included for compatibility. 177*8d741a5dSApple OSS Distributions */ 178*8d741a5dSApple OSS Distributions long ppsfreq; /* PPS frequency (scaled PPM) (ro) */ 179*8d741a5dSApple OSS Distributions long jitter; /* PPS jitter (ns/us) (ro) */ 180*8d741a5dSApple OSS Distributions int shift; /* interval duration (s) (shift) (ro) */ 181*8d741a5dSApple OSS Distributions long stabil; /* PPS stability (scaled PPM) (ro) */ 182*8d741a5dSApple OSS Distributions long jitcnt; /* jitter limit exceeded (ro) */ 183*8d741a5dSApple OSS Distributions long calcnt; /* calibration intervals (ro) */ 184*8d741a5dSApple OSS Distributions long errcnt; /* calibration errors (ro) */ 185*8d741a5dSApple OSS Distributions long stbcnt; /* stability limit exceeded (ro) */ 186*8d741a5dSApple OSS Distributions }; 187*8d741a5dSApple OSS Distributions 188*8d741a5dSApple OSS Distributions #ifdef KERNEL 189*8d741a5dSApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 190*8d741a5dSApple OSS Distributions #include <sys/_types/_user32_timex.h> 191*8d741a5dSApple OSS Distributions #include <sys/_types/_user64_timex.h> 192*8d741a5dSApple OSS Distributions #include <sys/_types/_user32_ntptimeval.h> 193*8d741a5dSApple OSS Distributions #include <sys/_types/_user64_ntptimeval.h> 194*8d741a5dSApple OSS Distributions #include <kern/clock.h> 195*8d741a5dSApple OSS Distributions 196*8d741a5dSApple OSS Distributions int64_t ntp_get_freq(void); 197*8d741a5dSApple OSS Distributions void ntp_update_second(int64_t *adjustment, clock_sec_t secs); 198*8d741a5dSApple OSS Distributions void ntp_init(void); 199*8d741a5dSApple OSS Distributions #endif 200*8d741a5dSApple OSS Distributions #else /* !_KERNEL */ 201*8d741a5dSApple OSS Distributions #include <sys/cdefs.h> 202*8d741a5dSApple OSS Distributions 203*8d741a5dSApple OSS Distributions __BEGIN_DECLS 204*8d741a5dSApple OSS Distributions #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 205*8d741a5dSApple OSS Distributions int ntp_adjtime(struct timex *); 206*8d741a5dSApple OSS Distributions int ntp_gettime(struct ntptimeval *); 207*8d741a5dSApple OSS Distributions #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ 208*8d741a5dSApple OSS Distributions __END_DECLS 209*8d741a5dSApple OSS Distributions #endif /* KERNEL */ 210*8d741a5dSApple OSS Distributions 211*8d741a5dSApple OSS Distributions 212*8d741a5dSApple OSS Distributions #endif /* !_SYS_TIMEX_H_ */ 213