xref: /freebsd/contrib/ntp/include/ntpd.h (revision f5f40dd63bc7acbb5312b26ac1ea1103c12352a6)
1c0b746e5SOllivier Robert /*
22b15cb3dSCy Schubert  * ntpd.h - Prototypes and external variables for ntpd.
32b15cb3dSCy Schubert  *
42b15cb3dSCy Schubert  * Note the first half is primarily function prototypes, type
52b15cb3dSCy Schubert  * declarations, and preprocessor macros, with variables declared
62b15cb3dSCy Schubert  * primarily in the second half.
72b15cb3dSCy Schubert  *
82b15cb3dSCy Schubert  * Each half is further divided into sections for each source file.
9c0b746e5SOllivier Robert  */
10c0b746e5SOllivier Robert 
11c0b746e5SOllivier Robert #include "ntp.h"
122b15cb3dSCy Schubert #include "ntp_stdlib.h"
132b15cb3dSCy Schubert #include "ntp_syslog.h"
14ea906c41SOllivier Robert #include "ntp_debug.h"
152b15cb3dSCy Schubert #include "ntp_syslog.h"
16c0b746e5SOllivier Robert #include "ntp_select.h"
17c0b746e5SOllivier Robert #include "ntp_malloc.h"
18c0b746e5SOllivier Robert #include "ntp_refclock.h"
192b15cb3dSCy Schubert #include "ntp_intres.h"
20c0b746e5SOllivier Robert #include "recvbuff.h"
21c0b746e5SOllivier Robert 
222b15cb3dSCy Schubert /*
232b15cb3dSCy Schubert  * First half: ntpd types, functions, macros
242b15cb3dSCy Schubert  * -----------------------------------------
252b15cb3dSCy Schubert  */
262b15cb3dSCy Schubert 
272b15cb3dSCy Schubert /*
282b15cb3dSCy Schubert  * macro for debugging output - cut down on #ifdef pollution.
292b15cb3dSCy Schubert  *
302b15cb3dSCy Schubert  * DPRINTF() is for use by ntpd only, and compiles away to nothing
312b15cb3dSCy Schubert  * without DEBUG (configure --disable-debugging).
322b15cb3dSCy Schubert  *
332b15cb3dSCy Schubert  * TRACE() is similar for libntp and utilities, which retain full
342b15cb3dSCy Schubert  * debug capability even when compiled without DEBUG.
352b15cb3dSCy Schubert  *
362b15cb3dSCy Schubert  * The calling convention is not attractive:
372b15cb3dSCy Schubert  *     DPRINTF(debuglevel, (fmt, ...));
382b15cb3dSCy Schubert  *     DPRINTF(2, ("shows #ifdef DEBUG and if debug >= %d\n", 2));
392b15cb3dSCy Schubert  */
402b15cb3dSCy Schubert #ifdef DEBUG
412b15cb3dSCy Schubert # define DPRINTF(lvl, arg)				\
422b15cb3dSCy Schubert 	do { 						\
432b15cb3dSCy Schubert 		if (debug >= (lvl))			\
442b15cb3dSCy Schubert 			mprintf arg;			\
452b15cb3dSCy Schubert 	} while (0)
462b15cb3dSCy Schubert #else
472b15cb3dSCy Schubert # define DPRINTF(lvl, arg)	do {} while (0)
482b15cb3dSCy Schubert #endif
492b15cb3dSCy Schubert 
50*f5f40dd6SCy Schubert /* clear bitflag only on DEBUG builds */
51*f5f40dd6SCy Schubert #ifdef DEBUG
52*f5f40dd6SCy Schubert # define CLEAR_BIT_IF_DEBUG(bit, flags)			\
53*f5f40dd6SCy Schubert 	do {						\
54*f5f40dd6SCy Schubert 		(flags) &= ~(bit);			\
55*f5f40dd6SCy Schubert 	} while (FALSE)
56*f5f40dd6SCy Schubert #else
57*f5f40dd6SCy Schubert # define CLEAR_BIT_IF_DEBUG(bit, flags)			\
58*f5f40dd6SCy Schubert 	do {} while (FALSE)
59*f5f40dd6SCy Schubert #endif
60*f5f40dd6SCy Schubert 
612b15cb3dSCy Schubert 
622b15cb3dSCy Schubert /* nt_clockstuff.c */
632b15cb3dSCy Schubert #ifdef SYS_WINNT
642b15cb3dSCy Schubert extern	void	win_time_stepped(void);
652b15cb3dSCy Schubert #endif
66c0b746e5SOllivier Robert 
67c0b746e5SOllivier Robert /* ntp_config.c */
682b15cb3dSCy Schubert #define	TAI_1972	10	/* initial TAI offset (s) */
692b15cb3dSCy Schubert extern	char	*keysdir;	/* crypto keys and leaptable directory */
702b15cb3dSCy Schubert extern	char *	saveconfigdir;	/* ntpq saveconfig output directory */
71c0b746e5SOllivier Robert 
722b15cb3dSCy Schubert extern	void	getconfig	(int, char **);
732b15cb3dSCy Schubert extern	void	ctl_clr_stats	(void);
74*f5f40dd6SCy Schubert extern	int	ctlclrtrap	(sockaddr_u *, endpt *, int);
752b15cb3dSCy Schubert extern	u_short ctlpeerstatus	(struct peer *);
76*f5f40dd6SCy Schubert extern	int	ctlsettrap	(sockaddr_u *, endpt *, int, int);
772b15cb3dSCy Schubert extern	u_short ctlsysstatus	(void);
782b15cb3dSCy Schubert extern	void	init_control	(void);
792b15cb3dSCy Schubert extern	void	process_control (struct recvbuf *, int);
802b15cb3dSCy Schubert extern	void	report_event	(int, struct peer *, const char *);
81*f5f40dd6SCy Schubert extern	int	mprintf_event	(int evcode, struct peer *p,
82*f5f40dd6SCy Schubert 				 const char *fmt, ...) NTP_PRINTF(3, 4);
83c0b746e5SOllivier Robert 
84c0b746e5SOllivier Robert /* ntp_control.c */
85c0b746e5SOllivier Robert /*
86c0b746e5SOllivier Robert  * Structure for translation tables between internal system
87c0b746e5SOllivier Robert  * variable indices and text format.
88c0b746e5SOllivier Robert  */
89c0b746e5SOllivier Robert struct ctl_var {
90c0b746e5SOllivier Robert 	u_short code;
91c0b746e5SOllivier Robert 	u_short flags;
922b15cb3dSCy Schubert 	const char *text;
93c0b746e5SOllivier Robert };
94c0b746e5SOllivier Robert /*
95c0b746e5SOllivier Robert  * Flag values
96c0b746e5SOllivier Robert  */
97c0b746e5SOllivier Robert #define	CAN_READ	0x01
98c0b746e5SOllivier Robert #define	CAN_WRITE	0x02
99c0b746e5SOllivier Robert 
100c0b746e5SOllivier Robert #define DEF		0x20
101c0b746e5SOllivier Robert #define	PADDING		0x40
102c0b746e5SOllivier Robert #define	EOV		0x80
103c0b746e5SOllivier Robert 
104c0b746e5SOllivier Robert #define	RO	(CAN_READ)
105c0b746e5SOllivier Robert #define	WO	(CAN_WRITE)
106c0b746e5SOllivier Robert #define	RW	(CAN_READ|CAN_WRITE)
107c0b746e5SOllivier Robert 
1082b15cb3dSCy Schubert extern	char *	add_var (struct ctl_var **, u_long, u_short);
1092b15cb3dSCy Schubert extern	void	free_varlist (struct ctl_var *);
1102b15cb3dSCy Schubert extern	void	set_var (struct ctl_var **, const char *, u_long, u_short);
1112b15cb3dSCy Schubert extern	void	set_sys_var (const char *, u_long, u_short);
1122b15cb3dSCy Schubert extern	const char *	get_ext_sys_var(const char *tag);
113c0b746e5SOllivier Robert 
114c0b746e5SOllivier Robert /* ntp_io.c */
115ea906c41SOllivier Robert typedef struct interface_info {
1162b15cb3dSCy Schubert 	endpt *	ep;
117ea906c41SOllivier Robert 	u_char	action;
118ea906c41SOllivier Robert } interface_info_t;
119ea906c41SOllivier Robert 
120ea906c41SOllivier Robert typedef void	(*interface_receiver_t)	(void *, interface_info_t *);
121ea906c41SOllivier Robert 
1222b15cb3dSCy Schubert extern	void	interface_enumerate	(interface_receiver_t, void *);
1232b15cb3dSCy Schubert extern	endpt *	getinterface		(sockaddr_u *, u_int32);
1242b15cb3dSCy Schubert extern	endpt *	select_peerinterface	(struct peer *, sockaddr_u *,
1252b15cb3dSCy Schubert 					 endpt *);
1262b15cb3dSCy Schubert extern	endpt *	findinterface		(sockaddr_u *);
1272b15cb3dSCy Schubert extern	endpt *	findbcastinter		(sockaddr_u *);
1282b15cb3dSCy Schubert extern	void	enable_broadcast	(endpt *, sockaddr_u *);
1292b15cb3dSCy Schubert extern	void	enable_multicast_if	(endpt *, sockaddr_u *);
1302b15cb3dSCy Schubert extern	void	interface_update	(interface_receiver_t, void *);
1312b15cb3dSCy Schubert #ifndef HAVE_IO_COMPLETION_PORT
1322b15cb3dSCy Schubert extern	void	io_handler		(void);
133*f5f40dd6SCy Schubert #else
134*f5f40dd6SCy Schubert extern	void WINAPI ip_interface_changed(ULONG_PTR ctx);
1352b15cb3dSCy Schubert #endif
1362b15cb3dSCy Schubert extern	void	init_io 	(void);
1372b15cb3dSCy Schubert extern	void	io_open_sockets	(void);
1382b15cb3dSCy Schubert extern	void	io_clr_stats	(void);
1392b15cb3dSCy Schubert extern	void	io_setbclient	(void);
1402b15cb3dSCy Schubert extern	void	io_unsetbclient	(void);
1412b15cb3dSCy Schubert extern	void	io_multicast_add(sockaddr_u *);
1422b15cb3dSCy Schubert extern	void	io_multicast_del(sockaddr_u *);
143*f5f40dd6SCy Schubert extern	void	sendpkt		(sockaddr_u *dest, endpt * ep, int ttl,
144*f5f40dd6SCy Schubert 				 struct pkt *pkt, int len);
145*f5f40dd6SCy Schubert extern	isc_boolean_t	is_linklocal(sockaddr_u *psau);
146*f5f40dd6SCy Schubert #ifdef DEBUG_TIMING
1472b15cb3dSCy Schubert extern	void	collect_timing  (struct recvbuf *, const char *, int, l_fp *);
148ea906c41SOllivier Robert #endif
149c0b746e5SOllivier Robert #ifdef HAVE_SIGNALED_IO
1502b15cb3dSCy Schubert extern	void	wait_for_signal		(void);
1512b15cb3dSCy Schubert extern	void	unblock_io_and_alarm	(void);
1522b15cb3dSCy Schubert extern	void	block_io_and_alarm	(void);
153ea906c41SOllivier Robert # define	UNBLOCK_IO_AND_ALARM()	unblock_io_and_alarm()
154ea906c41SOllivier Robert # define	BLOCK_IO_AND_ALARM()	block_io_and_alarm()
155ea906c41SOllivier Robert #else
1562b15cb3dSCy Schubert # define	UNBLOCK_IO_AND_ALARM()	do {} while (0)
1572b15cb3dSCy Schubert # define	BLOCK_IO_AND_ALARM()	do {} while (0)
158c0b746e5SOllivier Robert #endif
159*f5f40dd6SCy Schubert #define		eptoa(pif)	localaddrtoa(pif)
160*f5f40dd6SCy Schubert #define		latoa(pif)	eptoa(pif)
1612b15cb3dSCy Schubert extern const char * localaddrtoa(endpt *);
162*f5f40dd6SCy Schubert #ifdef DEBUG
163*f5f40dd6SCy Schubert extern const char * iflags_str(u_int32 iflags);
164*f5f40dd6SCy Schubert #endif
165*f5f40dd6SCy Schubert 
166c0b746e5SOllivier Robert 
167c0b746e5SOllivier Robert /* ntp_loopfilter.c */
1682b15cb3dSCy Schubert extern	void	init_loopfilter(void);
1692b15cb3dSCy Schubert extern	int 	local_clock(struct peer *, double);
1702b15cb3dSCy Schubert extern	void	adj_host_clock(void);
1712b15cb3dSCy Schubert extern	void	loop_config(int, double);
1722b15cb3dSCy Schubert extern	void	select_loop(int);
1732b15cb3dSCy Schubert extern	void	huffpuff(void);
174ea906c41SOllivier Robert extern	u_long	sys_clocktime;
1752b15cb3dSCy Schubert extern	u_int	sys_tai;
1762b15cb3dSCy Schubert extern 	int	freq_cnt;
177c0b746e5SOllivier Robert 
178c0b746e5SOllivier Robert /* ntp_monitor.c */
1793311ff84SXin LI #define MON_HASH_SIZE		((size_t)1U << mon_hash_bits)
1802b15cb3dSCy Schubert #define MON_HASH_MASK		(MON_HASH_SIZE - 1)
1812b15cb3dSCy Schubert #define	MON_HASH(addr)		(sock_hash(addr) & MON_HASH_MASK)
1822b15cb3dSCy Schubert extern	void	init_mon	(void);
1832b15cb3dSCy Schubert extern	void	mon_start	(int);
1842b15cb3dSCy Schubert extern	void	mon_stop	(int);
1852b15cb3dSCy Schubert extern	u_short	ntp_monitor	(struct recvbuf *, u_short);
1862b15cb3dSCy Schubert extern	void	mon_clearinterface(endpt *interface);
187c0b746e5SOllivier Robert 
188c0b746e5SOllivier Robert /* ntp_peer.c */
1892b15cb3dSCy Schubert extern	void	init_peer	(void);
1902b15cb3dSCy Schubert extern	struct peer *findexistingpeer(sockaddr_u *, const char *,
19109100258SXin LI 				      struct peer *, int, u_char, int *);
1922b15cb3dSCy Schubert extern	struct peer *findpeer	(struct recvbuf *, int, int *);
1932b15cb3dSCy Schubert extern	struct peer *findpeerbyassoc(associd_t);
1942b15cb3dSCy Schubert extern  void	set_peerdstadr	(struct peer *, endpt *);
19509100258SXin LI extern	struct peer *newpeer	(sockaddr_u *, const char *, endpt *,
19609100258SXin LI 				 int, u_char, u_char, u_char, u_char,
19709100258SXin LI 				 u_int, u_char, u_int32,
1982b15cb3dSCy Schubert 				 keyid_t, const char *);
1992b15cb3dSCy Schubert extern	void	peer_all_reset	(void);
2002b15cb3dSCy Schubert extern	void	peer_clr_stats	(void);
20109100258SXin LI extern	struct peer *peer_config(sockaddr_u *, const char *, endpt *,
20209100258SXin LI 				 int, u_char, u_char, u_char, u_char,
20309100258SXin LI 				 u_int, u_int32,
2042b15cb3dSCy Schubert 				 keyid_t, const char *);
2052b15cb3dSCy Schubert extern	void	peer_reset	(struct peer *);
2062b15cb3dSCy Schubert extern	void	refresh_all_peerinterfaces(void);
2072b15cb3dSCy Schubert extern	void	unpeer		(struct peer *);
2082b15cb3dSCy Schubert extern	void	clear_all	(void);
2092b15cb3dSCy Schubert extern	int	score_all	(struct peer *);
2102b15cb3dSCy Schubert extern	struct peer *findmanycastpeer(struct recvbuf *);
211a25439b6SCy Schubert extern	void	peer_cleanup	(void);
212c0b746e5SOllivier Robert 
2139c2daa00SOllivier Robert /* ntp_crypto.c */
2142b15cb3dSCy Schubert #ifdef AUTOKEY
2152b15cb3dSCy Schubert extern	int	crypto_recv	(struct peer *, struct recvbuf *);
2162b15cb3dSCy Schubert extern	int	crypto_xmit	(struct peer *, struct pkt *,
2172b15cb3dSCy Schubert 				    struct recvbuf *, int,
2182b15cb3dSCy Schubert 				    struct exten *, keyid_t);
2192b15cb3dSCy Schubert extern	keyid_t	session_key	(sockaddr_u *, sockaddr_u *, keyid_t,
2202b15cb3dSCy Schubert 				    keyid_t, u_long);
221*f5f40dd6SCy Schubert extern	int	make_keylist	(struct peer *, endpt *);
2222b15cb3dSCy Schubert extern	void	key_expire	(struct peer *);
2232b15cb3dSCy Schubert extern	void	crypto_update	(void);
224276da39aSCy Schubert extern	void	crypto_update_taichange(void);
2252b15cb3dSCy Schubert extern	void	crypto_config	(int, char *);
2262b15cb3dSCy Schubert extern	void	crypto_setup	(void);
2272b15cb3dSCy Schubert extern	u_int	crypto_ident	(struct peer *);
2282b15cb3dSCy Schubert extern	struct exten *crypto_args (struct peer *, u_int, associd_t, char *);
2292b15cb3dSCy Schubert extern	int	crypto_public	(struct peer *, u_char *, u_int);
2302b15cb3dSCy Schubert extern	void	value_free	(struct value *);
231ea906c41SOllivier Robert extern	char	*iffpar_file;
232ea906c41SOllivier Robert extern	EVP_PKEY *iffpar_pkey;
233ea906c41SOllivier Robert extern	char	*gqpar_file;
234ea906c41SOllivier Robert extern	EVP_PKEY *gqpar_pkey;
235ea906c41SOllivier Robert extern	char	*mvpar_file;
236ea906c41SOllivier Robert extern	EVP_PKEY *mvpar_pkey;
237ea906c41SOllivier Robert extern struct value tai_leap;
2382b15cb3dSCy Schubert #endif	/* AUTOKEY */
2399c2daa00SOllivier Robert 
240c0b746e5SOllivier Robert /* ntp_proto.c */
2412b15cb3dSCy Schubert extern	void	transmit	(struct peer *);
2422b15cb3dSCy Schubert extern	void	receive 	(struct recvbuf *);
2432b15cb3dSCy Schubert extern	void	peer_clear	(struct peer *, const char *);
2442b15cb3dSCy Schubert extern	void 	process_packet	(struct peer *, struct pkt *, u_int);
2452b15cb3dSCy Schubert extern	void	clock_select	(void);
246276da39aSCy Schubert extern	void	set_sys_leap	(u_char);
247c0b746e5SOllivier Robert 
2482b15cb3dSCy Schubert extern	u_long	leapsec;	/* seconds to next leap (proximity class) */
2492b15cb3dSCy Schubert extern  int	leapdif;	/* TAI difference step at next leap second */
2502b15cb3dSCy Schubert extern	int	sys_orphan;
2512b15cb3dSCy Schubert extern	double	sys_mindisp;
2522b15cb3dSCy Schubert extern	double	sys_maxdist;
253c0b746e5SOllivier Robert 
2542b15cb3dSCy Schubert extern	char	*sys_ident;	/* identity scheme */
2552d4e511cSCy Schubert extern	void	poll_update	(struct peer *, u_char, u_char);
256c0b746e5SOllivier Robert 
2572b15cb3dSCy Schubert extern	void	clear		(struct peer *);
2582b15cb3dSCy Schubert extern	void	clock_filter	(struct peer *, double, double, double);
2592b15cb3dSCy Schubert extern	void	init_proto	(void);
2602b15cb3dSCy Schubert extern	void	set_sys_tick_precision(double);
2612b15cb3dSCy Schubert extern	void	proto_config	(int, u_long, double, sockaddr_u *);
2622b15cb3dSCy Schubert extern	void	proto_clr_stats (void);
2632b15cb3dSCy Schubert 
264c0b746e5SOllivier Robert /* ntp_refclock.c */
2652b15cb3dSCy Schubert #ifdef	REFCLOCK
2662b15cb3dSCy Schubert extern	int	refclock_newpeer (struct peer *);
2672b15cb3dSCy Schubert extern	void	refclock_unpeer (struct peer *);
2682b15cb3dSCy Schubert extern	void	refclock_receive (struct peer *);
2692b15cb3dSCy Schubert extern	void	refclock_transmit (struct peer *);
2702b15cb3dSCy Schubert extern	void	init_refclock	(void);
271c0b746e5SOllivier Robert #endif	/* REFCLOCK */
272c0b746e5SOllivier Robert 
273c0b746e5SOllivier Robert /* ntp_request.c */
2742b15cb3dSCy Schubert extern	void	init_request	(void);
2752b15cb3dSCy Schubert extern	void	process_private (struct recvbuf *, int);
2762b15cb3dSCy Schubert extern	void	reset_auth_stats(void);
277c0b746e5SOllivier Robert 
278c0b746e5SOllivier Robert /* ntp_restrict.c */
2792b15cb3dSCy Schubert extern	void	init_restrict	(void);
28009100258SXin LI extern	void	restrictions	(sockaddr_u *, r4addr *);
281*f5f40dd6SCy Schubert extern	int/*BOOL*/hack_restrict(restrict_op op, sockaddr_u *resaddr,
282*f5f40dd6SCy Schubert 				 sockaddr_u *resmask, short ippeerlimit,
283*f5f40dd6SCy Schubert 				 u_short mflags, u_short rflags,
284*f5f40dd6SCy Schubert 				 u_int32 expire);
285*f5f40dd6SCy Schubert extern	void	restrict_source	(sockaddr_u *addr, int/*BOOL*/ remove,
286*f5f40dd6SCy Schubert 				 u_int32 lifetime);
287*f5f40dd6SCy Schubert #ifdef DEBUG
28809100258SXin LI extern	void	dump_restricts	(void);
289*f5f40dd6SCy Schubert extern	const char *resop_str	(restrict_op op);
290*f5f40dd6SCy Schubert extern	const char *rflags_str	(u_short rflags);
291*f5f40dd6SCy Schubert extern	const char *mflags_str	(u_short mflags);
292*f5f40dd6SCy Schubert #endif
293*f5f40dd6SCy Schubert 
294c0b746e5SOllivier Robert 
295c0b746e5SOllivier Robert /* ntp_timer.c */
2962b15cb3dSCy Schubert extern	void	init_timer	(void);
2972b15cb3dSCy Schubert extern	void	reinit_timer	(void);
2982b15cb3dSCy Schubert extern	void	timer		(void);
2992b15cb3dSCy Schubert extern	void	timer_clr_stats (void);
300*f5f40dd6SCy Schubert extern	int	endpt_scan_period;	/* -U option default 301s */
301*f5f40dd6SCy Schubert extern	u_long	endpt_scan_timer;	/* next scan current_time */
3022b15cb3dSCy Schubert extern	u_long	orphwait;		/* orphan wait time */
3032b15cb3dSCy Schubert #ifdef AUTOKEY
3042b15cb3dSCy Schubert extern	char	*sys_hostname;	/* host name */
3052b15cb3dSCy Schubert extern	char	*sys_groupname;	/* group name */
3062b15cb3dSCy Schubert extern	char	*group_name;	/* group name */
307052d159aSCy Schubert extern	u_char	sys_revoke;	/* keys revoke timeout */
308052d159aSCy Schubert extern	u_char	sys_automax;	/* session key timeout */
3092b15cb3dSCy Schubert #endif	/* AUTOKEY */
310c0b746e5SOllivier Robert 
311c0b746e5SOllivier Robert /* ntp_util.c */
3122b15cb3dSCy Schubert extern	void	init_util	(void);
3132b15cb3dSCy Schubert extern	void	write_stats	(void);
3142d4e511cSCy Schubert extern	void	stats_config	(int, const char *, int optflag);
3152b15cb3dSCy Schubert extern	void	record_peer_stats (sockaddr_u *, int, double, double, double, double);
3162b15cb3dSCy Schubert extern	void	record_proto_stats (char *);
3172b15cb3dSCy Schubert extern	void	record_loop_stats (double, double, double, double, int);
3182b15cb3dSCy Schubert extern	void	record_clock_stats (sockaddr_u *, const char *);
3192b15cb3dSCy Schubert extern	int	mprintf_clock_stats(sockaddr_u *, const char *, ...)
3202b15cb3dSCy Schubert 					NTP_PRINTF(2, 3);
321*f5f40dd6SCy Schubert extern	void	record_raw_stats (sockaddr_u *srcadr, sockaddr_u *dstadr,
322*f5f40dd6SCy Schubert 				  l_fp *t1, l_fp *t2, l_fp *t3, l_fp *t4,
323*f5f40dd6SCy Schubert 				  int leap, int version, int mode,
324*f5f40dd6SCy Schubert 				  int stratum, int ppoll, int precision,
325*f5f40dd6SCy Schubert 				  double root_delay, double root_dispersion,
326*f5f40dd6SCy Schubert 				  u_int32 refid, int len, u_char *extra);
3272b15cb3dSCy Schubert extern	void	check_leap_file	(int is_daily_check, u_int32 ntptime, const time_t * systime);
3282b15cb3dSCy Schubert extern	void	record_crypto_stats (sockaddr_u *, const char *);
329ea906c41SOllivier Robert #ifdef DEBUG
3302b15cb3dSCy Schubert extern	void	record_timing_stats (const char *);
331*f5f40dd6SCy Schubert extern	void	append_flagstr(char *flagstr, size_t sz, const char *text);
332ea906c41SOllivier Robert #endif
3332b15cb3dSCy Schubert extern	char *	fstostr(time_t);	/* NTP timescale seconds */
3342b15cb3dSCy Schubert 
3352b15cb3dSCy Schubert /* ntpd.c */
3362b15cb3dSCy Schubert extern	void	parse_cmdline_opts(int *, char ***);
337*f5f40dd6SCy Schubert 
338*f5f40dd6SCy Schubert /* ntservice.c */
339*f5f40dd6SCy Schubert #ifndef SYS_WINNT
340*f5f40dd6SCy Schubert # define	ntservice_isup()	do {} while (FALSE)
341*f5f40dd6SCy Schubert #endif
342*f5f40dd6SCy Schubert 
3432b15cb3dSCy Schubert /*
3442b15cb3dSCy Schubert  * Signals we catch for debugging.
3452b15cb3dSCy Schubert  */
3462b15cb3dSCy Schubert #define MOREDEBUGSIG	SIGUSR1
3472b15cb3dSCy Schubert #define LESSDEBUGSIG	SIGUSR2
3482b15cb3dSCy Schubert /*
3492b15cb3dSCy Schubert  * Signals which terminate us gracefully.
3502b15cb3dSCy Schubert  */
3512b15cb3dSCy Schubert #ifndef SYS_WINNT
3522b15cb3dSCy Schubert # define SIGDIE1	SIGHUP
3532b15cb3dSCy Schubert # define SIGDIE2	SIGINT
3542b15cb3dSCy Schubert # define SIGDIE3	SIGQUIT
3552b15cb3dSCy Schubert # define SIGDIE4	SIGTERM
3562b15cb3dSCy Schubert #endif /* SYS_WINNT */
3572b15cb3dSCy Schubert 
358c0b746e5SOllivier Robert 
359c0b746e5SOllivier Robert /*
3602b15cb3dSCy Schubert  * Last half: ntpd variables
3612b15cb3dSCy Schubert  * -------------------------
362c0b746e5SOllivier Robert  */
363c0b746e5SOllivier Robert 
364c0b746e5SOllivier Robert /* ntp_config.c */
365c0b746e5SOllivier Robert extern char const *	progname;
366f0574f5cSXin LI extern int saved_argc;
367f0574f5cSXin LI extern char **saved_argv;
368ea906c41SOllivier Robert extern char	*sys_phone[];		/* ACTS phone numbers */
369c0b746e5SOllivier Robert #if defined(HAVE_SCHED_SETSCHEDULER)
370c0b746e5SOllivier Robert extern int	config_priority_override;
371c0b746e5SOllivier Robert extern int	config_priority;
372c0b746e5SOllivier Robert #endif
3732b15cb3dSCy Schubert extern char *ntp_signd_socket;
3742b15cb3dSCy Schubert extern struct config_tree_tag *cfg_tree_history;
3752b15cb3dSCy Schubert 
3762b15cb3dSCy Schubert #ifdef BC_LIST_FRAMEWORK_NOT_YET_USED
3772b15cb3dSCy Schubert /*
3782b15cb3dSCy Schubert  * backwards compatibility flags
3792b15cb3dSCy Schubert  */
3802b15cb3dSCy Schubert typedef struct bc_entry_tag {
3812b15cb3dSCy Schubert 	int	token;
3822b15cb3dSCy Schubert 	int	enabled;
3832b15cb3dSCy Schubert } bc_entry;
3842b15cb3dSCy Schubert 
3852b15cb3dSCy Schubert extern bc_entry bc_list[];
3862b15cb3dSCy Schubert #endif
387c0b746e5SOllivier Robert 
388c0b746e5SOllivier Robert /* ntp_control.c */
389c0b746e5SOllivier Robert extern int	num_ctl_traps;
390224ba2bdSOllivier Robert extern keyid_t	ctl_auth_keyid;		/* keyid used for authenticating write requests */
391c0b746e5SOllivier Robert 
392c0b746e5SOllivier Robert /*
393c0b746e5SOllivier Robert  * Statistic counters to keep track of requests and responses.
394c0b746e5SOllivier Robert  */
395c0b746e5SOllivier Robert extern u_long	ctltimereset;		/* time stats reset */
396c0b746e5SOllivier Robert extern u_long	numctlreq;		/* number of requests we've received */
397c0b746e5SOllivier Robert extern u_long	numctlbadpkts;		/* number of bad control packets */
398c0b746e5SOllivier Robert extern u_long	numctlresponses; 	/* number of resp packets sent with data */
399c0b746e5SOllivier Robert extern u_long	numctlfrags; 		/* number of fragments sent */
400c0b746e5SOllivier Robert extern u_long	numctlerrors;		/* number of error responses sent */
401c0b746e5SOllivier Robert extern u_long	numctltooshort;		/* number of too short input packets */
402c0b746e5SOllivier Robert extern u_long	numctlinputresp; 	/* number of responses on input */
403c0b746e5SOllivier Robert extern u_long	numctlinputfrag; 	/* number of fragments on input */
404c0b746e5SOllivier Robert extern u_long	numctlinputerr;		/* number of input pkts with err bit set */
405c0b746e5SOllivier Robert extern u_long	numctlbadoffset; 	/* number of input pkts with nonzero offset */
406c0b746e5SOllivier Robert extern u_long	numctlbadversion;	/* number of input pkts with unknown version */
407c0b746e5SOllivier Robert extern u_long	numctldatatooshort;	/* data too short for count */
408c0b746e5SOllivier Robert extern u_long	numctlbadop; 		/* bad op code found in packet */
409c0b746e5SOllivier Robert extern u_long	numasyncmsgs;		/* number of async messages we've sent */
410c0b746e5SOllivier Robert 
411c0b746e5SOllivier Robert /*
412c0b746e5SOllivier Robert  * Other statistics of possible interest
413c0b746e5SOllivier Robert  */
414c0b746e5SOllivier Robert extern volatile u_long packets_dropped;	/* total number of packets dropped on reception */
415c0b746e5SOllivier Robert extern volatile u_long packets_ignored;	/* packets received on wild card interface */
416c0b746e5SOllivier Robert extern volatile u_long packets_received;/* total number of packets received */
417c0b746e5SOllivier Robert extern u_long	packets_sent;		/* total number of packets sent */
418c0b746e5SOllivier Robert extern u_long	packets_notsent; 	/* total number of packets which couldn't be sent */
419c0b746e5SOllivier Robert 
420c0b746e5SOllivier Robert extern volatile u_long handler_calls;	/* number of calls to interrupt handler */
421c0b746e5SOllivier Robert extern volatile u_long handler_pkts;	/* number of pkts received by handler */
422c0b746e5SOllivier Robert extern u_long	io_timereset;		/* time counters were reset */
423c0b746e5SOllivier Robert 
4242b15cb3dSCy Schubert /* ntp_io.c */
425*f5f40dd6SCy Schubert extern int	no_periodic_scan;	/* no periodic net addr scans */
426*f5f40dd6SCy Schubert extern int	scan_addrs_once;	/* no net addr rescans */
427*f5f40dd6SCy Schubert extern int	nonlocal_v4_addr_up;	/* should we try IPv4 pool? */
428*f5f40dd6SCy Schubert extern int	nonlocal_v6_addr_up;	/* should we try IPv6 pool? */
4292b15cb3dSCy Schubert extern u_int	sys_ifnum;		/* next .ifnum to assign */
4302b15cb3dSCy Schubert extern endpt *	any_interface;		/* IPv4 wildcard */
4312b15cb3dSCy Schubert extern endpt *	any6_interface;		/* IPv6 wildcard */
4322b15cb3dSCy Schubert extern endpt *	loopback_interface;	/* IPv4 loopback for refclocks */
4332b15cb3dSCy Schubert extern endpt *	ep_list;		/* linked list */
434c0b746e5SOllivier Robert 
435c0b746e5SOllivier Robert /* ntp_loopfilter.c */
436224ba2bdSOllivier Robert extern double	drift_comp;		/* clock frequency (s/s) */
437224ba2bdSOllivier Robert extern double	clock_stability;	/* clock stability (s/s) */
438a25439b6SCy Schubert extern double	clock_max_back;		/* max backward offset before step (s) */
439a25439b6SCy Schubert extern double	clock_max_fwd;		/* max forward offset before step (s) */
440224ba2bdSOllivier Robert extern double	clock_panic;		/* max offset before panic (s) */
441224ba2bdSOllivier Robert extern double	clock_phi;		/* dispersion rate (s/s) */
442224ba2bdSOllivier Robert extern double	clock_minstep;		/* step timeout (s) */
4432b15cb3dSCy Schubert extern double	clock_codec;		/* codec frequency */
444224ba2bdSOllivier Robert #ifdef KERNEL_PLL
445224ba2bdSOllivier Robert extern int	pll_status;		/* status bits for kernel pll */
446224ba2bdSOllivier Robert #endif /* KERNEL_PLL */
447c0b746e5SOllivier Robert 
448c0b746e5SOllivier Robert /*
449c0b746e5SOllivier Robert  * Clock state machine control flags
450c0b746e5SOllivier Robert  */
451c0b746e5SOllivier Robert extern int	ntp_enable;		/* clock discipline enabled */
452c0b746e5SOllivier Robert extern int	pll_control;		/* kernel support available */
453c0b746e5SOllivier Robert extern int	kern_enable;		/* kernel support enabled */
4542b15cb3dSCy Schubert extern int	hardpps_enable;		/* kernel PPS discipline enabled */
455c0b746e5SOllivier Robert extern int	ext_enable;		/* external clock enabled */
456224ba2bdSOllivier Robert extern int	cal_enable;		/* refclock calibrate enable */
457a25439b6SCy Schubert extern int	allow_panic;		/* allow panic correction (-g) */
4583311ff84SXin LI extern int	enable_panic_check;	/* Can we check allow_panic's state? */
459a25439b6SCy Schubert extern int	force_step_once;	/* always step time once at startup (-G) */
460a25439b6SCy Schubert extern int	mode_ntpdate;		/* exit on first clock set (-q) */
461224ba2bdSOllivier Robert extern int	peer_ntpdate;		/* count of ntpdate peers */
462c0b746e5SOllivier Robert 
463c0b746e5SOllivier Robert /*
464c0b746e5SOllivier Robert  * Clock state machine variables
465c0b746e5SOllivier Robert  */
466224ba2bdSOllivier Robert extern u_char	sys_poll;		/* system poll interval (log2 s) */
467c0b746e5SOllivier Robert extern int	state;			/* clock discipline state */
468c0b746e5SOllivier Robert extern int	tc_counter;		/* poll-adjust counter */
469c0b746e5SOllivier Robert extern u_long	last_time;		/* time of last clock update (s) */
470c0b746e5SOllivier Robert extern double	last_offset;		/* last clock offset (s) */
4712b15cb3dSCy Schubert extern u_char	allan_xpt;		/* Allan intercept (log2 s) */
472ea906c41SOllivier Robert extern double	clock_jitter;		/* clock jitter (s) */
4732b15cb3dSCy Schubert extern double	sys_offset;		/* system offset (s) */
474ea906c41SOllivier Robert extern double	sys_jitter;		/* system jitter (s) */
475c0b746e5SOllivier Robert 
476c0b746e5SOllivier Robert /* ntp_monitor.c */
4772b15cb3dSCy Schubert extern u_char	mon_hash_bits;		/* log2 size of hash table */
4782b15cb3dSCy Schubert extern mon_entry ** mon_hash;		/* MRU hash table */
4792b15cb3dSCy Schubert extern mon_entry mon_mru_list;		/* mru listhead */
4802b15cb3dSCy Schubert extern u_int	mon_enabled;		/* MON_OFF (0) or other MON_* */
4812b15cb3dSCy Schubert extern u_int	mru_alloc;		/* mru list + free list count */
4822b15cb3dSCy Schubert extern u_int	mru_entries;		/* mru list count */
4832b15cb3dSCy Schubert extern u_int	mru_peakentries;	/* highest mru_entries */
4842b15cb3dSCy Schubert extern u_int	mru_initalloc;		/* entries to preallocate */
4852b15cb3dSCy Schubert extern u_int	mru_incalloc;		/* allocation batch factor */
4862b15cb3dSCy Schubert extern u_int	mru_mindepth;		/* preempt above this */
4872b15cb3dSCy Schubert extern int	mru_maxage;		/* for entries older than */
4882b15cb3dSCy Schubert extern u_int	mru_maxdepth; 		/* MRU size hard limit */
4892b15cb3dSCy Schubert extern int	mon_age;		/* preemption limit */
490c0b746e5SOllivier Robert 
491c0b746e5SOllivier Robert /* ntp_peer.c */
4922b15cb3dSCy Schubert extern struct peer *peer_hash[NTP_HASH_SIZE];	/* peer hash table */
4932b15cb3dSCy Schubert extern int	peer_hash_count[NTP_HASH_SIZE];	/* count of in each bucket */
4942b15cb3dSCy Schubert extern struct peer *assoc_hash[NTP_HASH_SIZE];	/* association ID hash table */
4952b15cb3dSCy Schubert extern int	assoc_hash_count[NTP_HASH_SIZE];/* count of in each bucket */
4962b15cb3dSCy Schubert extern struct peer *peer_list;		/* peer structures list */
4972b15cb3dSCy Schubert extern int	peer_count;		/* count in peer_list */
4982b15cb3dSCy Schubert extern int	peer_free_count;	/* count in peer_free */
499c0b746e5SOllivier Robert 
500c0b746e5SOllivier Robert /*
501c0b746e5SOllivier Robert  * Miscellaneous statistic counters which may be queried.
502c0b746e5SOllivier Robert  */
503c0b746e5SOllivier Robert extern u_long	peer_timereset;		/* time stat counters were zeroed */
504c0b746e5SOllivier Robert extern u_long	findpeer_calls;		/* number of calls to findpeer */
505c0b746e5SOllivier Robert extern u_long	assocpeer_calls;	/* number of calls to findpeerbyassoc */
506c0b746e5SOllivier Robert extern u_long	peer_allocations;	/* number of allocations from the free list */
507c0b746e5SOllivier Robert extern u_long	peer_demobilizations;	/* number of structs freed to free list */
508c0b746e5SOllivier Robert extern int	total_peer_structs;	/* number of peer structs in circulation */
509ea906c41SOllivier Robert extern int	peer_associations;	/* mobilized associations */
510ea906c41SOllivier Robert extern int	peer_preempt;		/* preemptable associations */
5112b15cb3dSCy Schubert 
512c0b746e5SOllivier Robert /* ntp_proto.c */
513c0b746e5SOllivier Robert /*
514c0b746e5SOllivier Robert  * System variables are declared here.	See Section 3.2 of the
515c0b746e5SOllivier Robert  * specification.
516c0b746e5SOllivier Robert  */
517c0b746e5SOllivier Robert extern u_char	sys_leap;		/* system leap indicator */
5182b15cb3dSCy Schubert extern u_char	sys_stratum;		/* system stratum */
519c0b746e5SOllivier Robert extern s_char	sys_precision;		/* local clock precision */
5202b15cb3dSCy Schubert extern double	sys_rootdelay;		/* roundtrip delay to primary source */
5212b15cb3dSCy Schubert extern double	sys_rootdisp;		/* dispersion to primary source */
5222b15cb3dSCy Schubert extern u_int32	sys_refid;		/* reference id */
5232b15cb3dSCy Schubert extern l_fp	sys_reftime;		/* last update time */
5242b15cb3dSCy Schubert extern struct peer *sys_peer;		/* current peer */
525c0b746e5SOllivier Robert 
526c0b746e5SOllivier Robert /*
527c0b746e5SOllivier Robert  * Nonspecified system state variables.
528c0b746e5SOllivier Robert  */
529c0b746e5SOllivier Robert extern int	sys_bclient;		/* we set our time to broadcasts */
530a466cc55SCy Schubert extern int	sys_mclient;		/* we set our time to manycasts */
531c0b746e5SOllivier Robert extern double	sys_bdelay; 		/* broadcast client default delay */
532c0b746e5SOllivier Robert extern int	sys_authenticate;	/* requre authentication for config */
533c0b746e5SOllivier Robert extern l_fp	sys_authdelay;		/* authentication delay */
534f391d6bcSXin LI extern u_char	sys_bcpollbstep;	/* broadcast poll backstep gate */
5352b15cb3dSCy Schubert extern u_long 	sys_epoch;		/* last clock update time */
536224ba2bdSOllivier Robert extern keyid_t	sys_private;		/* private value for session seed */
5379c2daa00SOllivier Robert extern int	sys_manycastserver;	/* respond to manycast client pkts */
538f0574f5cSXin LI extern int	sys_maxclock;		/* maximum survivors */
5399c2daa00SOllivier Robert extern int	sys_minclock;		/* minimum survivors */
5409c2daa00SOllivier Robert extern int	sys_minsane;		/* minimum candidates */
5419c2daa00SOllivier Robert extern int	sys_floor;		/* cluster stratum floor */
5429c2daa00SOllivier Robert extern int	sys_ceiling;		/* cluster stratum ceiling */
5432b15cb3dSCy Schubert extern u_char	sys_ttl[MAX_TTL];	/* ttl mapping vector */
544f0574f5cSXin LI extern u_int	sys_ttlmax;		/* max ttl mapping vector index */
545c0b746e5SOllivier Robert 
546c0b746e5SOllivier Robert /*
547c0b746e5SOllivier Robert  * Statistics counters
548c0b746e5SOllivier Robert  */
54909100258SXin LI extern u_long	sys_badauth;		/* bad authentication */
55009100258SXin LI extern u_long	sys_badlength;		/* bad length or format */
55109100258SXin LI extern u_long	sys_declined;		/* declined */
55209100258SXin LI extern u_long	sys_kodsent;		/* KoD sent */
55309100258SXin LI extern u_long	sys_lamport;		/* Lamport violation */
55409100258SXin LI extern u_long	sys_limitrejected;	/* rate exceeded */
5552b15cb3dSCy Schubert extern u_long	sys_newversion;		/* current version  */
5562b15cb3dSCy Schubert extern u_long	sys_oldversion;		/* old version */
55709100258SXin LI extern u_long	sys_processed;		/* packets for this host */
55809100258SXin LI extern u_long	sys_received;		/* packets received */
5592b15cb3dSCy Schubert extern u_long	sys_restricted;		/* access denied */
56009100258SXin LI extern u_long	sys_stattime;		/* time since reset */
56109100258SXin LI extern u_long	sys_tsrounding;		/* timestamp rounding errors */
562c0b746e5SOllivier Robert 
563c0b746e5SOllivier Robert /* ntp_request.c */
564224ba2bdSOllivier Robert extern keyid_t	info_auth_keyid;	/* keyid used to authenticate requests */
5652b15cb3dSCy Schubert extern u_long	auth_timereset;
566c0b746e5SOllivier Robert 
567c0b746e5SOllivier Robert /* ntp_restrict.c */
5682b15cb3dSCy Schubert extern restrict_u *	restrictlist4;	/* IPv4 restriction list */
5692b15cb3dSCy Schubert extern restrict_u *	restrictlist6;	/* IPv6 restriction list */
5702b15cb3dSCy Schubert extern int		ntp_minpkt;
5712b15cb3dSCy Schubert extern u_char		ntp_minpoll;
5722b15cb3dSCy Schubert 
5732b15cb3dSCy Schubert /* ntp_scanner.c */
5742b15cb3dSCy Schubert extern u_int32		conf_file_sum;	/* Simple sum of characters */
5752b15cb3dSCy Schubert 
5762b15cb3dSCy Schubert /* ntp_signd.c */
5772b15cb3dSCy Schubert #ifdef HAVE_NTP_SIGND
5782b15cb3dSCy Schubert extern void send_via_ntp_signd(struct recvbuf *, int, keyid_t, int,
5792b15cb3dSCy Schubert 			       struct pkt *);
5802b15cb3dSCy Schubert #endif
581c0b746e5SOllivier Robert 
582c0b746e5SOllivier Robert /* ntp_timer.c */
583c0b746e5SOllivier Robert extern volatile int alarm_flag;		/* alarm flag */
584c0b746e5SOllivier Robert extern volatile u_long alarm_overflow;
5852b15cb3dSCy Schubert extern u_long	current_time;		/* seconds since startup */
586c0b746e5SOllivier Robert extern u_long	timer_timereset;
587c0b746e5SOllivier Robert extern u_long	timer_overflows;
588c0b746e5SOllivier Robert extern u_long	timer_xmtcalls;
589276da39aSCy Schubert extern int	leap_sec_in_progress;
590276da39aSCy Schubert #ifdef LEAP_SMEAR
591276da39aSCy Schubert extern struct leap_smear_info leap_smear;
592276da39aSCy Schubert extern int	leap_smear_intv;
593276da39aSCy Schubert #endif
5942b15cb3dSCy Schubert #ifdef SYS_WINNT
5952b15cb3dSCy Schubert HANDLE WaitableTimerHandle;
5962b15cb3dSCy Schubert #endif
597c0b746e5SOllivier Robert 
598c0b746e5SOllivier Robert /* ntp_util.c */
5992b15cb3dSCy Schubert extern	char	statsdir[MAXFILENAME];
600c0b746e5SOllivier Robert extern	int	stats_control;		/* write stats to fileset? */
601ea906c41SOllivier Robert extern	int	stats_write_period;	/* # of seconds between writes. */
602ea906c41SOllivier Robert extern	double	stats_write_tolerance;
6032b15cb3dSCy Schubert extern	double	wander_threshold;
604c0b746e5SOllivier Robert 
605c0b746e5SOllivier Robert /* ntpd.c */
606c0b746e5SOllivier Robert extern	int	nofork;		/* no-fork flag */
607c0b746e5SOllivier Robert extern	int	initializing;	/* initializing flag */
608ea906c41SOllivier Robert #ifdef HAVE_DROPROOT
609ea906c41SOllivier Robert extern	int	droproot;	/* flag: try to drop root privileges after startup */
6102b15cb3dSCy Schubert extern	int	root_dropped;	/* root has been dropped */
6119c2daa00SOllivier Robert extern char *user;		/* user to switch to */
6129c2daa00SOllivier Robert extern char *group;		/* group to switch to */
6132b15cb3dSCy Schubert extern const char *chrootdir;	/* directory to chroot() to */
6142b15cb3dSCy Schubert #endif
6152b15cb3dSCy Schubert #ifdef HAVE_WORKING_FORK
6162d4e511cSCy Schubert extern	int	daemon_pipe[2];	/* startup monitoring */
6172b15cb3dSCy Schubert #endif
6182b15cb3dSCy Schubert 
6192b15cb3dSCy Schubert /* ntservice.c */
6202b15cb3dSCy Schubert #ifdef SYS_WINNT
6212b15cb3dSCy Schubert extern int accept_wildcard_if_for_winnt;
6229c2daa00SOllivier Robert #endif
623c0b746e5SOllivier Robert 
624c0b746e5SOllivier Robert /* refclock_conf.c */
625c0b746e5SOllivier Robert #ifdef REFCLOCK
6262b15cb3dSCy Schubert /* refclock configuration table */
6272b15cb3dSCy Schubert extern struct refclock * const refclock_conf[];
628c0b746e5SOllivier Robert extern u_char	num_refclock_conf;
629c0b746e5SOllivier Robert #endif
6302b15cb3dSCy Schubert 
631