xref: /freebsd/contrib/ntp/include/ntp_refclock.h (revision 38f0b757fd84d17d0fc24739a7cda160c4516d81)
1 /*
2  * ntp_refclock.h - definitions for reference clock support
3  */
4 
5 #ifndef NTP_REFCLOCK_H
6 #define NTP_REFCLOCK_H
7 
8 #include "ntp_types.h"
9 
10 #if defined(HAVE_BSD_TTYS)
11 #include <sgtty.h>
12 #endif /* HAVE_BSD_TTYS */
13 
14 #if defined(HAVE_SYSV_TTYS)
15 #include <termio.h>
16 #endif /* HAVE_SYSV_TTYS */
17 
18 #if defined(HAVE_TERMIOS)
19 # ifdef TERMIOS_NEEDS__SVID3
20 #  define _SVID3
21 # endif
22 # include <termios.h>
23 # ifdef TERMIOS_NEEDS__SVID3
24 #  undef _SVID3
25 # endif
26 #endif
27 
28 #if defined(HAVE_SYS_MODEM_H)
29 #include <sys/modem.h>
30 #endif
31 
32 #if 0 /* If you need that, include ntp_io.h instead */
33 #if defined(STREAM)
34 #include <stropts.h>
35 #if defined(CLK) /* This is never defined, except perhaps by a system header file */
36 #include <sys/clkdefs.h>
37 #endif /* CLK */
38 #endif /* STREAM */
39 #endif
40 
41 #include "recvbuff.h"
42 
43 #if !defined(SYSV_TTYS) && !defined(STREAM) & !defined(BSD_TTYS)
44 #define BSD_TTYS
45 #endif /* SYSV_TTYS STREAM BSD_TTYS */
46 
47 #define SAMPLE(x)	pp->coderecv = (pp->coderecv + 1) % MAXSTAGE; \
48 			pp->filter[pp->coderecv] = (x); \
49 			if (pp->coderecv == pp->codeproc) \
50 				pp->codeproc = (pp->codeproc + 1) % MAXSTAGE;
51 
52 /*
53  * Macros to determine the clock type and unit numbers from a
54  * 127.127.t.u address
55  */
56 #define	REFCLOCKTYPE(srcadr)	((SRCADR(srcadr) >> 8) & 0xff)
57 #define REFCLOCKUNIT(srcadr)	(SRCADR(srcadr) & 0xff)
58 
59 /*
60  * List of reference clock names and descriptions. These must agree with
61  * lib/clocktypes.c and ntpd/refclock_conf.c.
62  */
63 struct clktype {
64 	int code;		/* driver "major" number */
65 	const char *clocktype;	/* long description */
66 	const char *abbrev;	/* short description */
67 };
68 extern struct clktype clktypes[];
69 
70 /*
71  * Configuration flag values
72  */
73 #define	CLK_HAVETIME1	0x1
74 #define	CLK_HAVETIME2	0x2
75 #define	CLK_HAVEVAL1	0x4
76 #define	CLK_HAVEVAL2	0x8
77 
78 #define	CLK_FLAG1	0x1
79 #define	CLK_FLAG2	0x2
80 #define	CLK_FLAG3	0x4
81 #define	CLK_FLAG4	0x8
82 
83 #define	CLK_HAVEFLAG1	0x10
84 #define	CLK_HAVEFLAG2	0x20
85 #define	CLK_HAVEFLAG3	0x40
86 #define	CLK_HAVEFLAG4	0x80
87 
88 /*
89  * Constant for disabling event reporting in
90  * refclock_receive. ORed in leap
91  * parameter
92  */
93 #define REFCLOCK_OWN_STATES	0x80
94 
95 /*
96  * Structure for returning clock status
97  */
98 struct refclockstat {
99 	u_char	type;		/* clock type */
100 	u_char	flags;		/* clock flags */
101 	u_char	haveflags;	/* bit array of valid flags */
102 	u_short	lencode;	/* length of last timecode */
103 	const char *p_lastcode;	/* last timecode received */
104 	u_int32	polls;		/* transmit polls */
105 	u_int32	noresponse;	/* no response to poll */
106 	u_int32	badformat;	/* bad format timecode received */
107 	u_int32	baddata;	/* invalid data timecode received */
108 	u_int32	timereset;	/* driver resets */
109 	const char *clockdesc;	/* ASCII description */
110 	double	fudgetime1;	/* configure fudge time1 */
111 	double	fudgetime2;	/* configure fudge time2 */
112 	int32	fudgeval1;	/* configure fudge value1 */
113 	int32	fudgeval2;	/* configure fudge value2 */
114 	u_char	currentstatus;	/* clock status */
115 	u_char	lastevent;	/* last exception event */
116 	u_char	leap;		/* leap bits */
117 	struct	ctl_var *kv_list; /* additional variables */
118 };
119 
120 /*
121  * Reference clock I/O structure.  Used to provide an interface between
122  * the reference clock drivers and the I/O module.
123  */
124 struct refclockio {
125 	struct	refclockio *next; /* link to next structure */
126 	void	(*clock_recv) P((struct recvbuf *)); /* completion routine */
127 	int 	(*io_input)   P((struct recvbuf *)); /* input routine -
128 				to avoid excessive buffer use
129 				due to small bursts
130 				of refclock input data */
131 	caddr_t	srcclock;	/* pointer to clock structure */
132 	int	datalen;	/* lenth of data */
133 	SOCKET	fd;		/* file descriptor */
134 	u_long	recvcount;	/* count of receive completions */
135 };
136 
137 /*
138  * Structure for returning debugging info
139  */
140 #define	NCLKBUGVALUES	16
141 #define	NCLKBUGTIMES	32
142 
143 struct refclockbug {
144 	u_char	nvalues;	/* values following */
145 	u_char	ntimes;		/* times following */
146 	u_short	svalues;	/* values format sign array */
147 	u_int32	stimes;		/* times format sign array */
148 	u_int32	values[NCLKBUGVALUES]; /* real values */
149 	l_fp	times[NCLKBUGTIMES]; /* real times */
150 };
151 
152 /*
153  * Structure interface between the reference clock support
154  * ntp_refclock.c and the driver utility routines
155  */
156 #define MAXSTAGE	60	/* max median filter stages  */
157 #define NSTAGE		5	/* default median filter stages */
158 #define BMAX		128	/* max timecode length */
159 #define GMT		0	/* I hope nobody sees this */
160 #define MAXDIAL		60	/* max length of modem dial strings */
161 
162 /*
163  * Line discipline flags. These require line discipline or streams
164  * modules to be installed/loaded in the kernel. If specified, but not
165  * installed, the code runs as if unspecified.
166  */
167 #define LDISC_STD	0x00	/* standard */
168 #define LDISC_CLK	0x01	/* tty_clk \n intercept */
169 #define LDISC_CLKPPS	0x02	/* tty_clk \377 intercept */
170 #define LDISC_ACTS	0x04	/* tty_clk #* intercept */
171 #define LDISC_CHU	0x08	/* depredated */
172 #define LDISC_PPS	0x10	/* ppsclock, ppsapi */
173 #define LDISC_RAW	0x20	/* raw binary */
174 #define LDISC_ECHO	0x40	/* enable echo */
175 #define	LDISC_REMOTE	0x80	/* remote mode */
176 #define	LDISC_7O1      0x100    /* 7-bit, odd parity for Z3801A */
177 
178 struct refclockproc {
179 	struct	refclockio io;	/* I/O handler structure */
180 	caddr_t	unitptr;	/* pointer to unit structure */
181 	u_char	leap;		/* leap/synchronization code */
182 	u_char	currentstatus;	/* clock status */
183 	u_char	lastevent;	/* last exception event */
184 	u_char	type;		/* clock type */
185 	const char *clockdesc;	/* clock description */
186 
187 	char	a_lastcode[BMAX]; /* last timecode received */
188 	u_short	lencode;	/* length of last timecode */
189 
190 	int	year;		/* year of eternity */
191 	int	day;		/* day of year */
192 	int	hour;		/* hour of day */
193 	int	minute;		/* minute of hour */
194 	int	second;		/* second of minute */
195 	long	nsec;		/* nanosecond of second */
196 	u_long	yearstart;	/* beginning of year */
197 	int	coderecv;	/* put pointer */
198 	int	codeproc;	/* get pointer */
199 	l_fp	lastref;	/* reference timestamp */
200 	l_fp	lastrec;	/* receive timestamp */
201 	double	offset;		/* mean offset */
202 	double	disp;		/* sample dispersion */
203 	double	jitter;		/* jitter (mean squares) */
204 	double	filter[MAXSTAGE]; /* median filter */
205 
206 	/*
207 	 * Configuration data
208 	 */
209 	double	fudgetime1;	/* fudge time1 */
210 	double	fudgetime2;	/* fudge time2 */
211 	u_char	stratum;	/* server stratum */
212 	u_int32	refid;		/* reference identifier */
213 	u_char	sloppyclockflag; /* fudge flags */
214 
215 	/*
216 	 * Status tallies
217  	 */
218 	u_long	timestarted;	/* time we started this */
219 	u_long	polls;		/* polls sent */
220 	u_long	noreply;	/* no replies to polls */
221 	u_long	badformat;	/* bad format reply */
222 	u_long	baddata;	/* bad data reply */
223 };
224 
225 /*
226  * Structure interface between the reference clock support
227  * ntp_refclock.c and particular clock drivers. This must agree with the
228  * structure defined in the driver.
229  */
230 #define	noentry	0		/* flag for null routine */
231 #define	NOFLAGS	0		/* flag for null flags */
232 
233 struct refclock {
234 	int (*clock_start)	P((int, struct peer *));
235 	void (*clock_shutdown)	P((int, struct peer *));
236 	void (*clock_poll)	P((int, struct peer *));
237 	void (*clock_control)	P((int, struct refclockstat *,
238 				    struct refclockstat *, struct peer *));
239 	void (*clock_init)	P((void));
240 	void (*clock_buginfo)	P((int, struct refclockbug *, struct peer *));
241 	void (*clock_timer)	P((int, struct peer *));
242 };
243 
244 /*
245  * Function prototypes
246  */
247 /*
248  * auxiliary PPS interface (implemented by refclock_atom())
249  */
250 extern	int	pps_sample P((l_fp *));
251 extern	int	io_addclock_simple P((struct refclockio *));
252 extern	int	io_addclock	P((struct refclockio *));
253 extern	void	io_closeclock	P((struct refclockio *));
254 
255 #ifdef REFCLOCK
256 extern	void	refclock_buginfo P((struct sockaddr_storage *,
257 				    struct refclockbug *));
258 extern	void	refclock_control P((struct sockaddr_storage *,
259 				    struct refclockstat *,
260 				    struct refclockstat *));
261 extern	int	refclock_open	P((char *, u_int, u_int));
262 extern	int	refclock_setup	P((int, u_int, u_int));
263 extern	void	refclock_timer	P((struct peer *));
264 extern	void	refclock_transmit P((struct peer *));
265 extern	int	refclock_ioctl	P((int, u_int));
266 extern 	int	refclock_process P((struct refclockproc *));
267 extern 	void	refclock_process_offset P((struct refclockproc *, l_fp, l_fp, double));
268 extern	void	refclock_report	P((struct peer *, int));
269 extern	int	refclock_gtlin	P((struct recvbuf *, char *, int, l_fp *));
270 extern	int	refclock_gtraw  P((struct recvbuf *, char *, int, l_fp *));
271 #endif /* REFCLOCK */
272 
273 #endif /* NTP_REFCLOCK_H */
274