154359Sroberto/*
2285612Sdelphij * ntpd.h - Prototypes and external variables for ntpd.
3285612Sdelphij *
4285612Sdelphij * Note the first half is primarily function prototypes, type
5285612Sdelphij * declarations, and preprocessor macros, with variables declared
6285612Sdelphij * primarily in the second half.
7285612Sdelphij *
8285612Sdelphij * Each half is further divided into sections for each source file.
954359Sroberto */
1054359Sroberto
11285612Sdelphij#include "ntp.h"
12285612Sdelphij#include "ntp_stdlib.h"
1354359Sroberto#include "ntp_syslog.h"
14182007Sroberto#include "ntp_debug.h"
15285612Sdelphij#include "ntp_syslog.h"
1654359Sroberto#include "ntp_select.h"
1754359Sroberto#include "ntp_malloc.h"
1854359Sroberto#include "ntp_refclock.h"
19285612Sdelphij#include "ntp_intres.h"
2054359Sroberto#include "recvbuff.h"
2154359Sroberto
22285612Sdelphij/*
23285612Sdelphij * First half: ntpd types, functions, macros
24285612Sdelphij * -----------------------------------------
25285612Sdelphij */
2654359Sroberto
27285612Sdelphij/*
28285612Sdelphij * macro for debugging output - cut down on #ifdef pollution.
29285612Sdelphij *
30285612Sdelphij * DPRINTF() is for use by ntpd only, and compiles away to nothing
31285612Sdelphij * without DEBUG (configure --disable-debugging).
32285612Sdelphij *
33285612Sdelphij * TRACE() is similar for libntp and utilities, which retain full
34285612Sdelphij * debug capability even when compiled without DEBUG.
35285612Sdelphij *
36285612Sdelphij * The calling convention is not attractive:
37285612Sdelphij *     DPRINTF(debuglevel, (fmt, ...));
38285612Sdelphij *     DPRINTF(2, ("shows #ifdef DEBUG and if debug >= %d\n", 2));
39285612Sdelphij */
40285612Sdelphij#ifdef DEBUG
41285612Sdelphij# define DPRINTF(lvl, arg)				\
42285612Sdelphij	do { 						\
43285612Sdelphij		if (debug >= (lvl))			\
44285612Sdelphij			mprintf arg;			\
45285612Sdelphij	} while (0)
46285612Sdelphij#else
47285612Sdelphij# define DPRINTF(lvl, arg)	do {} while (0)
48285612Sdelphij#endif
4954359Sroberto
50285612Sdelphij
51285612Sdelphij/* nt_clockstuff.c */
52285612Sdelphij#ifdef SYS_WINNT
53285612Sdelphijextern	void	win_time_stepped(void);
54285612Sdelphij#endif
55285612Sdelphij
5654359Sroberto/* ntp_config.c */
57285612Sdelphij#define	TAI_1972	10	/* initial TAI offset (s) */
58285612Sdelphijextern	char	*keysdir;	/* crypto keys and leaptable directory */
59285612Sdelphijextern	char *	saveconfigdir;	/* ntpq saveconfig output directory */
6054359Sroberto
61285612Sdelphijextern	void	getconfig	(int, char **);
62285612Sdelphijextern	void	ctl_clr_stats	(void);
63285612Sdelphijextern	int	ctlclrtrap	(sockaddr_u *, struct interface *, int);
64285612Sdelphijextern	u_short ctlpeerstatus	(struct peer *);
65285612Sdelphijextern	int	ctlsettrap	(sockaddr_u *, struct interface *, int, int);
66285612Sdelphijextern	u_short ctlsysstatus	(void);
67285612Sdelphijextern	void	init_control	(void);
68285612Sdelphijextern	void	process_control (struct recvbuf *, int);
69285612Sdelphijextern	void	report_event	(int, struct peer *, const char *);
70285612Sdelphijextern	int	mprintf_event	(int, struct peer *, const char *, ...)
71285612Sdelphij			NTP_PRINTF(3, 4);
7254359Sroberto
7354359Sroberto/* ntp_control.c */
7454359Sroberto/*
7554359Sroberto * Structure for translation tables between internal system
7654359Sroberto * variable indices and text format.
7754359Sroberto */
7854359Srobertostruct ctl_var {
7954359Sroberto	u_short code;
8054359Sroberto	u_short flags;
81285612Sdelphij	const char *text;
8254359Sroberto};
8354359Sroberto/*
8454359Sroberto * Flag values
8554359Sroberto */
8654359Sroberto#define	CAN_READ	0x01
8754359Sroberto#define	CAN_WRITE	0x02
8854359Sroberto
8954359Sroberto#define DEF		0x20
9054359Sroberto#define	PADDING		0x40
9154359Sroberto#define	EOV		0x80
9254359Sroberto
9354359Sroberto#define	RO	(CAN_READ)
9454359Sroberto#define	WO	(CAN_WRITE)
9554359Sroberto#define	RW	(CAN_READ|CAN_WRITE)
9654359Sroberto
97285612Sdelphijextern	char *	add_var (struct ctl_var **, u_long, u_short);
98285612Sdelphijextern	void	free_varlist (struct ctl_var *);
99285612Sdelphijextern	void	set_var (struct ctl_var **, const char *, u_long, u_short);
100285612Sdelphijextern	void	set_sys_var (const char *, u_long, u_short);
101285612Sdelphijextern	const char *	get_ext_sys_var(const char *tag);
10254359Sroberto
10354359Sroberto/* ntp_io.c */
104182007Srobertotypedef struct interface_info {
105285612Sdelphij	endpt *	ep;
106285612Sdelphij	u_char	action;
107182007Sroberto} interface_info_t;
108182007Sroberto
109285612Sdelphijtypedef void	(*interface_receiver_t)	(void *, interface_info_t *);
110182007Sroberto
111285612Sdelphijextern	void	interface_enumerate	(interface_receiver_t, void *);
112285612Sdelphijextern	endpt *	getinterface		(sockaddr_u *, u_int32);
113285612Sdelphijextern	endpt *	select_peerinterface	(struct peer *, sockaddr_u *,
114285612Sdelphij					 endpt *);
115285612Sdelphijextern	endpt *	findinterface		(sockaddr_u *);
116285612Sdelphijextern	endpt *	findbcastinter		(sockaddr_u *);
117285612Sdelphijextern	void	enable_broadcast	(endpt *, sockaddr_u *);
118285612Sdelphijextern	void	enable_multicast_if	(endpt *, sockaddr_u *);
119285612Sdelphijextern	void	interface_update	(interface_receiver_t, void *);
120285612Sdelphij#ifndef HAVE_IO_COMPLETION_PORT
121285612Sdelphijextern  void    io_handler              (void);
122285612Sdelphij#endif
123285612Sdelphijextern	void	init_io 	(void);
124285612Sdelphijextern	void	io_open_sockets	(void);
125285612Sdelphijextern	void	io_clr_stats	(void);
126285612Sdelphijextern	void	io_setbclient	(void);
127285612Sdelphijextern	void	io_unsetbclient	(void);
128285612Sdelphijextern	void	io_multicast_add(sockaddr_u *);
129285612Sdelphijextern	void	io_multicast_del(sockaddr_u *);
130285612Sdelphijextern	void	sendpkt 	(sockaddr_u *, struct interface *, int, struct pkt *, int);
131182007Sroberto#ifdef DEBUG
132285612Sdelphijextern	void	collect_timing  (struct recvbuf *, const char *, int, l_fp *);
133182007Sroberto#endif
13454359Sroberto#ifdef HAVE_SIGNALED_IO
135285612Sdelphijextern	void	wait_for_signal		(void);
136285612Sdelphijextern	void	unblock_io_and_alarm	(void);
137285612Sdelphijextern	void	block_io_and_alarm	(void);
138285612Sdelphij# define	UNBLOCK_IO_AND_ALARM()	unblock_io_and_alarm()
139285612Sdelphij# define	BLOCK_IO_AND_ALARM()	block_io_and_alarm()
140182007Sroberto#else
141285612Sdelphij# define	UNBLOCK_IO_AND_ALARM()	do {} while (0)
142285612Sdelphij# define	BLOCK_IO_AND_ALARM()	do {} while (0)
14354359Sroberto#endif
144285612Sdelphij#define		latoa(pif)	localaddrtoa(pif)
145285612Sdelphijextern const char * localaddrtoa(endpt *);
14654359Sroberto
14754359Sroberto/* ntp_loopfilter.c */
148285612Sdelphijextern	void	init_loopfilter(void);
149285612Sdelphijextern	int 	local_clock(struct peer *, double);
150285612Sdelphijextern	void	adj_host_clock(void);
151285612Sdelphijextern	void	loop_config(int, double);
152285612Sdelphijextern	void	select_loop(int);
153285612Sdelphijextern	void	huffpuff(void);
154182007Srobertoextern	u_long	sys_clocktime;
155285612Sdelphijextern	u_int	sys_tai;
156285612Sdelphijextern 	int	freq_cnt;
15754359Sroberto
15854359Sroberto/* ntp_monitor.c */
159293650Sglebius#define MON_HASH_SIZE		((size_t)1U << mon_hash_bits)
160285612Sdelphij#define MON_HASH_MASK		(MON_HASH_SIZE - 1)
161285612Sdelphij#define	MON_HASH(addr)		(sock_hash(addr) & MON_HASH_MASK)
162285612Sdelphijextern	void	init_mon	(void);
163285612Sdelphijextern	void	mon_start	(int);
164285612Sdelphijextern	void	mon_stop	(int);
165285612Sdelphijextern	u_short	ntp_monitor	(struct recvbuf *, u_short);
166285612Sdelphijextern	void	mon_clearinterface(endpt *interface);
16754359Sroberto
16854359Sroberto/* ntp_peer.c */
169285612Sdelphijextern	void	init_peer	(void);
170285612Sdelphijextern	struct peer *findexistingpeer(sockaddr_u *, const char *,
171330141Sdelphij				      struct peer *, int, u_char, int *);
172285612Sdelphijextern	struct peer *findpeer	(struct recvbuf *, int, int *);
173285612Sdelphijextern	struct peer *findpeerbyassoc(associd_t);
174285612Sdelphijextern  void	set_peerdstadr	(struct peer *, endpt *);
175330141Sdelphijextern	struct peer *newpeer	(sockaddr_u *, const char *, endpt *,
176330141Sdelphij				 int, u_char, u_char, u_char, u_char,
177330141Sdelphij				 u_int, u_char, u_int32,
178285612Sdelphij				 keyid_t, const char *);
179285612Sdelphijextern	void	peer_all_reset	(void);
180285612Sdelphijextern	void	peer_clr_stats	(void);
181330141Sdelphijextern	struct peer *peer_config(sockaddr_u *, const char *, endpt *,
182330141Sdelphij				 int, u_char, u_char, u_char, u_char,
183330141Sdelphij				 u_int, u_int32,
184285612Sdelphij				 keyid_t, const char *);
185285612Sdelphijextern	void	peer_reset	(struct peer *);
186285612Sdelphijextern	void	refresh_all_peerinterfaces(void);
187285612Sdelphijextern	void	unpeer		(struct peer *);
188285612Sdelphijextern	void	clear_all	(void);
189285612Sdelphijextern	int	score_all	(struct peer *);
190285612Sdelphijextern	struct peer *findmanycastpeer(struct recvbuf *);
191285612Sdelphijextern	void	peer_cleanup	(void);
192182007Sroberto
193132451Sroberto/* ntp_crypto.c */
194285612Sdelphij#ifdef AUTOKEY
195285612Sdelphijextern	int	crypto_recv	(struct peer *, struct recvbuf *);
196285612Sdelphijextern	int	crypto_xmit	(struct peer *, struct pkt *,
197285612Sdelphij				    struct recvbuf *, int,
198285612Sdelphij				    struct exten *, keyid_t);
199285612Sdelphijextern	keyid_t	session_key	(sockaddr_u *, sockaddr_u *, keyid_t,
200285612Sdelphij				    keyid_t, u_long);
201285612Sdelphijextern	int	make_keylist	(struct peer *, struct interface *);
202285612Sdelphijextern	void	key_expire	(struct peer *);
203285612Sdelphijextern	void	crypto_update	(void);
204285612Sdelphijextern	void	crypto_update_taichange(void);
205285612Sdelphijextern	void	crypto_config	(int, char *);
206285612Sdelphijextern	void	crypto_setup	(void);
207285612Sdelphijextern	u_int	crypto_ident	(struct peer *);
208285612Sdelphijextern	struct exten *crypto_args (struct peer *, u_int, associd_t, char *);
209285612Sdelphijextern	int	crypto_public	(struct peer *, u_char *, u_int);
210285612Sdelphijextern	void	value_free	(struct value *);
211182007Srobertoextern	char	*iffpar_file;
212182007Srobertoextern	EVP_PKEY *iffpar_pkey;
213182007Srobertoextern	char	*gqpar_file;
214182007Srobertoextern	EVP_PKEY *gqpar_pkey;
215182007Srobertoextern	char	*mvpar_file;
216182007Srobertoextern	EVP_PKEY *mvpar_pkey;
217182007Srobertoextern struct value tai_leap;
218285612Sdelphij#endif	/* AUTOKEY */
219132451Sroberto
22054359Sroberto/* ntp_proto.c */
221285612Sdelphijextern	void	transmit	(struct peer *);
222285612Sdelphijextern	void	receive 	(struct recvbuf *);
223285612Sdelphijextern	void	peer_clear	(struct peer *, const char *);
224285612Sdelphijextern	void 	process_packet	(struct peer *, struct pkt *, u_int);
225285612Sdelphijextern	void	clock_select	(void);
226285612Sdelphijextern	void	set_sys_leap	(u_char);
22754359Sroberto
228285612Sdelphijextern	u_long	leapsec;	/* seconds to next leap (proximity class) */
229285612Sdelphijextern  int     leapdif;        /* TAI difference step at next leap second*/
230285612Sdelphijextern	int	sys_orphan;
231285612Sdelphijextern	double	sys_mindisp;
232285612Sdelphijextern	double	sys_maxdist;
23354359Sroberto
234285612Sdelphijextern	char	*sys_ident;	/* identity scheme */
235285612Sdelphijextern	void	poll_update	(struct peer *, u_char);
23654359Sroberto
237285612Sdelphijextern	void	clear		(struct peer *);
238285612Sdelphijextern	void	clock_filter	(struct peer *, double, double, double);
239285612Sdelphijextern	void	init_proto	(void);
240285612Sdelphijextern	void	set_sys_tick_precision(double);
241285612Sdelphijextern	void	proto_config	(int, u_long, double, sockaddr_u *);
242285612Sdelphijextern	void	proto_clr_stats (void);
243285612Sdelphij
244285612Sdelphij/* ntp_refclock.c */
24554359Sroberto#ifdef	REFCLOCK
246285612Sdelphijextern	int	refclock_newpeer (struct peer *);
247285612Sdelphijextern	void	refclock_unpeer (struct peer *);
248285612Sdelphijextern	void	refclock_receive (struct peer *);
249285612Sdelphijextern	void	refclock_transmit (struct peer *);
250285612Sdelphijextern	void	init_refclock	(void);
25154359Sroberto#endif	/* REFCLOCK */
25254359Sroberto
25354359Sroberto/* ntp_request.c */
254285612Sdelphijextern	void	init_request	(void);
255285612Sdelphijextern	void	process_private (struct recvbuf *, int);
256285612Sdelphijextern	void	reset_auth_stats(void);
25754359Sroberto
25854359Sroberto/* ntp_restrict.c */
259285612Sdelphijextern	void	init_restrict	(void);
260330141Sdelphijextern	void	restrictions	(sockaddr_u *, r4addr *);
261330141Sdelphijextern	void	hack_restrict	(restrict_op, sockaddr_u *, sockaddr_u *,
262330141Sdelphij				 short, u_short, u_short, u_long);
263285612Sdelphijextern	void	restrict_source	(sockaddr_u *, int, u_long);
264330141Sdelphijextern	void	dump_restricts	(void);
26554359Sroberto
26654359Sroberto/* ntp_timer.c */
267285612Sdelphijextern	void	init_timer	(void);
268285612Sdelphijextern	void	reinit_timer	(void);
269285612Sdelphijextern	void	timer		(void);
270285612Sdelphijextern	void	timer_clr_stats (void);
271285612Sdelphijextern	void	timer_interfacetimeout (u_long);
272285612Sdelphijextern	volatile int interface_interval;
273285612Sdelphijextern	u_long	orphwait;		/* orphan wait time */
274285612Sdelphij#ifdef AUTOKEY
275285612Sdelphijextern	char	*sys_hostname;	/* host name */
276285612Sdelphijextern	char	*sys_groupname;	/* group name */
277285612Sdelphijextern	char	*group_name;	/* group name */
278285612Sdelphijextern	u_long	sys_revoke;	/* keys revoke timeout */
279285612Sdelphijextern	u_long	sys_automax;	/* session key timeout */
280285612Sdelphij#endif	/* AUTOKEY */
281182007Sroberto
28254359Sroberto/* ntp_util.c */
283285612Sdelphijextern	void	init_util	(void);
284285612Sdelphijextern	void	write_stats	(void);
285285612Sdelphijextern	void	stats_config	(int, const char *);
286285612Sdelphijextern	void	record_peer_stats (sockaddr_u *, int, double, double, double, double);
287285612Sdelphijextern	void	record_proto_stats (char *);
288285612Sdelphijextern	void	record_loop_stats (double, double, double, double, int);
289285612Sdelphijextern	void	record_clock_stats (sockaddr_u *, const char *);
290285612Sdelphijextern	int	mprintf_clock_stats(sockaddr_u *, const char *, ...)
291285612Sdelphij			NTP_PRINTF(2, 3);
292330141Sdelphijextern	void	record_raw_stats (sockaddr_u *srcadr, sockaddr_u *dstadr, l_fp *t1, l_fp *t2, l_fp *t3, l_fp *t4, int leap, int version, int mode, int stratum, int ppoll, int precision, double root_delay, double root_dispersion, u_int32 refid, int len, u_char *extra);
293285612Sdelphijextern	void	check_leap_file	(int is_daily_check, u_int32 ntptime, const time_t * systime);
294285612Sdelphijextern	void	record_crypto_stats (sockaddr_u *, const char *);
295182007Sroberto#ifdef DEBUG
296285612Sdelphijextern	void	record_timing_stats (const char *);
297182007Sroberto#endif
298285612Sdelphijextern	char *	fstostr(time_t);	/* NTP timescale seconds */
29954359Sroberto
300285612Sdelphij/* ntpd.c */
301285612Sdelphijextern	void	parse_cmdline_opts(int *, char ***);
30254359Sroberto/*
303285612Sdelphij * Signals we catch for debugging.
30454359Sroberto */
305285612Sdelphij#define MOREDEBUGSIG	SIGUSR1
306285612Sdelphij#define LESSDEBUGSIG	SIGUSR2
307285612Sdelphij/*
308285612Sdelphij * Signals which terminate us gracefully.
309285612Sdelphij */
310285612Sdelphij#ifndef SYS_WINNT
311285612Sdelphij# define SIGDIE1	SIGHUP
312285612Sdelphij# define SIGDIE2	SIGINT
313285612Sdelphij# define SIGDIE3	SIGQUIT
314285612Sdelphij# define SIGDIE4	SIGTERM
315285612Sdelphij#endif /* SYS_WINNT */
31654359Sroberto
317285612Sdelphij
318285612Sdelphij/*
319285612Sdelphij * Last half: ntpd variables
320285612Sdelphij * -------------------------
321285612Sdelphij */
322285612Sdelphij
32354359Sroberto/* ntp_config.c */
32454359Srobertoextern char const *	progname;
325316069Sdelphijextern int saved_argc;
326316069Sdelphijextern char **saved_argv;
327182007Srobertoextern char	*sys_phone[];		/* ACTS phone numbers */
32854359Sroberto#if defined(HAVE_SCHED_SETSCHEDULER)
32954359Srobertoextern int	config_priority_override;
33054359Srobertoextern int	config_priority;
33154359Sroberto#endif
332285612Sdelphijextern char *ntp_signd_socket;
333285612Sdelphijextern struct config_tree_tag *cfg_tree_history;
33454359Sroberto
335285612Sdelphij#ifdef BC_LIST_FRAMEWORK_NOT_YET_USED
336285612Sdelphij/*
337285612Sdelphij * backwards compatibility flags
338285612Sdelphij */
339285612Sdelphijtypedef struct bc_entry_tag {
340285612Sdelphij	int	token;
341285612Sdelphij	int	enabled;
342285612Sdelphij} bc_entry;
343285612Sdelphij
344285612Sdelphijextern bc_entry bc_list[];
345285612Sdelphij#endif
346285612Sdelphij
34754359Sroberto/* ntp_control.c */
34854359Srobertoextern int	num_ctl_traps;
34982498Srobertoextern keyid_t	ctl_auth_keyid;		/* keyid used for authenticating write requests */
35054359Sroberto
35154359Sroberto/*
35254359Sroberto * Statistic counters to keep track of requests and responses.
35354359Sroberto */
35454359Srobertoextern u_long	ctltimereset;		/* time stats reset */
35554359Srobertoextern u_long	numctlreq;		/* number of requests we've received */
35654359Srobertoextern u_long	numctlbadpkts;		/* number of bad control packets */
35754359Srobertoextern u_long	numctlresponses; 	/* number of resp packets sent with data */
35854359Srobertoextern u_long	numctlfrags; 		/* number of fragments sent */
35954359Srobertoextern u_long	numctlerrors;		/* number of error responses sent */
36054359Srobertoextern u_long	numctltooshort;		/* number of too short input packets */
36154359Srobertoextern u_long	numctlinputresp; 	/* number of responses on input */
36254359Srobertoextern u_long	numctlinputfrag; 	/* number of fragments on input */
36354359Srobertoextern u_long	numctlinputerr;		/* number of input pkts with err bit set */
36454359Srobertoextern u_long	numctlbadoffset; 	/* number of input pkts with nonzero offset */
36554359Srobertoextern u_long	numctlbadversion;	/* number of input pkts with unknown version */
36654359Srobertoextern u_long	numctldatatooshort;	/* data too short for count */
36754359Srobertoextern u_long	numctlbadop; 		/* bad op code found in packet */
36854359Srobertoextern u_long	numasyncmsgs;		/* number of async messages we've sent */
36954359Sroberto
37054359Sroberto/*
37154359Sroberto * Other statistics of possible interest
37254359Sroberto */
37354359Srobertoextern volatile u_long packets_dropped;	/* total number of packets dropped on reception */
37454359Srobertoextern volatile u_long packets_ignored;	/* packets received on wild card interface */
37554359Srobertoextern volatile u_long packets_received;/* total number of packets received */
37654359Srobertoextern u_long	packets_sent;		/* total number of packets sent */
37754359Srobertoextern u_long	packets_notsent; 	/* total number of packets which couldn't be sent */
37854359Sroberto
37954359Srobertoextern volatile u_long handler_calls;	/* number of calls to interrupt handler */
38054359Srobertoextern volatile u_long handler_pkts;	/* number of pkts received by handler */
38154359Srobertoextern u_long	io_timereset;		/* time counters were reset */
38254359Sroberto
383285612Sdelphij/* ntp_io.c */
384285612Sdelphijextern  int	disable_dynamic_updates;
385285612Sdelphijextern u_int	sys_ifnum;		/* next .ifnum to assign */
386285612Sdelphijextern endpt *	any_interface;		/* IPv4 wildcard */
387285612Sdelphijextern endpt *	any6_interface;		/* IPv6 wildcard */
388285612Sdelphijextern endpt *	loopback_interface;	/* IPv4 loopback for refclocks */
389285612Sdelphijextern endpt *	ep_list;		/* linked list */
39054359Sroberto
39154359Sroberto/* ntp_loopfilter.c */
39282498Srobertoextern double	drift_comp;		/* clock frequency (s/s) */
39382498Srobertoextern double	clock_stability;	/* clock stability (s/s) */
394285612Sdelphijextern double	clock_max_back;		/* max backward offset before step (s) */
395285612Sdelphijextern double	clock_max_fwd;		/* max forward offset before step (s) */
39682498Srobertoextern double	clock_panic;		/* max offset before panic (s) */
39782498Srobertoextern double	clock_phi;		/* dispersion rate (s/s) */
39882498Srobertoextern double	clock_minstep;		/* step timeout (s) */
399285612Sdelphijextern double	clock_codec;		/* codec frequency */
40082498Sroberto#ifdef KERNEL_PLL
40182498Srobertoextern int	pll_status;		/* status bits for kernel pll */
40282498Sroberto#endif /* KERNEL_PLL */
40354359Sroberto
40454359Sroberto/*
40554359Sroberto * Clock state machine control flags
40654359Sroberto */
40754359Srobertoextern int	ntp_enable;		/* clock discipline enabled */
40854359Srobertoextern int	pll_control;		/* kernel support available */
40954359Srobertoextern int	kern_enable;		/* kernel support enabled */
410285612Sdelphijextern int	hardpps_enable;		/* kernel PPS discipline enabled */
41154359Srobertoextern int	ext_enable;		/* external clock enabled */
41282498Srobertoextern int	cal_enable;		/* refclock calibrate enable */
413285612Sdelphijextern int	allow_panic;		/* allow panic correction (-g) */
414293650Sglebiusextern int	enable_panic_check;	/* Can we check allow_panic's state? */
415285612Sdelphijextern int	force_step_once;	/* always step time once at startup (-G) */
416285612Sdelphijextern int	mode_ntpdate;		/* exit on first clock set (-q) */
41782498Srobertoextern int	peer_ntpdate;		/* count of ntpdate peers */
41854359Sroberto
41954359Sroberto/*
42054359Sroberto * Clock state machine variables
42154359Sroberto */
42282498Srobertoextern u_char	sys_poll;		/* system poll interval (log2 s) */
42354359Srobertoextern int	state;			/* clock discipline state */
42454359Srobertoextern int	tc_counter;		/* poll-adjust counter */
42554359Srobertoextern u_long	last_time;		/* time of last clock update (s) */
42654359Srobertoextern double	last_offset;		/* last clock offset (s) */
427285612Sdelphijextern u_char	allan_xpt;		/* Allan intercept (log2 s) */
428182007Srobertoextern double	clock_jitter;		/* clock jitter (s) */
429285612Sdelphijextern double	sys_offset;		/* system offset (s) */
430182007Srobertoextern double	sys_jitter;		/* system jitter (s) */
43154359Sroberto
43254359Sroberto/* ntp_monitor.c */
433285612Sdelphijextern u_char	mon_hash_bits;		/* log2 size of hash table */
434285612Sdelphijextern mon_entry ** mon_hash;		/* MRU hash table */
435285612Sdelphijextern mon_entry mon_mru_list;		/* mru listhead */
436285612Sdelphijextern u_int	mon_enabled;		/* MON_OFF (0) or other MON_* */
437285612Sdelphijextern u_int	mru_alloc;		/* mru list + free list count */
438285612Sdelphijextern u_int	mru_entries;		/* mru list count */
439285612Sdelphijextern u_int	mru_peakentries;	/* highest mru_entries */
440285612Sdelphijextern u_int	mru_initalloc;		/* entries to preallocate */
441285612Sdelphijextern u_int	mru_incalloc;		/* allocation batch factor */
442285612Sdelphijextern u_int	mru_mindepth;		/* preempt above this */
443285612Sdelphijextern int	mru_maxage;		/* for entries older than */
444285612Sdelphijextern u_int	mru_maxdepth; 		/* MRU size hard limit */
445285612Sdelphijextern int	mon_age;		/* preemption limit */
44654359Sroberto
44754359Sroberto/* ntp_peer.c */
448285612Sdelphijextern struct peer *peer_hash[NTP_HASH_SIZE];	/* peer hash table */
449285612Sdelphijextern int	peer_hash_count[NTP_HASH_SIZE];	/* count of in each bucket */
450285612Sdelphijextern struct peer *assoc_hash[NTP_HASH_SIZE];	/* association ID hash table */
451285612Sdelphijextern int	assoc_hash_count[NTP_HASH_SIZE];/* count of in each bucket */
452285612Sdelphijextern struct peer *peer_list;		/* peer structures list */
453285612Sdelphijextern int	peer_count;		/* count in peer_list */
454285612Sdelphijextern int	peer_free_count;	/* count in peer_free */
45554359Sroberto
45654359Sroberto/*
45754359Sroberto * Miscellaneous statistic counters which may be queried.
45854359Sroberto */
45954359Srobertoextern u_long	peer_timereset;		/* time stat counters were zeroed */
46054359Srobertoextern u_long	findpeer_calls;		/* number of calls to findpeer */
46154359Srobertoextern u_long	assocpeer_calls;	/* number of calls to findpeerbyassoc */
46254359Srobertoextern u_long	peer_allocations;	/* number of allocations from the free list */
46354359Srobertoextern u_long	peer_demobilizations;	/* number of structs freed to free list */
46454359Srobertoextern int	total_peer_structs;	/* number of peer structs in circulation */
465182007Srobertoextern int	peer_associations;	/* mobilized associations */
466182007Srobertoextern int	peer_preempt;		/* preemptable associations */
467285612Sdelphij
46854359Sroberto/* ntp_proto.c */
46954359Sroberto/*
47054359Sroberto * System variables are declared here.	See Section 3.2 of the
47154359Sroberto * specification.
47254359Sroberto */
47354359Srobertoextern u_char	sys_leap;		/* system leap indicator */
474285612Sdelphijextern u_char	sys_stratum;		/* system stratum */
47554359Srobertoextern s_char	sys_precision;		/* local clock precision */
476285612Sdelphijextern double	sys_rootdelay;		/* roundtrip delay to primary source */
477285612Sdelphijextern double	sys_rootdisp;		/* dispersion to primary source */
478285612Sdelphijextern u_int32	sys_refid;		/* reference id */
479285612Sdelphijextern l_fp	sys_reftime;		/* last update time */
480285612Sdelphijextern struct peer *sys_peer;		/* current peer */
48154359Sroberto
48254359Sroberto/*
48354359Sroberto * Nonspecified system state variables.
48454359Sroberto */
48554359Srobertoextern int	sys_bclient;		/* we set our time to broadcasts */
48654359Srobertoextern double	sys_bdelay; 		/* broadcast client default delay */
48754359Srobertoextern int	sys_authenticate;	/* requre authentication for config */
48854359Srobertoextern l_fp	sys_authdelay;		/* authentication delay */
489309008Sdelphijextern u_char	sys_bcpollbstep;	/* broadcast poll backstep gate */
490285612Sdelphijextern u_long 	sys_epoch;		/* last clock update time */
49182498Srobertoextern keyid_t	sys_private;		/* private value for session seed */
492132451Srobertoextern int	sys_manycastserver;	/* respond to manycast client pkts */
493316069Sdelphijextern int	sys_maxclock;		/* maximum survivors */
494132451Srobertoextern int	sys_minclock;		/* minimum survivors */
495132451Srobertoextern int	sys_minsane;		/* minimum candidates */
496132451Srobertoextern int	sys_floor;		/* cluster stratum floor */
497132451Srobertoextern int	sys_ceiling;		/* cluster stratum ceiling */
498285612Sdelphijextern u_char	sys_ttl[MAX_TTL];	/* ttl mapping vector */
499316069Sdelphijextern u_int	sys_ttlmax;		/* max ttl mapping vector index */
50054359Sroberto
50154359Sroberto/*
50254359Sroberto * Statistics counters
50354359Sroberto */
504330141Sdelphijextern u_long	sys_badauth;		/* bad authentication */
505330141Sdelphijextern u_long	sys_badlength;		/* bad length or format */
506330141Sdelphijextern u_long	sys_declined;		/* declined */
507330141Sdelphijextern u_long	sys_kodsent;		/* KoD sent */
508330141Sdelphijextern u_long	sys_lamport;		/* Lamport violation */
509330141Sdelphijextern u_long	sys_limitrejected;	/* rate exceeded */
510285612Sdelphijextern u_long	sys_newversion;		/* current version  */
511285612Sdelphijextern u_long	sys_oldversion;		/* old version */
512330141Sdelphijextern u_long	sys_processed;		/* packets for this host */
513330141Sdelphijextern u_long	sys_received;		/* packets received */
514285612Sdelphijextern u_long	sys_restricted;		/* access denied */
515330141Sdelphijextern u_long	sys_stattime;		/* time since reset */
516330141Sdelphijextern u_long	sys_tsrounding;		/* timestamp rounding errors */
51754359Sroberto
51854359Sroberto/* ntp_request.c */
51982498Srobertoextern keyid_t	info_auth_keyid;	/* keyid used to authenticate requests */
520285612Sdelphijextern u_long	auth_timereset;
52154359Sroberto
52254359Sroberto/* ntp_restrict.c */
523285612Sdelphijextern restrict_u *	restrictlist4;	/* IPv4 restriction list */
524285612Sdelphijextern restrict_u *	restrictlist6;	/* IPv6 restriction list */
525285612Sdelphijextern int		ntp_minpkt;
526285612Sdelphijextern u_char		ntp_minpoll;
52754359Sroberto
528285612Sdelphij/* ntp_scanner.c */
529285612Sdelphijextern u_int32		conf_file_sum;	/* Simple sum of characters */
530285612Sdelphij
531285612Sdelphij/* ntp_signd.c */
532285612Sdelphij#ifdef HAVE_NTP_SIGND
533285612Sdelphijextern void send_via_ntp_signd(struct recvbuf *, int, keyid_t, int,
534285612Sdelphij			       struct pkt *);
535285612Sdelphij#endif
536285612Sdelphij
53754359Sroberto/* ntp_timer.c */
53854359Srobertoextern volatile int alarm_flag;		/* alarm flag */
53954359Srobertoextern volatile u_long alarm_overflow;
540285612Sdelphijextern u_long	current_time;		/* seconds since startup */
54154359Srobertoextern u_long	timer_timereset;
54254359Srobertoextern u_long	timer_overflows;
54354359Srobertoextern u_long	timer_xmtcalls;
544285612Sdelphijextern int	leap_sec_in_progress;
545285612Sdelphij#ifdef LEAP_SMEAR
546285612Sdelphijextern struct leap_smear_info leap_smear;
547285612Sdelphijextern int	leap_smear_intv;
548285612Sdelphij#endif
549285612Sdelphij#ifdef SYS_WINNT
550285612SdelphijHANDLE WaitableTimerHandle;
551285612Sdelphij#endif
55254359Sroberto
55354359Sroberto/* ntp_util.c */
554285612Sdelphijextern	char	statsdir[MAXFILENAME];
555285612Sdelphijextern	int	stats_control;		/* write stats to fileset? */
556285612Sdelphijextern	int	stats_write_period;	/* # of seconds between writes. */
557285612Sdelphijextern	double	stats_write_tolerance;
558285612Sdelphijextern	double	wander_threshold;
55954359Sroberto
56054359Sroberto/* ntpd.c */
561285612Sdelphijextern	int	nofork;		/* no-fork flag */
562285612Sdelphijextern	int	initializing;	/* initializing flag */
563182007Sroberto#ifdef HAVE_DROPROOT
564285612Sdelphijextern	int	droproot;	/* flag: try to drop root privileges after startup */
565285612Sdelphijextern	int	root_dropped;	/* root has been dropped */
566285612Sdelphijextern char *user;		/* user to switch to */
567285612Sdelphijextern char *group;		/* group to switch to */
568285612Sdelphijextern const char *chrootdir;	/* directory to chroot() to */
569132451Sroberto#endif
570285612Sdelphij#ifdef HAVE_WORKING_FORK
571285612Sdelphijextern	int	waitsync_fd_to_close;	/* -w/--wait-sync */
572285612Sdelphij#endif
57354359Sroberto
574285612Sdelphij/* ntservice.c */
575285612Sdelphij#ifdef SYS_WINNT
576285612Sdelphijextern int accept_wildcard_if_for_winnt;
577285612Sdelphij#endif
578285612Sdelphij
57954359Sroberto/* refclock_conf.c */
58054359Sroberto#ifdef REFCLOCK
581285612Sdelphij/* refclock configuration table */
582285612Sdelphijextern struct refclock * const refclock_conf[];
58354359Srobertoextern u_char	num_refclock_conf;
58454359Sroberto#endif
585285612Sdelphij
586