2 * ntp_refclock.h - definitions for reference clock support
10 #if defined(HAVE_BSD_TTYS)
12 #endif /* HAVE_BSD_TTYS */
14 #if defined(HAVE_SYSV_TTYS)
16 #endif /* HAVE_SYSV_TTYS */
18 #if defined(HAVE_TERMIOS)
19 # ifdef TERMIOS_NEEDS__SVID3
23 # ifdef TERMIOS_NEEDS__SVID3
28 #if defined(HAVE_SYS_MODEM_H)
29 #include <sys/modem.h>
32 #if 0 /* If you need that, include ntp_io.h instead */
35 #if defined(CLK) /* This is never defined, except perhaps by a system header file */
36 #include <sys/clkdefs.h>
43 #if !defined(SYSV_TTYS) && !defined(STREAM) & !defined(BSD_TTYS)
45 #endif /* SYSV_TTYS STREAM BSD_TTYS */
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;
53 * Macros to determine the clock type and unit numbers from a
56 #define REFCLOCKTYPE(srcadr) ((SRCADR(srcadr) >> 8) & 0xff)
57 #define REFCLOCKUNIT(srcadr) (SRCADR(srcadr) & 0xff)
60 * List of reference clock names and descriptions. These must agree with
61 * lib/clocktypes.c and ntpd/refclock_conf.c.
64 int code; /* driver "major" number */
65 const char *clocktype; /* long description */
66 const char *abbrev; /* short description */
68 extern struct clktype clktypes[];
71 * Configuration flag values
73 #define CLK_HAVETIME1 0x1
74 #define CLK_HAVETIME2 0x2
75 #define CLK_HAVEVAL1 0x4
76 #define CLK_HAVEVAL2 0x8
83 #define CLK_HAVEFLAG1 0x10
84 #define CLK_HAVEFLAG2 0x20
85 #define CLK_HAVEFLAG3 0x40
86 #define CLK_HAVEFLAG4 0x80
89 * Constant for disabling event reporting in
90 * refclock_receive. ORed in leap
93 #define REFCLOCK_OWN_STATES 0x80
96 * Structure for returning clock status
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 */
121 * Reference clock I/O structure. Used to provide an interface between
122 * the reference clock drivers and the I/O module.
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
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 */
138 * Structure for returning debugging info
140 #define NCLKBUGVALUES 16
141 #define NCLKBUGTIMES 32
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 */
153 * Structure interface between the reference clock support
154 * ntp_refclock.c and the driver utility routines
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 */
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.
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 */
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 */
187 char a_lastcode[BMAX]; /* last timecode received */
188 u_short lencode; /* length of last timecode */
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 */
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 */
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 */
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.
230 #define noentry 0 /* flag for null routine */
231 #define NOFLAGS 0 /* flag for null flags */
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 *));
245 * Function prototypes
248 * auxiliary PPS interface (implemented by refclock_atom())
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 *));
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 */
273 #endif /* NTP_REFCLOCK_H */