1/*
2 * ntpd.h - Prototypes for ntpd.
3 */
4
5#include "ntp_syslog.h"
6#include "ntp_fp.h"
7#include "ntp.h"
8#include "ntp_debug.h"
9#include "ntp_select.h"
10#include "ntp_malloc.h"
11#include "ntp_refclock.h"
12#include "recvbuff.h"
13
14/* ntp_config.c */
15
16#define	TAI_1972	10	/* initial TAI offset (s) */
17extern	char	*keysdir;	/* crypto keys and leaptable directory */
18extern	char *	saveconfigdir;	/* ntpq saveconfig output directory */
19
20extern	void	getconfig	(int, char **);
21extern	void	ctl_clr_stats	(void);
22extern	int	ctlclrtrap	(sockaddr_u *, struct interface *, int);
23extern	u_short ctlpeerstatus	(struct peer *);
24extern	int	ctlsettrap	(sockaddr_u *, struct interface *, int, int);
25extern	u_short ctlsysstatus	(void);
26extern	void	init_control	(void);
27extern	void	init_logging	(char const *, int);
28extern	void	setup_logfile	(void);
29extern	void	process_control (struct recvbuf *, int);
30extern	void	report_event	(int, struct peer *, const char *);
31
32/* ntp_control.c */
33/*
34 * Structure for translation tables between internal system
35 * variable indices and text format.
36 */
37struct ctl_var {
38	u_short code;
39	u_short flags;
40	char *text;
41};
42/*
43 * Flag values
44 */
45#define	CAN_READ	0x01
46#define	CAN_WRITE	0x02
47
48#define DEF		0x20
49#define	PADDING		0x40
50#define	EOV		0x80
51
52#define	RO	(CAN_READ)
53#define	WO	(CAN_WRITE)
54#define	RW	(CAN_READ|CAN_WRITE)
55
56extern  char *  add_var (struct ctl_var **, u_long, u_short);
57extern  void    free_varlist (struct ctl_var *);
58extern  void    set_var (struct ctl_var **, const char *, u_long, u_short);
59extern  void    set_sys_var (const char *, u_long, u_short);
60
61/* ntp_intres.c */
62extern	void	ntp_res_name	(sockaddr_u, u_short);
63extern	void	ntp_res_recv	(void);
64extern	void	ntp_intres	(void);
65#ifdef SYS_WINNT
66extern	unsigned WINAPI	ntp_intres_thread	(void *);
67#endif
68
69/* ntp_io.c */
70typedef struct interface_info {
71	struct interface *	interface;
72	u_char			action;
73} interface_info_t;
74
75typedef void	(*interface_receiver_t)	(void *, interface_info_t *);
76
77extern  int	disable_dynamic_updates;
78
79extern	void	interface_enumerate	(interface_receiver_t, void *);
80extern	struct interface *findinterface	(sockaddr_u *);
81extern	struct interface *findbcastinter(sockaddr_u *);
82extern	void	enable_broadcast	(struct interface *, sockaddr_u *);
83extern	void	enable_multicast_if	(struct interface *, sockaddr_u *);
84extern	void	interface_update	(interface_receiver_t, void *);
85
86extern	void	init_io 	(void);
87extern	void	io_open_sockets	(void);
88extern	void	input_handler	(l_fp *);
89extern	void	io_clr_stats	(void);
90extern	void	io_setbclient	(void);
91extern	void	io_unsetbclient	(void);
92extern	void	io_multicast_add(sockaddr_u *);
93extern	void	io_multicast_del(sockaddr_u *);
94extern	void	sendpkt 	(sockaddr_u *, struct interface *, int, struct pkt *, int);
95#ifndef SYS_WINNT
96extern	void	kill_asyncio	(int);
97#endif
98#ifdef DEBUG
99extern	void	collect_timing  (struct recvbuf *, const char *, int, l_fp *);
100#endif
101#ifdef HAVE_SIGNALED_IO
102extern	void	wait_for_signal		(void);
103extern	void	unblock_io_and_alarm	(void);
104extern	void	block_io_and_alarm	(void);
105#define UNBLOCK_IO_AND_ALARM()		unblock_io_and_alarm()
106#define BLOCK_IO_AND_ALARM()		block_io_and_alarm()
107#else
108#define UNBLOCK_IO_AND_ALARM()
109#define BLOCK_IO_AND_ALARM()
110#endif
111
112/* ntp_loopfilter.c */
113extern	void	init_loopfilter(void);
114extern	int 	local_clock(struct peer *, double);
115extern	void	adj_host_clock(void);
116extern	void	loop_config(int, double);
117extern	void	huffpuff(void);
118extern	u_long	sys_clocktime;
119extern	u_int	sys_tai;
120
121/* ntp_monitor.c */
122extern	void	init_mon	(void);
123extern	void	mon_start	(int);
124extern	void	mon_stop	(int);
125extern	int	ntp_monitor     (struct recvbuf *, int);
126extern  void    ntp_monclearinterface (struct interface *interface);
127
128/* ntp_peer.c */
129extern	void	init_peer	(void);
130extern	struct peer *findexistingpeer (sockaddr_u *, struct peer *, int);
131extern	struct peer *findpeer	(sockaddr_u *, struct interface *, int, int *);
132extern	struct peer *findpeerbyassoc (u_int);
133extern  void	set_peerdstadr	(struct peer *peer, struct interface *interface);
134extern	struct peer *newpeer	(sockaddr_u *, struct interface *, int, int, int, int, u_int, u_char, int, keyid_t);
135extern	void	peer_all_reset	(void);
136extern	void	peer_clr_stats	(void);
137extern	struct peer *peer_config (sockaddr_u *, struct interface *, int, int, int, int, u_int, int, keyid_t, u_char *, char *);
138extern	void	peer_reset	(struct peer *);
139extern	void	refresh_all_peerinterfaces (void);
140extern	void	unpeer		(struct peer *);
141extern	void	clear_all	(void);
142extern	int	score_all	(struct peer *);
143extern	struct	peer *findmanycastpeer	(struct recvbuf *);
144extern	u_long	get_dns_flags	(char*, struct peer *);
145
146/* ntp_crypto.c */
147#ifdef OPENSSL
148extern	int	crypto_recv	(struct peer *, struct recvbuf *);
149extern	int	crypto_xmit	(struct peer *, struct pkt *,
150				    struct recvbuf *, int,
151				    struct exten *, keyid_t);
152extern	keyid_t	session_key	(sockaddr_u *, sockaddr_u *, keyid_t,
153				    keyid_t, u_long);
154extern	int	make_keylist	(struct peer *, struct interface *);
155extern	void	key_expire	(struct peer *);
156extern	void	crypto_update	(void);
157extern	void	crypto_config	(int, char *);
158extern	void	crypto_setup	(void);
159extern	u_int	crypto_ident	(struct peer *);
160extern	struct exten *crypto_args (struct peer *, u_int, associd_t, char *);
161extern	int	crypto_public	(struct peer *, u_char *, u_int);
162extern	void	value_free	(struct value *);
163extern	char	*iffpar_file;
164extern	EVP_PKEY *iffpar_pkey;
165extern	char	*gqpar_file;
166extern	EVP_PKEY *gqpar_pkey;
167extern	char	*mvpar_file;
168extern	EVP_PKEY *mvpar_pkey;
169extern struct value tai_leap;
170#endif /* OPENSSL */
171
172/* ntp_proto.c */
173extern	void	transmit	(struct peer *);
174extern	void	receive 	(struct recvbuf *);
175extern	void	peer_clear	(struct peer *, char *);
176extern	void 	process_packet	(struct peer *, struct pkt *, u_int);
177extern	void	clock_select	(void);
178
179extern	int	leap_tai;	/* TAI at next leap */
180extern	u_long	leap_sec;	/* next scheduled leap from file */
181extern	u_long	leap_peers;	/* next scheduled leap from peers */
182extern	u_long	leapsec;	/* seconds to next leap */
183extern	u_long	leap_expire;	/* leap information expiration */
184extern	int	sys_orphan;
185extern	double	sys_mindisp;
186extern	double	sys_maxdist;
187
188/*
189 * there seems to be a bug in the IRIX 4 compiler which prevents
190 * u_char from beeing used in prototyped functions.
191 * This is also true AIX compiler.
192 * So give up and define it to be int. WLJ
193 */
194extern	void	poll_update (struct peer *, int);
195
196extern	void	clear		(struct peer *);
197extern	void	clock_filter	(struct peer *, double, double, double);
198extern	void	init_proto	(void);
199extern	void	proto_config	(int, u_long, double, sockaddr_u *);
200extern	void	proto_clr_stats (void);
201
202#ifdef	REFCLOCK
203/* ntp_refclock.c */
204extern	int	refclock_newpeer (struct peer *);
205extern	void	refclock_unpeer (struct peer *);
206extern	void	refclock_receive (struct peer *);
207extern	void	refclock_transmit (struct peer *);
208extern	void	init_refclock	(void);
209#endif	/* REFCLOCK */
210
211/* ntp_request.c */
212extern	void	init_request	(void);
213extern	void	process_private (struct recvbuf *, int);
214
215/* ntp_restrict.c */
216extern	void	init_restrict	(void);
217extern	int 	restrictions	(sockaddr_u *);
218extern	void	hack_restrict	(int, sockaddr_u *, sockaddr_u *, int, int);
219
220/* ntp_timer.c */
221extern	void	init_timer	(void);
222extern	void	reinit_timer	(void);
223extern	void	timer		(void);
224extern	void	timer_clr_stats (void);
225extern  void    timer_interfacetimeout (u_long);
226extern  volatile int interface_interval;
227#ifdef OPENSSL
228extern	char	*sys_hostname;	/* host name */
229extern	char	*sys_groupname;	/* group name */
230extern	char	*group_name;	/* group name */
231extern u_long	sys_revoke;	/* keys revoke timeout */
232extern u_long	sys_automax;	/* session key timeout */
233#endif /* OPENSSL */
234
235/* ntp_util.c */
236extern	void	init_util	(void);
237extern	void	write_stats	(void);
238extern	void	stats_config	(int, const char *);
239extern	void	record_peer_stats (sockaddr_u *, int, double, double, double, double);
240extern	void	record_proto_stats (char *);
241extern	void	record_loop_stats (double, double, double, double, int);
242extern	void	record_clock_stats (sockaddr_u *, const char *);
243extern	void	record_raw_stats (sockaddr_u *, sockaddr_u *, l_fp *, l_fp *, l_fp *, l_fp *);
244extern	u_long	leap_month(u_long);
245extern	void	record_crypto_stats (sockaddr_u *, const char *);
246#ifdef DEBUG
247extern	void	record_timing_stats (const char *);
248#endif
249extern  u_short	sock_hash (sockaddr_u *);
250extern	char *	fstostr(time_t);	/* NTP timescale seconds */
251extern	double	old_drift;
252extern	int	drift_file_sw;
253extern	double	wander_threshold;
254extern	double	wander_resid;
255extern  int save_drift_file (void);
256extern	int	awoke(void);
257/*
258 * Variable declarations for ntpd.
259 */
260/* ntp_config.c */
261extern char const *	progname;
262extern char	*sys_phone[];		/* ACTS phone numbers */
263#if defined(HAVE_SCHED_SETSCHEDULER)
264extern int	config_priority_override;
265extern int	config_priority;
266#endif
267extern char *ntp_signd_socket;
268extern struct config_tree *cfg_tree_history;
269
270#ifdef BC_LIST_FRAMEWORK_NOT_YET_USED
271/*
272 * backwards compatibility flags
273 */
274typedef struct bc_entry_tag {
275	int	token;
276	int	enabled;
277} bc_entry;
278
279extern bc_entry bc_list[];
280#endif
281
282/* ntp_control.c */
283extern int	num_ctl_traps;
284extern keyid_t	ctl_auth_keyid;		/* keyid used for authenticating write requests */
285
286/*
287 * Statistic counters to keep track of requests and responses.
288 */
289extern u_long	ctltimereset;		/* time stats reset */
290extern u_long	numctlreq;		/* number of requests we've received */
291extern u_long	numctlbadpkts;		/* number of bad control packets */
292extern u_long	numctlresponses; 	/* number of resp packets sent with data */
293extern u_long	numctlfrags; 		/* number of fragments sent */
294extern u_long	numctlerrors;		/* number of error responses sent */
295extern u_long	numctltooshort;		/* number of too short input packets */
296extern u_long	numctlinputresp; 	/* number of responses on input */
297extern u_long	numctlinputfrag; 	/* number of fragments on input */
298extern u_long	numctlinputerr;		/* number of input pkts with err bit set */
299extern u_long	numctlbadoffset; 	/* number of input pkts with nonzero offset */
300extern u_long	numctlbadversion;	/* number of input pkts with unknown version */
301extern u_long	numctldatatooshort;	/* data too short for count */
302extern u_long	numctlbadop; 		/* bad op code found in packet */
303extern u_long	numasyncmsgs;		/* number of async messages we've sent */
304
305/* ntp_intres.c */
306extern keyid_t	req_keyid;		/* request keyid */
307extern int	req_keytype;		/* OpenSSL NID such as NID_md5 */
308extern size_t	req_hashlen;		/* digest size for req_keytype */
309extern char *	req_file;		/* name of the file with configuration info */
310#ifdef SYS_WINNT
311extern HANDLE ResolverEventHandle;
312#else
313extern int resolver_pipe_fd[2];  /* used to let the resolver process alert the parent process */
314#endif /* SYS_WINNT */
315
316/*
317 * Other statistics of possible interest
318 */
319extern volatile u_long packets_dropped;	/* total number of packets dropped on reception */
320extern volatile u_long packets_ignored;	/* packets received on wild card interface */
321extern volatile u_long packets_received;/* total number of packets received */
322extern u_long	packets_sent;		/* total number of packets sent */
323extern u_long	packets_notsent; 	/* total number of packets which couldn't be sent */
324
325extern volatile u_long handler_calls;	/* number of calls to interrupt handler */
326extern volatile u_long handler_pkts;	/* number of pkts received by handler */
327extern u_long	io_timereset;		/* time counters were reset */
328
329/*
330 * Interface stuff
331 */
332extern struct interface *any_interface;	/* default ipv4 interface */
333extern struct interface *any6_interface;/* default ipv6 interface */
334extern struct interface *loopback_interface; /* loopback interface */
335
336/*
337 * File descriptor masks etc. for call to select
338 */
339extern fd_set	activefds;
340extern int	maxactivefd;
341
342/* ntp_loopfilter.c */
343extern double	drift_comp;		/* clock frequency (s/s) */
344extern double	clock_stability;	/* clock stability (s/s) */
345extern double	clock_max;		/* max offset before step (s) */
346extern double	clock_panic;		/* max offset before panic (s) */
347extern double	clock_phi;		/* dispersion rate (s/s) */
348extern double	clock_minstep;		/* step timeout (s) */
349extern double	clock_codec;		/* codec frequency */
350#ifdef KERNEL_PLL
351extern int	pll_status;		/* status bits for kernel pll */
352#endif /* KERNEL_PLL */
353
354/*
355 * Clock state machine control flags
356 */
357extern int	ntp_enable;		/* clock discipline enabled */
358extern int	pll_control;		/* kernel support available */
359extern int	kern_enable;		/* kernel support enabled */
360extern int	pps_enable;		/* kernel PPS discipline enabled */
361extern int	ext_enable;		/* external clock enabled */
362extern int	cal_enable;		/* refclock calibrate enable */
363extern int	allow_panic;		/* allow panic correction */
364extern int	mode_ntpdate;		/* exit on first clock set */
365extern int	peer_ntpdate;		/* count of ntpdate peers */
366extern int	mode_wakeup;		/* set clock on next receive */
367extern u_long wake_timer;		/* left on until a transmit succeeds */
368
369/*
370 * Clock state machine variables
371 */
372extern u_char	sys_poll;		/* system poll interval (log2 s) */
373extern int	state;			/* clock discipline state */
374extern int	tc_counter;		/* poll-adjust counter */
375extern u_long	last_time;		/* time of last clock update (s) */
376extern double	last_offset;		/* last clock offset (s) */
377extern u_char	allan_xpt;		/* Allan intercept (log2 s) */
378extern double	clock_jitter;		/* clock jitter (s) */
379extern double	sys_offset;		/* system offset (s) */
380extern double	sys_jitter;		/* system jitter (s) */
381
382/* ntp_monitor.c */
383extern struct mon_data mon_mru_list;
384extern struct mon_data mon_fifo_list;
385extern int	mon_enabled;
386
387/* ntp_peer.c */
388extern struct peer *peer_hash[];	/* peer hash table */
389extern int	peer_hash_count[];	/* count of peers in each bucket */
390extern struct peer *assoc_hash[];	/* association ID hash table */
391extern int	assoc_hash_count[];
392extern int	peer_free_count;
393
394/*
395 * Miscellaneous statistic counters which may be queried.
396 */
397extern u_long	peer_timereset;		/* time stat counters were zeroed */
398extern u_long	findpeer_calls;		/* number of calls to findpeer */
399extern u_long	assocpeer_calls;	/* number of calls to findpeerbyassoc */
400extern u_long	peer_allocations;	/* number of allocations from the free list */
401extern u_long	peer_demobilizations;	/* number of structs freed to free list */
402extern int	total_peer_structs;	/* number of peer structs in circulation */
403extern int	peer_associations;	/* mobilized associations */
404extern int	peer_preempt;		/* preemptable associations */
405/* ntp_proto.c */
406/*
407 * System variables are declared here.	See Section 3.2 of the
408 * specification.
409 */
410extern u_char	sys_leap;		/* system leap indicator */
411extern u_char	sys_stratum;		/* system stratum */
412extern s_char	sys_precision;		/* local clock precision */
413extern double	sys_rootdelay;		/* roundtrip delay to primary source */
414extern double	sys_rootdisp;		/* dispersion to primary source */
415extern u_int32	sys_refid;		/* reference id */
416extern l_fp	sys_reftime;		/* last update time */
417extern struct peer *sys_peer;		/* current peer */
418
419/*
420 * Nonspecified system state variables.
421 */
422extern int	sys_bclient;		/* we set our time to broadcasts */
423extern double	sys_bdelay; 		/* broadcast client default delay */
424extern int	sys_authenticate;	/* requre authentication for config */
425extern l_fp	sys_authdelay;		/* authentication delay */
426extern keyid_t	sys_private;		/* private value for session seed */
427extern int	sys_manycastserver;	/* respond to manycast client pkts */
428extern int	sys_minclock;		/* minimum survivors */
429extern int	sys_minsane;		/* minimum candidates */
430extern int	sys_floor;		/* cluster stratum floor */
431extern int	sys_ceiling;		/* cluster stratum ceiling */
432extern u_char	sys_ttl[MAX_TTL];	/* ttl mapping vector */
433extern int	sys_ttlmax;		/* max ttl mapping vector index */
434
435/*
436 * Statistics counters
437 */
438extern u_long	sys_stattime;		/* time since reset */
439extern u_long	sys_received;		/* packets received */
440extern u_long	sys_processed;		/* packets for this host */
441extern u_long	sys_restricted;	 	/* restricted packets */
442extern u_long	sys_newversion;		/* current version  */
443extern u_long	sys_oldversion;		/* old version */
444extern u_long	sys_restricted;		/* access denied */
445extern u_long	sys_badlength;		/* bad length or format */
446extern u_long	sys_badauth;		/* bad authentication */
447extern u_long	sys_declined;		/* declined */
448extern u_long	sys_limitrejected;	/* rate exceeded */
449extern u_long	sys_kodsent;		/* KoD sent */
450
451/* ntp_refclock.c */
452#ifdef REFCLOCK
453#ifdef PPS
454extern int	fdpps;			/* pps file descriptor */
455#endif /* PPS */
456#endif
457
458/* ntp_request.c */
459extern keyid_t	info_auth_keyid;	/* keyid used to authenticate requests */
460
461/* ntp_restrict.c */
462extern struct restrictlist *restrictlist; /* the ipv4 restriction list */
463extern struct restrictlist6 *restrictlist6; /* the ipv6 restriction list */
464extern int	ntp_minpkt;
465extern int	ntp_minpoll;
466extern int	mon_age;		/* monitor preempt age */
467
468/* ntp_timer.c */
469extern volatile int alarm_flag;		/* alarm flag */
470extern volatile u_long alarm_overflow;
471extern u_long	current_time;		/* current time (s) */
472extern u_long	dns_timer;
473extern u_long	awake_timer;
474extern u_long	timer_timereset;
475extern u_long	timer_overflows;
476extern u_long	timer_xmtcalls;
477
478/* ntp_util.c */
479extern int	stats_control;		/* write stats to fileset? */
480extern int	stats_write_period;	/* # of seconds between writes. */
481extern double	stats_write_tolerance;
482
483/* ntpd.c */
484extern volatile int debug;		/* debugging flag */
485extern int	nofork;			/* no-fork flag */
486extern int 	initializing;		/* initializing flag */
487#ifdef HAVE_DROPROOT
488extern int droproot;			/* flag: try to drop root privileges after startup */
489extern char *user;			/* user to switch to */
490extern char *group;			/* group to switch to */
491extern const char *chrootdir;		/* directory to chroot to */
492#endif
493
494/* refclock_conf.c */
495#ifdef REFCLOCK
496extern struct refclock *refclock_conf[]; /* refclock configuration table */
497extern u_char	num_refclock_conf;
498#endif
499
500/* ntp_signd.c */
501#ifdef HAVE_NTP_SIGND
502extern void
503send_via_ntp_signd(
504	struct recvbuf *rbufp,	/* receive packet pointer */
505	int	xmode,
506	keyid_t	xkeyid,
507	int flags,
508	struct pkt  *xpkt
509	);
510#endif
511