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