xref: /freebsd/contrib/ntp/ntpdate/ntpdate.h (revision 416ba5c74546f32a993436a99516d35008e9f384)
1c0b746e5SOllivier Robert /*
2c0b746e5SOllivier Robert  * ntpdate.h - declarations for the ntpdate and ntptimeset programs
3c0b746e5SOllivier Robert  */
4c0b746e5SOllivier Robert 
5c0b746e5SOllivier Robert #include "ntp_malloc.h"
6c0b746e5SOllivier Robert 
7*2b15cb3dSCy Schubert extern void	loadservers	(char *cfgpath);
8224ba2bdSOllivier Robert 
9c0b746e5SOllivier Robert /*
10c0b746e5SOllivier Robert  * The server structure is a much simplified version of the
11c0b746e5SOllivier Robert  * peer structure, for ntpdate's use.  Since we always send
12c0b746e5SOllivier Robert  * in client mode and expect to receive in server mode, this
13c0b746e5SOllivier Robert  * leaves only a very limited number of things we need to
14c0b746e5SOllivier Robert  * remember about the server.
15c0b746e5SOllivier Robert  */
16c0b746e5SOllivier Robert struct server {
17c0b746e5SOllivier Robert 	struct server *next_server;	/* next server in build list */
18*2b15cb3dSCy Schubert 	sockaddr_u srcadr;		/* address of remote host */
19c0b746e5SOllivier Robert 	u_char version;			/* version to use */
20c0b746e5SOllivier Robert 	u_char leap;			/* leap indicator */
21c0b746e5SOllivier Robert 	u_char stratum;			/* stratum of remote server */
22c0b746e5SOllivier Robert 	s_char precision;		/* server's clock precision */
23c0b746e5SOllivier Robert 	u_char trust;			/* trustability of the filtered data */
24c0b746e5SOllivier Robert 	u_fp rootdelay;			/* distance from primary clock */
25*2b15cb3dSCy Schubert 	u_fp rootdisp;			/* peer clock dispersion */
26c0b746e5SOllivier Robert 	u_int32 refid;			/* peer reference ID */
27c0b746e5SOllivier Robert 	l_fp reftime;			/* time of peer's last update */
28c0b746e5SOllivier Robert 	u_long event_time;		/* time for next timeout */
29c0b746e5SOllivier Robert 	u_long last_xmit;		/* time of last transmit */
30c0b746e5SOllivier Robert 	u_short xmtcnt;			/* number of packets transmitted */
31c0b746e5SOllivier Robert 	u_short rcvcnt;			/* number of packets received */
32c0b746e5SOllivier Robert 	u_char reach;			/* reachability, NTP_WINDOW bits */
33c0b746e5SOllivier Robert 	u_short filter_nextpt;		/* index into filter shift register */
34c0b746e5SOllivier Robert 	s_fp filter_delay[NTP_SHIFT];	/* delay part of shift register */
35c0b746e5SOllivier Robert 	l_fp filter_offset[NTP_SHIFT];	/* offset part of shift register */
36c0b746e5SOllivier Robert 	s_fp filter_soffset[NTP_SHIFT]; /* offset in s_fp format, for disp */
37c0b746e5SOllivier Robert 	u_fp filter_error[NTP_SHIFT];	/* error part of shift register */
38c0b746e5SOllivier Robert 	l_fp org;			/* peer's originate time stamp */
39c0b746e5SOllivier Robert 	l_fp xmt;			/* transmit time stamp */
40c0b746e5SOllivier Robert 	u_fp delay;			/* filter estimated delay */
41c0b746e5SOllivier Robert 	u_fp dispersion;		/* filter estimated dispersion */
42c0b746e5SOllivier Robert 	l_fp offset;			/* filter estimated clock offset */
43c0b746e5SOllivier Robert 	s_fp soffset;			/* fp version of above */
44c0b746e5SOllivier Robert };
45c0b746e5SOllivier Robert 
46c0b746e5SOllivier Robert 
47c0b746e5SOllivier Robert /*
48c0b746e5SOllivier Robert  * ntpdate runs everything on a simple, short timeout.  It sends a
49c0b746e5SOllivier Robert  * packet and sets the timeout (by default, to a small value suitable
50c0b746e5SOllivier Robert  * for a LAN).  If it receives a response it sends another request.
51c0b746e5SOllivier Robert  * If it times out it shifts zeroes into the filter and sends another
52c0b746e5SOllivier Robert  * request.
53c0b746e5SOllivier Robert  *
54c0b746e5SOllivier Robert  * The timer routine is run often (once every 1/5 second currently)
55c0b746e5SOllivier Robert  * so that time outs are done with reasonable precision.
56c0b746e5SOllivier Robert  */
57c0b746e5SOllivier Robert #define TIMER_HZ	(5)		/* 5 per second */
58c0b746e5SOllivier Robert 
59c0b746e5SOllivier Robert /*
60c0b746e5SOllivier Robert  * ntpdate will make a long adjustment using adjtime() if the times
61c0b746e5SOllivier Robert  * are close, or step the time if the times are farther apart.  The
62c0b746e5SOllivier Robert  * following defines what is "close".
63c0b746e5SOllivier Robert  */
64c0b746e5SOllivier Robert #define	NTPDATE_THRESHOLD	(FP_SECOND >> 1)	/* 1/2 second */
65c0b746e5SOllivier Robert 
66224ba2bdSOllivier Robert #define NTP_MAXAGE	86400	/* one day in seconds */
67224ba2bdSOllivier Robert 
68c0b746e5SOllivier Robert /*
69c0b746e5SOllivier Robert  * When doing adjustments, ntpdate actually overadjusts (currently
70c0b746e5SOllivier Robert  * by 50%, though this may change).  While this will make it take longer
71c0b746e5SOllivier Robert  * to reach a steady state condition, it will typically result in
72c0b746e5SOllivier Robert  * the clock keeping more accurate time, on average.  The amount of
73c0b746e5SOllivier Robert  * overshoot is limited.
74c0b746e5SOllivier Robert  */
75c0b746e5SOllivier Robert #ifdef	NOTNOW
76c0b746e5SOllivier Robert #define	ADJ_OVERSHOOT	1/2	/* this is hard coded */
77c0b746e5SOllivier Robert #endif	/* NOTNOW */
78c0b746e5SOllivier Robert #define	ADJ_MAXOVERSHOOT	0x10000000	/* 50 ms as a ts fraction */
79c0b746e5SOllivier Robert 
80c0b746e5SOllivier Robert /*
81c0b746e5SOllivier Robert  * Since ntpdate isn't aware of some of the things that normally get
82c0b746e5SOllivier Robert  * put in an NTP packet, we fix some values.
83c0b746e5SOllivier Robert  */
84c0b746e5SOllivier Robert #define	NTPDATE_PRECISION	(-6)		/* use this precision */
85c0b746e5SOllivier Robert #define	NTPDATE_DISTANCE	FP_SECOND	/* distance is 1 sec */
86c0b746e5SOllivier Robert #define	NTPDATE_DISP		FP_SECOND	/* so is the dispersion */
87c0b746e5SOllivier Robert #define	NTPDATE_REFID		(0)		/* reference ID to use */
88c0b746e5SOllivier Robert #define PEER_MAXDISP	(64*FP_SECOND)	/* maximum dispersion (fp 64) */
89c0b746e5SOllivier Robert 
90c0b746e5SOllivier Robert 
91c0b746e5SOllivier Robert /*
92*2b15cb3dSCy Schubert  * No less than 2s between requests to a server to stay within ntpd's
93*2b15cb3dSCy Schubert  * default "discard minimum 1" (and 1s enforcement slop).  That is
94*2b15cb3dSCy Schubert  * enforced only if the nondefault limited restriction is in place, such
95*2b15cb3dSCy Schubert  * as with "restrict ... limited" and "restrict ... kod limited".
96c0b746e5SOllivier Robert  */
97*2b15cb3dSCy Schubert #define	MINTIMEOUT	(1 * TIMER_HZ)	/* 1s min. between packets */
98*2b15cb3dSCy Schubert #define	DEFTIMEOUT	(2 * TIMER_HZ)	/* 2s by default */
99c0b746e5SOllivier Robert #define	DEFSAMPLES	4		/* get 4 samples per server */
100c0b746e5SOllivier Robert #define	DEFPRECISION	(-5)		/* the precision we claim */
101c0b746e5SOllivier Robert #define	DEFMAXPERIOD	60		/* maximum time to wait */
102c0b746e5SOllivier Robert #define	DEFMINSERVERS	3		/* minimum responding servers */
103c0b746e5SOllivier Robert #define	DEFMINVALID	1		/* mimimum servers with valid time */
1049c2daa00SOllivier Robert 
1059c2daa00SOllivier Robert /*
1069c2daa00SOllivier Robert  * Define the max number of sockets we can open
1079c2daa00SOllivier Robert  */
1089c2daa00SOllivier Robert #define MAX_AF 2
109