xref: /freebsd/contrib/ntp/include/ntp_refclock.h (revision a466cc55)
1 /*
2  * ntp_refclock.h - definitions for reference clock support
3  */
4 
5 #ifndef NTP_REFCLOCK_H
6 #define NTP_REFCLOCK_H
7 
8 #if defined(HAVE_SYS_MODEM_H)
9 #include <sys/modem.h>
10 #endif
11 
12 #include "ntp_types.h"
13 #include "ntp_tty.h"
14 #include "recvbuff.h"
15 
16 
17 /*
18  * Macros to determine the clock type and unit numbers from a
19  * 127.127.t.u address
20  */
21 #define	REFCLOCKTYPE(srcadr)	((SRCADR(srcadr) >> 8) & 0xff)
22 #define REFCLOCKUNIT(srcadr)	(SRCADR(srcadr) & 0xff)
23 
24 /*
25  * List of reference clock names and descriptions. These must agree with
26  * lib/clocktypes.c and ntpd/refclock_conf.c.
27  */
28 struct clktype {
29 	int code;		/* driver "major" number */
30 	const char *clocktype;	/* long description */
31 	const char *abbrev;	/* short description */
32 };
33 extern struct clktype clktypes[];
34 
35 /*
36  * Configuration flag values
37  */
38 #define	CLK_HAVETIME1	0x1
39 #define	CLK_HAVETIME2	0x2
40 #define	CLK_HAVEVAL1	0x4
41 #define	CLK_HAVEVAL2	0x8
42 
43 #define	CLK_FLAG1	0x1
44 #define	CLK_FLAG2	0x2
45 #define	CLK_FLAG3	0x4
46 #define	CLK_FLAG4	0x8
47 
48 #define	CLK_HAVEFLAG1	0x10
49 #define	CLK_HAVEFLAG2	0x20
50 #define	CLK_HAVEFLAG3	0x40
51 #define	CLK_HAVEFLAG4	0x80
52 #define	CLK_HAVEMINJIT	0x100
53 
54 /*
55  * Constant for disabling event reporting in
56  * refclock_receive. ORed in leap
57  * parameter
58  */
59 #define REFCLOCK_OWN_STATES	0x80
60 
61 /*
62  * Structure for returning clock status
63  */
64 struct refclockstat {
65 	u_char	type;		/* clock type */
66 	u_char	flags;		/* clock flags */
67 	u_short	haveflags;	/* bit array of valid flags */
68 	u_short	lencode;	/* length of last timecode */
69 	const char *p_lastcode;	/* last timecode received */
70 	u_int32	polls;		/* transmit polls */
71 	u_int32	noresponse;	/* no response to poll */
72 	u_int32	badformat;	/* bad format timecode received */
73 	u_int32	baddata;	/* invalid data timecode received */
74 	u_int32	timereset;	/* driver resets */
75 	const char *clockdesc;	/* ASCII description */
76 	double	fudgeminjitter;	/* configure fudge minjitter */
77 	double	fudgetime1;	/* configure fudge time1 */
78 	double	fudgetime2;	/* configure fudge time2 */
79 	int32	fudgeval1;	/* configure fudge value1 */
80 	u_int32	fudgeval2;	/* configure fudge value2 */
81 	u_char	currentstatus;	/* clock status */
82 	u_char	lastevent;	/* last exception event */
83 	u_char	leap;		/* leap bits */
84 	struct	ctl_var *kv_list; /* additional variables */
85 };
86 
87 /*
88  * Reference clock I/O structure.  Used to provide an interface between
89  * the reference clock drivers and the I/O module.
90  */
91 struct refclockio {
92 	struct	refclockio *next; /* link to next structure */
93 	void	(*clock_recv) (struct recvbuf *); /* completion routine */
94 	int 	(*io_input)   (struct recvbuf *); /* input routine -
95 				to avoid excessive buffer use
96 				due to small bursts
97 				of refclock input data */
98 	struct peer *srcclock;	/* refclock peer */
99 	int	datalen;	/* length of data */
100 	int	fd;		/* file descriptor */
101 	u_long	recvcount;	/* count of receive completions */
102 	int	active;		/* nonzero when in use */
103 
104 #ifdef HAVE_IO_COMPLETION_PORT
105 	void *	ioreg_ctx;	/* IO registration context */
106 	void *	device_ctx;	/* device-related data for i/o subsystem */
107 #endif
108 };
109 
110 /*
111  * Structure for returning debugging info
112  */
113 #define	NCLKBUGVALUES	16
114 #define	NCLKBUGTIMES	32
115 
116 struct refclockbug {
117 	u_char	nvalues;	/* values following */
118 	u_char	ntimes;		/* times following */
119 	u_short	svalues;	/* values format sign array */
120 	u_int32	stimes;		/* times format sign array */
121 	u_int32	values[NCLKBUGVALUES]; /* real values */
122 	l_fp	times[NCLKBUGTIMES]; /* real times */
123 };
124 
125 #ifdef HAVE_IO_COMPLETION_PORT
126 extern	HANDLE	WaitableIoEventHandle;
127 #endif
128 
129 /*
130  * Structure interface between the reference clock support
131  * ntp_refclock.c and the driver utility routines
132  */
133 #define MAXSTAGE	64	/* max median filter stages  */
134 #define NSTAGE		5	/* default median filter stages */
135 #define BMAX		128	/* max timecode length */
136 #define GMT		0	/* I hope nobody sees this */
137 #define MAXDIAL		60	/* max length of modem dial strings */
138 
139 struct refclockproc {
140 	void *	unitptr;	/* pointer to unit structure */
141 	struct refclock * conf;	/* refclock_conf[type] */
142 	struct refclockio io;	/* I/O handler structure */
143 	u_char	leap;		/* leap/synchronization code */
144 	u_char	currentstatus;	/* clock status */
145 	u_char	lastevent;	/* last exception event */
146 	u_char	type;		/* clock type */
147 	u_char	inpoll;		/* waiting for 'refclock_receive()' */
148 	const char *clockdesc;	/* clock description */
149 	u_long	nextaction;	/* local activity timeout */
150 	void	(*action)(struct peer *); /* timeout callback */
151 
152 	char	a_lastcode[BMAX]; /* last timecode received */
153 	int	lencode;	/* length of last timecode */
154 
155 	int	year;		/* year of eternity */
156 	int	day;		/* day of year */
157 	int	hour;		/* hour of day */
158 	int	minute;		/* minute of hour */
159 	int	second;		/* second of minute */
160 	long	nsec;		/* nanosecond of second */
161 	u_long	yearstart;	/* beginning of year */
162 	u_int	coderecv;	/* put pointer */
163 	u_int	codeproc;	/* get pointer */
164 	l_fp	lastref;	/* reference timestamp */
165 	l_fp	lastrec;	/* receive timestamp */
166 	double	offset;		/* mean offset */
167 	double	disp;		/* sample dispersion */
168 	double	jitter;		/* jitter (mean squares) */
169 	double	filter[MAXSTAGE]; /* median filter */
170 
171 	/*
172 	 * Configuration data
173 	 */
174 	double	fudgetime1;	/* fudge time1 */
175 	double	fudgetime2;	/* fudge time2 */
176 	double	fudgeminjitter;	/* manually set lower bound for jitter */
177 	u_char	stratum;	/* server stratum */
178 	u_int32	refid;		/* reference identifier */
179 	u_char	sloppyclockflag; /* fudge flags */
180 
181 	/*
182 	 * Status tallies
183  	 */
184 	u_long	timestarted;	/* time we started this */
185 	u_long	polls;		/* polls sent */
186 	u_long	noreply;	/* no replies to polls */
187 	u_long	badformat;	/* bad format reply */
188 	u_long	baddata;	/* bad data reply */
189 };
190 
191 /*
192  * Structure interface between the reference clock support
193  * ntp_refclock.c and particular clock drivers. This must agree with the
194  * structure defined in the driver.
195  */
196 #define	noentry	0		/* flag for null routine */
197 #define	NOFLAGS	0		/* flag for null flags */
198 
199 struct refclock {
200 	int (*clock_start)	(int, struct peer *);
201 	void (*clock_shutdown)	(int, struct peer *);
202 	void (*clock_poll)	(int, struct peer *);
203 	void (*clock_control)	(int, const struct refclockstat *,
204 				 struct refclockstat *, struct peer *);
205 	void (*clock_init)	(void);
206 	void (*clock_buginfo)	(int, struct refclockbug *, struct peer *);
207 	void (*clock_timer)	(int, struct peer *);
208 };
209 
210 /*
211  * Function prototypes
212  */
213 extern	int	io_addclock	(struct refclockio *);
214 extern	void	io_closeclock	(struct refclockio *);
215 
216 #define FDWRITE_ERROR	((size_t)-1)
217 
218 #ifdef REFCLOCK
219 extern	void	refclock_buginfo(sockaddr_u *,
220 				 struct refclockbug *);
221 extern	void	refclock_control(sockaddr_u *,
222 				 const struct refclockstat *,
223 				 struct refclockstat *);
224 extern	int	refclock_open	(const sockaddr_u *srcadr, const char *, u_int, u_int);
225 extern	int	refclock_setup	(int, u_int, u_int);
226 extern	void	refclock_timer	(struct peer *);
227 extern	void	refclock_transmit(struct peer *);
228 extern 	int	refclock_process(struct refclockproc *);
229 extern 	int	refclock_process_f(struct refclockproc *, double);
230 extern 	void	refclock_process_offset(struct refclockproc *, l_fp,
231 					l_fp, double);
232 extern	int	refclock_samples_avail(struct refclockproc const *);
233 extern	int	refclock_samples_expire(struct refclockproc *, int);
234 extern	void	refclock_report	(struct peer *, int);
235 extern	int	refclock_gtlin	(struct recvbuf *, char *, int, l_fp *);
236 extern	int	refclock_gtraw	(struct recvbuf *, char *, int, l_fp *);
237 extern	size_t	refclock_write  (const struct peer *, const void *, size_t,
238 				 const char * what);
239 extern	size_t	refclock_fdwrite(const struct peer *, int, const void *, size_t,
240 				 const char * what);
241 extern	int	indicate_refclock_packet(struct refclockio *,
242 					 struct recvbuf *);
243 extern	void	process_refclock_packet(struct recvbuf *);
244 
245 /* save string as la_code, size==(size_t)-1 ==> ASCIIZ string */
246 extern	void	refclock_save_lcode(
247 			struct refclockproc *, char const *, size_t);
248 /* format data into la_code */
249 extern	void	refclock_format_lcode(
250 			struct refclockproc *, char const *, ...);
251 extern	void	refclock_vformat_lcode(
252 			struct refclockproc *, char const *, va_list);
253 
254 struct refclock_atom;
255 extern int	refclock_ppsaugment(
256     const struct refclock_atom*, l_fp *rcvtime ,
257     double rcvfudge, double ppsfudge);
258 
259 extern int ppsdev_reopen(const sockaddr_u *srcadr,
260 			 int ttyfd, int ppsfd, const char *ppspath,
261 			 int mode, int flags);
262 extern void ppsdev_close(int ttyfd, int ppsfd);
263 
264 #endif /* REFCLOCK */
265 
266 #endif /* NTP_REFCLOCK_H */
267