ntp_refclock.h revision 298699
138136Sdfr/*
238136Sdfr * ntp_refclock.h - definitions for reference clock support
338136Sdfr */
438136Sdfr
538136Sdfr#ifndef NTP_REFCLOCK_H
638136Sdfr#define NTP_REFCLOCK_H
738136Sdfr
838136Sdfr#if defined(HAVE_SYS_MODEM_H)
938136Sdfr#include <sys/modem.h>
1038136Sdfr#endif
1138136Sdfr
1238136Sdfr#include "ntp_types.h"
1338136Sdfr#include "ntp_tty.h"
1438136Sdfr#include "recvbuff.h"
1538136Sdfr
1638136Sdfr
1738136Sdfr#define SAMPLE(x)	pp->coderecv = (pp->coderecv + 1) % MAXSTAGE; \
1838136Sdfr			pp->filter[pp->coderecv] = (x); \
1938136Sdfr			if (pp->coderecv == pp->codeproc) \
2038136Sdfr				pp->codeproc = (pp->codeproc + 1) % MAXSTAGE;
2138136Sdfr
2238136Sdfr/*
2338136Sdfr * Macros to determine the clock type and unit numbers from a
2438136Sdfr * 127.127.t.u address
2538136Sdfr */
2638136Sdfr#define	REFCLOCKTYPE(srcadr)	((SRCADR(srcadr) >> 8) & 0xff)
2738136Sdfr#define REFCLOCKUNIT(srcadr)	(SRCADR(srcadr) & 0xff)
2838136Sdfr
2938136Sdfr/*
3038136Sdfr * List of reference clock names and descriptions. These must agree with
3138136Sdfr * lib/clocktypes.c and ntpd/refclock_conf.c.
3238136Sdfr */
3350477Speterstruct clktype {
3438136Sdfr	int code;		/* driver "major" number */
3538136Sdfr	const char *clocktype;	/* long description */
3638136Sdfr	const char *abbrev;	/* short description */
37110231Snyan};
3838136Sdfrextern struct clktype clktypes[];
3938136Sdfr
4047613Sdfr/*
4147613Sdfr * Configuration flag values
4238136Sdfr */
4338136Sdfr#define	CLK_HAVETIME1	0x1
4438136Sdfr#define	CLK_HAVETIME2	0x2
4538136Sdfr#define	CLK_HAVEVAL1	0x4
4638136Sdfr#define	CLK_HAVEVAL2	0x8
4738136Sdfr
4838136Sdfr#define	CLK_FLAG1	0x1
4938136Sdfr#define	CLK_FLAG2	0x2
5038136Sdfr#define	CLK_FLAG3	0x4
5138136Sdfr#define	CLK_FLAG4	0x8
5238136Sdfr
5338136Sdfr#define	CLK_HAVEFLAG1	0x10
5438136Sdfr#define	CLK_HAVEFLAG2	0x20
5538136Sdfr#define	CLK_HAVEFLAG3	0x40
5638136Sdfr#define	CLK_HAVEFLAG4	0x80
5738136Sdfr
5838136Sdfr/*
5938136Sdfr * Constant for disabling event reporting in
6038136Sdfr * refclock_receive. ORed in leap
6138136Sdfr * parameter
6238136Sdfr */
6338136Sdfr#define REFCLOCK_OWN_STATES	0x80
6438136Sdfr
6538136Sdfr/*
6638136Sdfr * Structure for returning clock status
6738136Sdfr */
6838136Sdfrstruct refclockstat {
6938136Sdfr	u_char	type;		/* clock type */
7038136Sdfr	u_char	flags;		/* clock flags */
7138136Sdfr	u_char	haveflags;	/* bit array of valid flags */
7238136Sdfr	u_short	lencode;	/* length of last timecode */
7338136Sdfr	const char *p_lastcode;	/* last timecode received */
7438136Sdfr	u_int32	polls;		/* transmit polls */
7538136Sdfr	u_int32	noresponse;	/* no response to poll */
7638136Sdfr	u_int32	badformat;	/* bad format timecode received */
7738136Sdfr	u_int32	baddata;	/* invalid data timecode received */
7838136Sdfr	u_int32	timereset;	/* driver resets */
7938136Sdfr	const char *clockdesc;	/* ASCII description */
8038136Sdfr	double	fudgetime1;	/* configure fudge time1 */
8138136Sdfr	double	fudgetime2;	/* configure fudge time2 */
8238136Sdfr	int32	fudgeval1;	/* configure fudge value1 */
8338136Sdfr	u_int32	fudgeval2;	/* configure fudge value2 */
8438136Sdfr	u_char	currentstatus;	/* clock status */
8538136Sdfr	u_char	lastevent;	/* last exception event */
8638136Sdfr	u_char	leap;		/* leap bits */
8738136Sdfr	struct	ctl_var *kv_list; /* additional variables */
8838136Sdfr};
8938136Sdfr
9038136Sdfr/*
9138136Sdfr * Reference clock I/O structure.  Used to provide an interface between
9238136Sdfr * the reference clock drivers and the I/O module.
9338136Sdfr */
9438136Sdfrstruct refclockio {
9538136Sdfr	struct	refclockio *next; /* link to next structure */
9638136Sdfr	void	(*clock_recv) (struct recvbuf *); /* completion routine */
9738136Sdfr	int 	(*io_input)   (struct recvbuf *); /* input routine -
9838136Sdfr				to avoid excessive buffer use
9938136Sdfr				due to small bursts
10038136Sdfr				of refclock input data */
10138136Sdfr	struct peer *srcclock;	/* refclock peer */
10238136Sdfr	int	datalen;	/* length of data */
10338136Sdfr	int	fd;		/* file descriptor */
10438136Sdfr	u_long	recvcount;	/* count of receive completions */
10538136Sdfr	int	active;		/* nonzero when in use */
10638136Sdfr
10738136Sdfr#ifdef HAVE_IO_COMPLETION_PORT
10838136Sdfr	void *	ioreg_ctx;	/* IO registration context */
10938136Sdfr	void *	device_ctx;	/* device-related data for i/o subsystem */
11038136Sdfr#endif
11138136Sdfr};
11238136Sdfr
11338136Sdfr/*
11438136Sdfr * Structure for returning debugging info
11538136Sdfr */
11638136Sdfr#define	NCLKBUGVALUES	16
11738136Sdfr#define	NCLKBUGTIMES	32
11838136Sdfr
11938136Sdfrstruct refclockbug {
12038136Sdfr	u_char	nvalues;	/* values following */
12138136Sdfr	u_char	ntimes;		/* times following */
12238136Sdfr	u_short	svalues;	/* values format sign array */
12338136Sdfr	u_int32	stimes;		/* times format sign array */
12438136Sdfr	u_int32	values[NCLKBUGVALUES]; /* real values */
12538136Sdfr	l_fp	times[NCLKBUGTIMES]; /* real times */
12638136Sdfr};
12738136Sdfr
12838136Sdfr#ifdef HAVE_IO_COMPLETION_PORT
12938136Sdfrextern	HANDLE	WaitableIoEventHandle;
13038136Sdfr#endif
13138136Sdfr
13238136Sdfr/*
13338136Sdfr * Structure interface between the reference clock support
13438136Sdfr * ntp_refclock.c and the driver utility routines
13538136Sdfr */
13638136Sdfr#define MAXSTAGE	60	/* max median filter stages  */
13738136Sdfr#define NSTAGE		5	/* default median filter stages */
13838136Sdfr#define BMAX		128	/* max timecode length */
13942333Syokota#define GMT		0	/* I hope nobody sees this */
14038136Sdfr#define MAXDIAL		60	/* max length of modem dial strings */
14138136Sdfr
14238136Sdfr
14338136Sdfrstruct refclockproc {
14438136Sdfr	void *	unitptr;	/* pointer to unit structure */
14538136Sdfr	struct refclock * conf;	/* refclock_conf[type] */
14660544Sdfr	struct refclockio io;	/* I/O handler structure */
14760544Sdfr	u_char	leap;		/* leap/synchronization code */
14860544Sdfr	u_char	currentstatus;	/* clock status */
14960544Sdfr	u_char	lastevent;	/* last exception event */
15060544Sdfr	u_char	type;		/* clock type */
15160544Sdfr	const char *clockdesc;	/* clock description */
15260544Sdfr	u_long	nextaction;	/* local activity timeout */
15363403Sdfr	void	(*action)(struct peer *); /* timeout callback */
15463403Sdfr
15560544Sdfr	char	a_lastcode[BMAX]; /* last timecode received */
15642333Syokota	int	lencode;	/* length of last timecode */
15738136Sdfr
15842333Syokota	int	year;		/* year of eternity */
15938136Sdfr	int	day;		/* day of year */
16038136Sdfr	int	hour;		/* hour of day */
16138136Sdfr	int	minute;		/* minute of hour */
16238136Sdfr	int	second;		/* second of minute */
16338136Sdfr	long	nsec;		/* nanosecond of second */
16438136Sdfr	u_long	yearstart;	/* beginning of year */
16538136Sdfr	int	coderecv;	/* put pointer */
16638136Sdfr	int	codeproc;	/* get pointer */
16738136Sdfr	l_fp	lastref;	/* reference timestamp */
16838136Sdfr	l_fp	lastrec;	/* receive timestamp */
16938136Sdfr	double	offset;		/* mean offset */
17038136Sdfr	double	disp;		/* sample dispersion */
17138136Sdfr	double	jitter;		/* jitter (mean squares) */
17238136Sdfr	double	filter[MAXSTAGE]; /* median filter */
17338136Sdfr
17438136Sdfr	/*
17538136Sdfr	 * Configuration data
17638136Sdfr	 */
17738136Sdfr	double	fudgetime1;	/* fudge time1 */
17838136Sdfr	double	fudgetime2;	/* fudge time2 */
17938136Sdfr	u_char	stratum;	/* server stratum */
18038136Sdfr	u_int32	refid;		/* reference identifier */
18138136Sdfr	u_char	sloppyclockflag; /* fudge flags */
18238136Sdfr
18338136Sdfr	/*
18447613Sdfr	 * Status tallies
185 	 */
186	u_long	timestarted;	/* time we started this */
187	u_long	polls;		/* polls sent */
188	u_long	noreply;	/* no replies to polls */
189	u_long	badformat;	/* bad format reply */
190	u_long	baddata;	/* bad data reply */
191};
192
193/*
194 * Structure interface between the reference clock support
195 * ntp_refclock.c and particular clock drivers. This must agree with the
196 * structure defined in the driver.
197 */
198#define	noentry	0		/* flag for null routine */
199#define	NOFLAGS	0		/* flag for null flags */
200
201struct refclock {
202	int (*clock_start)	(int, struct peer *);
203	void (*clock_shutdown)	(int, struct peer *);
204	void (*clock_poll)	(int, struct peer *);
205	void (*clock_control)	(int, const struct refclockstat *,
206				 struct refclockstat *, struct peer *);
207	void (*clock_init)	(void);
208	void (*clock_buginfo)	(int, struct refclockbug *, struct peer *);
209	void (*clock_timer)	(int, struct peer *);
210};
211
212/*
213 * Function prototypes
214 */
215extern	int	io_addclock	(struct refclockio *);
216extern	void	io_closeclock	(struct refclockio *);
217
218#ifdef REFCLOCK
219extern	void	refclock_buginfo(sockaddr_u *,
220				 struct refclockbug *);
221extern	void	refclock_control(sockaddr_u *,
222				 const struct refclockstat *,
223				 struct refclockstat *);
224extern	int	refclock_open	(const char *, u_int, u_int);
225extern	int	refclock_setup	(int, u_int, u_int);
226extern	void	refclock_timer	(struct peer *);
227extern	void	refclock_transmit(struct peer *);
228extern 	int	refclock_process(struct refclockproc *);
229extern 	int	refclock_process_f(struct refclockproc *, double);
230extern 	void	refclock_process_offset(struct refclockproc *, l_fp,
231					l_fp, double);
232extern	void	refclock_report	(struct peer *, int);
233extern	int	refclock_gtlin	(struct recvbuf *, char *, int, l_fp *);
234extern	int	refclock_gtraw	(struct recvbuf *, char *, int, l_fp *);
235extern	int	indicate_refclock_packet(struct refclockio *,
236					 struct recvbuf *);
237extern	void	process_refclock_packet(struct recvbuf *);
238#endif /* REFCLOCK */
239
240#endif /* NTP_REFCLOCK_H */
241