1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * University Copyright- Copyright (c) 1982, 1986, 1988
29  * The Regents of the University of California
30  * All Rights Reserved
31  *
32  * University Acknowledgment- Portions of this document are derived from
33  * software developed by the University of California, Berkeley, and its
34  * contributors.
35  */
36 
37 #ifndef	_NTP_H
38 #define	_NTP_H
39 
40 #pragma ident	"%Z%%M%	%I%	%E% SMI"
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 /* $Source: /usr/users/louie/ntp/RCS/ntp.h,v $  */
47 /* $Revision: 3.4.1.5 $ $Date: 89/04/10 15:55:42 $ */
48 
49 /*
50  *  $Log:	ntp.h,v $
51  * Revision 3.4.1.5  89/04/10  15:55:42  louie
52  * Provide default value for number of bits/byte if not defined.  Compute the
53  * Window shift mask inside of conditional code on XTAL so we get the correct
54  * value if configured without a crystal controled clock (!!)
55  *
56  * Revision 3.4.1.4  89/03/31  16:34:50  louie
57  * Add bit in flags which allow a peer to be synced to.  Changed a char to a bit
58  * field so that it is always signed.
59  *
60  * Revision 3.4.1.3  89/03/29  12:26:18  louie
61  * Removed some unused #defines.  Replaced MAXSTRATUM with NTP_INFIN per new
62  * spec.  The variable 'mode' in the peer structure has been renamed 'hmode'
63  * per the new spec.
64  *
65  * Revision 3.4.1.2  89/03/22  18:28:18  louie
66  * patch3: Use new RCS headers.
67  *
68  * Revision 3.4.1.1  89/03/20  00:02:53  louie
69  * 1
70  *
71  * Revision 3.4  89/03/17  18:37:00  louie
72  * Latest test release.
73  *
74  * Revision 3.3.1.1  89/03/17  18:23:49  louie
75  * Change CLOCK_FACTOR to be a power of 2.
76  *
77  * Revision 3.3  89/03/15  14:19:36  louie
78  * New baseline for next release.
79  *
80  * Revision 3.2.1.2  89/03/15  13:46:52  louie
81  * The version number for that particular flavor of ntpd <--> ntpdc interaction
82  * is now defined by NTPDC_VERSION.  The packet format for the ntpdc program
83  * has changed slightly to improve robustness when dealing with multiple packets
84  * of status data.
85  *
86  * Revision 3.2.1.1  89/03/09  17:11:24  louie
87  * patch1: Updated constants, which were previously in incorrect units.
88  *
89  * Revision 3.2  89/03/07  18:21:45  louie
90  * New version of UNIX NTP daemon and software based on the 6 March 1989
91  * draft of the new NTP protocol specification.  This version doesn't
92  * implement authentication, and accepts and send only NTP Version 1
93  * packets.
94  *
95  * Revision 3.1.1.1  89/02/15  08:54:42  louie
96  * *** empty log message ***
97  *
98  *
99  * Revision 3.1  89/01/30  14:43:07  louie
100  * Second UNIX NTP test release.
101  *
102  * Revision 3.0  88/12/12  16:01:07  louie
103  * Test release of new UNIX NTP software.  This version should conform to the
104  * revised NTP protocol specification.
105  *
106  */
107 
108 #ifndef FD_SET
109 #define	NFDBITS		32
110 #define	FD_SETSIZE	32
111 #define	FD_SET(n, p)	((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
112 #define	FD_CLR(n, p)	((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
113 #define	FD_ISSET(n, p)	((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
114 #define	FD_ZERO(p)	bzero((char *)(p), sizeof (*(p)))
115 #endif
116 
117 #ifndef	NBBY
118 #define	NBBY	8	/* number of bits per byte */
119 #endif
120 
121 #define	MAXNETIF	10
122 
123 struct intf {
124 	int fd;
125 	char *name;
126 	struct sockaddr_in sin;
127 	struct sockaddr_in bcast;
128 	struct sockaddr_in mask;
129 	int uses;
130 	int if_flags;
131 };
132 extern struct intf addrs[];
133 extern int nintf;
134 
135 /*
136  *  Definitions for the masses
137  */
138 #define	JAN_1970	2208988800U	/* 1970 - 1900 in seconds */
139 
140 /*
141  *  Daemon specific (ntpd.c)
142  */
143 #define	SHIFT_MASK	0xff	/* number of intervals to wait */
144 
145 #ifndef	WAYTOOBIG
146 #define	WAYTOOBIG	1000.0	/* Too many seconds to correct, something is */
147 				/* really wrong */
148 #endif
149 
150 #ifndef	XTAL
151 #define	XTAL	1	/* crystal controlled clock by default */
152 #endif
153 
154 #ifndef	NTPINITFILE
155 #define	NTPINITFILE	"/etc/ntp.conf"
156 #endif
157 
158 struct list {
159 	struct ntp_peer *head;
160 	struct ntp_peer *tail;
161 	int members;
162 };
163 
164 #define	STRMCMP(a, cond, b) \
165 	(((a) == UNSPECIFIED ? NTP_INFIN+1 : a) cond \
166 		((b) == UNSPECIFIED ? NTP_INFIN+1 : (b)))
167 
168 
169 /*
170  *  Definitions outlined in the NTP spec
171  */
172 #define	NTP_VERSION	1
173 #define	NTP_PORT	123	/* for ref only (see /etc/services) */
174 #define	NTP_INFIN	15
175 #define	NTP_MAXAGE	86400
176 #define	NTP_MAXSKW	0.01	/* seconds */
177 #define	NTP_MINDIST	0.02	/* seconds */
178 #define	NTP_MINPOLL	6	/* (64) seconds between messages */
179 #define	NTP_MAXPOLL	10	/* (1024) secs to poll */
180 #define	NTP_WINDOW	8	/* size of shift register */
181 #define	NTP_MAXWGT	8	/* maximum allowable dispersion */
182 #define	NTP_MAXLIST	5	/* max size of selection list */
183 #define	NTP_MAXSTRA	2	/* max number of strata in selection list */
184 #define	X_NTP_CANDIDATES 64	/* number of peers to consider when doing */
185 				/*	clock selection */
186 #define	NTP_SELECT	0.75	/* weight used to compute dispersion */
187 
188 #define	PEER_MAXDISP	64.0	/* Maximum dispersion  */
189 #define	PEER_THRESHOLD	0.5	/* dispersion threshold */
190 #define	PEER_FILTER	0.5	/* filter weight */
191 
192 #if	XTAL == 0
193 #define	PEER_SHIFT	4
194 #define	NTP_WINDOW_SHIFT_MASK 0x0f
195 #else
196 #define	PEER_SHIFT	8
197 #define	NTP_WINDOW_SHIFT_MASK 0xff
198 #endif
199 
200 
201 /*
202  *  5.1 Uniform Phase Adjustments
203  *  Clock parameters
204  */
205 #define	CLOCK_UPDATE	8	/* update interval (1<<CLOCK_UPDATE secs) */
206 #if	XTAL
207 #define	CLOCK_ADJ	2	/* adjustment interval (1<<CLOCK_ADJ secs) */
208 #define	CLOCK_PHASE	8	/* phase shift */
209 #define	CLOCK_MAX	0.128	/* maximum aperture (milliseconds) */
210 #else
211 #define	CLOCK_ADJ	0
212 #define	CLOCK_PHASE	6	/* phase shift */
213 #define	CLOCK_MAX	0.512	/* maximum aperture (milliseconds) */
214 #endif
215 #define	CLOCK_FREQ	10	/* frequency shift */
216 #define	CLOCK_TRACK	8
217 #define	CLOCK_COMP	4
218 #define	CLOCK_FACTOR	18
219 
220 /*
221  * Structure definitions for NTP fixed point values
222  *
223  *    0			  1		      2			  3
224  *    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
225  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
226  *   |			       Integer Part			     |
227  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
228  *   |			       Fraction Part			     |
229  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
230  *
231  *
232  *    0			  1		      2			  3
233  *    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
234  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
235  *   |		  Integer Part	     |	   Fraction Part	     |
236  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
237  */
238 struct l_fixedpt {
239 	ulong_t int_part;
240 	ulong_t fraction;
241 };
242 
243 struct s_fixedpt {
244 	ushort_t int_part;
245 	ushort_t fraction;
246 };
247 
248 /*
249  *  =================  Table 3.3. Packet Variables   =================
250  *    0			  1		      2			  3
251  *    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
252  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
253  *   |LI | VN  | Mode|	  Stratum    |	    Poll     |	 Precision   |
254  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
255  *   |			   Synchronizing Distance		     |
256  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
257  *   |			  Synchronizing Dispersion		     |
258  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
259  *   |			Reference Clock Identifier		     |
260  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
261  *   |								     |
262  *   |		       Reference Timestamp (64 bits)		     |
263  *   |								     |
264  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
265  *   |								     |
266  *   |		       Originate Timestamp (64 bits)		     |
267  *   |								     |
268  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
269  *   |								     |
270  *   |			Receive Timestamp (64 bits)		     |
271  *   |								     |
272  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
273  *   |								     |
274  *   |			Transmit Timestamp (64 bits)		     |
275  *   |								     |
276  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
277  *   |		     Encryption Keyid (32 bits, when A bit set)	     |
278  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
279  *   |								     |
280  *   |		Message Authentication Code/MAC (when A bit set)     |
281  *   |								     |
282  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
283  */
284 
285 #define	MAC_OCTETS_DES	8
286 #define	MAC_OCTETS_MD5	16
287 #define	MAC_OCTETS_MIN	MAC_OCTETS_DES
288 #define	MAC_OCTETS_MAX	MAC_OCTETS_MD5
289 #define	AUTH_OCTETS_V3	(MAC_OCTETS_MAX + sizeof (uint32_t))
290 
291 struct ntpdata {
292 	uchar_t li_vn_mode;	/* contains leap indicator, version and mode */
293 	uchar_t stratum; 	/* Stratum level */
294 	uchar_t ppoll;		/* poll value */
295 	int precision:8;
296 	struct s_fixedpt distance;
297 	struct s_fixedpt dispersion;
298 	ulong_t refid;
299 	struct l_fixedpt reftime;
300 	struct l_fixedpt org;
301 	struct l_fixedpt rec;
302 	struct l_fixedpt xmt;
303 	uint32_t keyid;
304 	uchar_t mac[MAC_OCTETS_MAX];
305 };
306 
307 #define	LEN_PKT_NOMAC	(sizeof (struct ntpdata) - AUTH_OCTETS_V3)
308 
309 /*
310  *	Leap Second Codes (high order two bits)
311  */
312 #define	NO_WARNING	0x00	/* no warning */
313 #define	PLUS_SEC	0x40	/* add a second (61 seconds) */
314 #define	MINUS_SEC	0x80	/* minus a second (59 seconds) */
315 #define	ALARM		0xc0	/* alarm condition (clock unsynchronized) */
316 
317 /*
318  *	Clock Status Bits that Encode Version
319  */
320 #define	NTPVERSION_1	0x08
321 #define	VERSIONMASK	0x38
322 #define	LEAPMASK	0xc0
323 #define	NTPMODEMASK	0x07
324 
325 /*
326  *	Code values
327  */
328 #define	MODE_UNSPEC	0	/* unspecified */
329 #define	MODE_SYM_ACT	1	/* symmetric active */
330 #define	MODE_SYM_PAS	2	/* symmetric passive */
331 #define	MODE_CLIENT	3	/* client */
332 #define	MODE_SERVER	4	/* server */
333 #define	MODE_BROADCAST	5	/* broadcast */
334 #define	MODE_CONTROL	6	/* control */
335 #define	MODE_PRIVATE	7	/* private */
336 
337 /*
338  *	Stratum Definitions
339  */
340 #define	UNSPECIFIED	0
341 #define	PRIM_REF	1	/* radio clock */
342 #define	INFO_QUERY	62	/* **** THIS implementation dependent **** */
343 #define	INFO_REPLY	63	/* **** THIS implementation dependent **** */
344 
345 
346 /* =================  table 3.2 Peer Variables	================= */
347 struct ntp_peer {
348 	struct ntp_peer *next, *prev;
349 	struct sockaddr_in src;		/* both peer.srcadr and peer.srcport */
350 	int	flags;			/* local flags */
351 #define	PEER_FL_CONFIG		1
352 #define	PEER_FL_AUTHENABLE	2
353 #define	PEER_FL_SYNC		0x1000	/* peer can bet sync'd to */
354 #define	PEER_FL_BCAST		0x2000	/* broadcast peer */
355 #define	PEER_FL_SELECTED	0x8000	/* actually used by query routine */
356 
357 	int	sock;			/* index into sockets to derive */
358 					/*   peer.dstadr and peer.dstport */
359 	uchar_t	leap;			/* receive */
360 	uchar_t	hmode;			/* receive */
361 	uchar_t	stratum;		/* receive */
362 	uchar_t	ppoll;			/* receive */
363 	uchar_t	hpoll;			/* poll update */
364 	short	precision;		/* receive */
365 	struct	s_fixedpt distance;	/* receive */
366 	struct	s_fixedpt dispersion;	/* receive */
367 	ulong_t	refid;			/* receive */
368 	struct	l_fixedpt reftime;	/* receive */
369 	struct	l_fixedpt org;		/* receive, clear */
370 	struct	l_fixedpt rec;		/* receive, clear */
371 	struct	l_fixedpt xmt;		/* transmit, clear */
372 	ulong_t	reach;			/* receive, transmit, clear */
373 	ulong_t	valid;			/* packet, transmit, clear */
374 	ulong_t	timer;			/* receive, transmit, poll update */
375 	long	stopwatch;		/* <<local>> for timing */
376 	/*
377 	 * first order offsets
378 	 */
379 	struct	filter {
380 		short samples;		/* <<local>> */
381 		double offset[PEER_SHIFT];
382 		double delay[PEER_SHIFT];
383 	} filter;			/* filter, clear */
384 
385 	double	estdelay;		/* filter */
386 	double	estoffset;		/* filter */
387 	double	estdisp;		/* filter */
388 
389 	ulong_t	pkt_sent;		/* <<local>> */
390 	ulong_t pkt_rcvd;		/* <<local>> */
391 	ulong_t	pkt_dropped;		/* <<local>> */
392 };
393 
394 /* ================= table 3.1:  System Variables ================= */
395 
396 struct sysdata {			/* procedure */
397 	uchar_t leap;			/* clock update */
398 	uchar_t stratum;		/* clock update */
399 	short precision;		/* system */
400 	struct s_fixedpt distance;	/* clock update */
401 	struct s_fixedpt dispersion;	/* clock update */
402 	ulong_t refid;			/* clock update */
403 	struct l_fixedpt reftime;	/* clock update */
404 	int hold;			/* clock update */
405 	struct ntp_peer *peer;		/* selection */
406 	int maxpeers;			/* <<local>> */
407 	uchar_t filler;			/* put here for %&*%$$ SUNs */
408 };
409 
410 #define	NTPDC_VERSION	2
411 
412 /*
413  *  These structures are used to pass information to the ntpdc (control)
414  *  program.  They are unique to this implementation and not part of the
415  *  NTP specification.
416  */
417 struct clockinfo {
418 	ulong_t net_address;
419 	ulong_t my_address;
420 	ushort_t port;
421 	ushort_t flags;
422 	ulong_t pkt_sent;
423 	ulong_t pkt_rcvd;
424 	ulong_t pkt_dropped;
425 	ulong_t timer;
426 	uchar_t leap;
427 	uchar_t stratum;
428 	uchar_t ppoll;
429 	int precision:8;
430 
431 	uchar_t hpoll;
432 	uchar_t filler1;
433 	ushort_t reach;
434 
435 	long	estdisp;			/* scaled by 1000 */
436 	long	estdelay;			/* in milliseconds */
437 	long	estoffset;			/* in milliseconds */
438 	ulong_t refid;
439 	struct l_fixedpt reftime;
440 	struct info_filter {
441 		short index;
442 		short filler;
443 		long offset[PEER_SHIFT];	/* in milliseconds */
444 		long delay[PEER_SHIFT];		/* in milliseconds */
445 	} info_filter;
446 };
447 
448 struct ntpinfo {
449 	uchar_t version;
450 	uchar_t type;		/* request type (stratum in ntp packets) */
451 	uchar_t count;		/* number of entries in this packet */
452 	uchar_t seq;		/* sequence number of this packet */
453 
454 	uchar_t npkts;		/* total number of packets */
455 	uchar_t peers;
456 	uchar_t fill3;
457 	uchar_t fill4;
458 };
459 
460 /*
461  * From usr/src/cmd/xntpd/include/ntp_control.h:
462  * Definition of a mode 6 packet.
463  */
464 struct ntp_control {
465 	uchar_t li_vn_mode;		/* leap, version, mode */
466 	uchar_t r_m_e_op;		/* response, more, error, opcode */
467 	ushort_t sequence;		/* sequence number of request */
468 	ushort_t status;		/* status word for association */
469 	ushort_t associd;		/* association ID */
470 	ushort_t offset;		/* offset of this batch of data */
471 	ushort_t count;			/* count of data in this packet */
472 	uchar_t data[1];		/* data + auth */
473 };
474 
475 #define	NTPC_DATA_MAXLEN	(480 + AUTH_OCTETS_V3)
476 
477 /*
478  * Decoding for the r_m_e_op field
479  */
480 #define	CTL_RESPONSE	0x80
481 #define	CTL_ERROR	0x40
482 #define	CTL_MORE	0x20
483 #define	CTL_OP_MASK	0x1f
484 
485 /*
486  * Opcodes
487  */
488 #define	CTL_OP_UNSPEC		0
489 #define	CTL_OP_READSTAT		1
490 #define	CTL_OP_READVAR		2
491 #define	CTL_OP_WRITEVAR		3
492 #define	CTL_OP_READCLOCK	4
493 #define	CTL_OP_WRITECLOCK	5
494 #define	CTL_OP_SETTRAP		6
495 #define	CTL_OP_ASYNCMSG		7
496 #define	CTL_OP_UNSETTRAP	31
497 
498 /*
499  * From usr/src/cmd/xntpd/include/ntp_request.h:
500  * A mode 7 packet is used exchanging data between an NTP server
501  * and a client for purposes other than time synchronization, e.g.
502  * monitoring, statistics gathering and configuration.  A mode 7
503  * packet has the following format:
504  */
505 
506 struct ntp_private {
507 	uchar_t rm_vn_mode;		/* response, more, version, mode */
508 	uchar_t auth_seq;		/* key, sequence number */
509 	uchar_t implementation;		/* implementation number */
510 	uchar_t request;		/* request number */
511 	ushort_t err_nitems;		/* error code/number of data items */
512 	ushort_t mbz_itemsize;		/* item size */
513 	char data[1];			/* data area */
514 };
515 
516 #define	RESP_BIT		0x80
517 #define	MORE_BIT		0x40
518 #define	INFO_VERSION(rm_vn_mode) ((uchar_t)(((rm_vn_mode)>>3) & 0x7))
519 #define	INFO_MODE(rm_vn_mode)	((rm_vn_mode) & 0x7)
520 
521 #define	AUTH_BIT		0x80
522 #define	INFO_SEQ(auth_seq)	((auth_seq) & 0x7f)
523 
524 #define	INFO_ERR(err_nitems)	((ushort_t)((ntohs(err_nitems) >> 12) & 0xf))
525 #define	INFO_NITEMS(err_nitems)	((ushort_t)(ntohs(err_nitems) & 0xfff))
526 
527 #define	INFO_ITEMSIZE(mbz_itemsize) (ntohs(mbz_itemsize) & 0xfff)
528 
529 #ifdef __cplusplus
530 }
531 #endif
532 
533 #endif	/* _NTP_H */
534