2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
13 #define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
14 #define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
15 #define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
16 #define FD_ZERO(p) memset((char *)(p), 0, sizeof(*(p)))
20 #define NBBY 8 /* number of bits per byte */
28 struct sockaddr_in sin;
29 struct sockaddr_in bcast;
30 struct sockaddr_in mask;
34 extern struct intf addrs[];
38 * Definitions for the masses
40 #define JAN_1970 2208988800 /* 1970 - 1900 in seconds */
43 * Daemon specific (ntpd.c)
45 #define SHIFT_MASK 0xff /* number of intervals to wait */
48 #define WAYTOOBIG 1000.0 /* Too many seconds to correct, something is
53 #define XTAL 1 /* crystal controlled clock by default */
57 #define NTPINITFILE "/etc/ntp.conf"
60 #define NTPDRIFTCOMP "/etc/ntp.drift"
64 struct ntp_peer *head;
65 struct ntp_peer *tail;
69 #define STRMCMP(a, cond, b) \
70 (((a) == UNSPECIFIED ? NTP_INFIN+1 : a) cond \
71 ((b) == UNSPECIFIED ? NTP_INFIN+1 : (b)))
75 * Definitions outlined in the NTP spec
78 #define NTP_PORT 123 /* for ref only (see /etc/services) */
80 #define NTP_MAXAGE 86400
81 #define NTP_MAXSKW 0.01 /* seconds */
82 #define NTP_MINDIST 0.02 /* seconds */
84 #define NTP_REFMAXSKW 0.001 /* seconds (for REFCLOCKs) */
85 #define NTP_REFMINDIST 0.001 /* seconds (for REFCLOCKs) */
87 #define NTP_MINPOLL 6 /* (64) seconds between messages */
88 #define NTP_MAXPOLL 10 /* (1024) secs to poll */
89 #define NTP_WINDOW 8 /* size of shift register */
90 #define NTP_MAXWGT 8 /* maximum allowable dispersion */
91 #define NTP_MAXLIST 5 /* max size of selection list */
92 #define NTP_MAXSTRA 2 /* max number of strata in selection list */
93 #define X_NTP_CANDIDATES 64 /* number of peers to consider when doing
95 #define NTP_SELECT 0.75 /* weight used to compute dispersion */
97 #define PEER_MAXDISP 64.0 /* Maximum dispersion */
98 #define PEER_THRESHOLD 0.5 /* dispersion threshold */
99 #define PEER_FILTER 0.5 /* filter weight */
103 #define NTP_WINDOW_SHIFT_MASK 0x0f
106 #define NTP_WINDOW_SHIFT_MASK 0xff
111 * 5.1 Uniform Phase Adjustments
114 #define CLOCK_UPDATE 8 /* update interval (1<<CLOCK_UPDATE secs) */
116 #define CLOCK_ADJ 2 /* adjustment interval (1<<CLOCK_ADJ secs) */
118 #if defined (hpux) /* must use settimeofday instead of adjtime */
119 #define CLOCK_PHASE 5 /* send bigger chunks */
120 #define CLOCK_MAX 0.128 /* maximum aperture (milliseconds) */
124 #if defined (AFS_SUN_ENV) /* these guys have such terrible clocks... */
125 #define CLOCK_PHASE 8 /* phase shift */
126 #define CLOCK_MAX 0.512 /* maximum aperture (milliseconds) */
130 #if defined (AFS_AIX32_ENV) /* there is a bug in adjtime */
131 #define CLOCK_PHASE 8 /* phase shift */
132 #define CLOCK_MAX 0.512 /* maximum aperture (milliseconds) */
136 #define CLOCK_PHASE 8 /* phase shift */
137 #define CLOCK_MAX 0.128 /* maximum aperture (milliseconds) */
144 #define CLOCK_PHASE 6 /* phase shift */
145 #define CLOCK_MAX 0.512 /* maximum aperture (milliseconds) */
147 #define CLOCK_FREQ 10 /* frequency shift */
148 #define CLOCK_TRACK 8
150 #define CLOCK_FACTOR 18
153 * Structure definitions for NTP fixed point values
156 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
157 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
159 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
161 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
164 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
165 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
166 * | Integer Part | Fraction Part |
167 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
179 /* sign extension problem */
180 #if defined(AFS_SUN_ENV) || defined(AFS_HPUX_ENV)
181 #define s_char(v) char v
183 #if defined(AFS_HPUX_ENV) || defined(AFS_AIX_ENV)
184 #define s_char(v) signed char v
186 #define s_char(v) int v:8
190 /* ================= Table 3.3. Packet Variables ================= */
193 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
194 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
195 * |LI | VN | Mode| Stratum | Poll | Precision |
196 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
197 * | Synchronizing Distance |
198 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
199 * | Synchronizing Dispersion |
200 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
201 * | Reference Clock Identifier |
202 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
204 * | Reference Timestamp (64 bits) |
206 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
208 * | Originate Timestamp (64 bits) |
210 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
212 * | Receive Timestamp (64 bits) |
214 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
216 * | Transmit Timestamp (64 bits) |
218 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
221 u_char status; /* status of local clock and leap info */
222 u_char stratum; /* Stratum level */
223 u_char ppoll; /* poll value */
224 s_char(precision); /* -6..-31 */
226 struct s_fixedpt distance;
227 struct s_fixedpt dispersion;
229 struct l_fixedpt reftime;
230 struct l_fixedpt org;
231 struct l_fixedpt rec;
232 struct l_fixedpt xmt;
235 * Leap Second Codes (high order two bits)
237 #define NO_WARNING 0x00 /* no warning */
238 #define PLUS_SEC 0x40 /* add a second (61 seconds) */
239 #define MINUS_SEC 0x80 /* minus a second (59 seconds) */
240 #define ALARM 0xc0 /* alarm condition (clock unsynchronized) */
247 * Clock Status Bits that Encode Version
249 #define NTPVERSION_1 0x08
250 #define VERSIONMASK 0x38
251 #define LEAPMASK 0xc0
252 #define MODEMASK 0x07
257 #define MODE_UNSPEC 0 /* unspecified */
258 #define MODE_SYM_ACT 1 /* symmetric active */
259 #define MODE_SYM_PAS 2 /* symmetric passive */
260 #define MODE_CLIENT 3 /* client */
261 #define MODE_SERVER 4 /* server */
262 #define MODE_BROADCAST 5 /* broadcast */
263 #define MODE_RES1 6 /* reserved */
264 #define MODE_RES2 7 /* reserved */
267 * Stratum Definitions
269 #define UNSPECIFIED 0
270 #define PRIM_REF 1 /* radio clock */
271 #define INFO_QUERY 62 /* **** THIS implementation dependent **** */
272 #define INFO_REPLY 63 /* **** THIS implementation dependent **** */
275 /* ================= table 3.2 Peer Variables ================= */
277 struct ntp_peer *next, *prev;
278 struct sockaddr_in src; /* both peer.srcadr and
280 int flags; /* local flags */
281 #define PEER_FL_CONFIG 1
282 #define PEER_FL_AUTHENABLE 2
283 #define PEER_FL_SANE 0x0100 /* sane peer */
284 #define PEER_FL_CANDIDATE 0x0200 /* candidate peer */
285 #define PEER_FL_SYNC 0x1000 /* peer can bet sync'd to */
286 #define PEER_FL_BCAST 0x2000 /* broadcast peer */
287 #define PEER_FL_REFCLOCK 0x4000 /* peer is a local reference clock */
288 #define PEER_FL_SELECTED 0x8000 /* actually used by query routine */
290 int sock; /* index into sockets to derive
291 peer.dstadr and peer.dstport */
292 u_char leap; /* receive */
293 u_char hmode; /* receive */
294 u_char stratum; /* receive */
295 u_char ppoll; /* receive */
296 u_char hpoll; /* poll update */
297 short precision; /* receive */
298 struct s_fixedpt distance; /* receive */
299 struct s_fixedpt dispersion; /* receive */
300 afs_uint32 refid; /* receive */
301 struct l_fixedpt reftime; /* receive */
302 struct l_fixedpt org; /* receive, clear */
303 struct l_fixedpt rec; /* receive, clear */
304 struct l_fixedpt xmt; /* transmit, clear */
305 afs_uint32 reach; /* receive, transmit, clear */
306 afs_uint32 valid; /* packet, transmit, clear */
307 afs_uint32 timer; /* receive, transmit, poll update */
308 afs_int32 stopwatch; /* <<local>> for timing */
310 * first order offsets
313 short samples; /* <<local>> */
314 double offset[PEER_SHIFT];
315 double delay[PEER_SHIFT];
316 } filter; /* filter, clear */
318 double estdelay; /* filter */
319 double estoffset; /* filter */
320 double estdisp; /* filter */
322 afs_uint32 pkt_sent; /* <<local>> */
323 afs_uint32 pkt_rcvd; /* <<local>> */
324 afs_uint32 pkt_dropped; /* <<local>> */
327 /* ================= table 3.1: System Variables ================= */
329 struct sysdata { /* procedure */
330 u_char leap; /* clock update */
331 u_char stratum; /* clock update */
332 short precision; /* system */
333 struct s_fixedpt distance; /* clock update */
334 struct s_fixedpt dispersion; /* clock update */
335 afs_uint32 refid; /* clock update */
336 struct l_fixedpt reftime; /* clock update */
337 int hold; /* clock update */
338 struct ntp_peer *peer; /* selection */
339 int maxpeers; /* <<local>> */
340 u_char filler; /* put here for %&*%$$ SUNs */
343 #define NTPDC_VERSION 2
346 * These structures are used to pass information to the ntpdc (control)
347 * program. They are unique to this implementation and not part of the
351 afs_uint32 net_address;
352 afs_uint32 my_address;
357 afs_uint32 pkt_dropped;
368 afs_int32 estdisp; /* scaled by 1000 */
369 afs_int32 estdelay; /* in milliseconds */
370 afs_int32 estoffset; /* in milliseconds */
372 struct l_fixedpt reftime;
376 afs_int32 offset[PEER_SHIFT]; /* in milliseconds */
377 afs_int32 delay[PEER_SHIFT]; /* in milliseconds */
383 u_char type; /* request type (stratum in ntp packets) */
384 u_char count; /* number of entries in this packet */
385 u_char seq; /* sequence number of this packet */
387 u_char npkts; /* total number of packets */