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
43extern "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
123struct 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};
132extern struct intf addrs[];
133extern 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
158struct 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 */
238struct l_fixedpt {
239	ulong_t int_part;
240	ulong_t fraction;
241};
242
243struct 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
291struct 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	================= */
347struct 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
396struct 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 */
417struct 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
448struct 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 */
464struct 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
506struct 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