2 * ntp_refclock.h - definitions for reference clock support
8 #if defined(HAVE_SYS_MODEM_H)
12 #include "ntp_types.h"
18 * Macros to determine the clock type and unit numbers from a
21 #define REFCLOCKTYPE(srcadr) ((SRCADR(srcadr) >> 8) & 0xff)
22 #define REFCLOCKUNIT(srcadr) (SRCADR(srcadr) & 0xff)
25 * List of reference clock names and descriptions. These must agree with
26 * lib/clocktypes.c and ntpd/refclock_conf.c.
29 int code; /* driver "major" number */
30 const char *clocktype; /* long description */
31 const char *abbrev; /* short description */
33 extern struct clktype clktypes[];
36 * Configuration flag values
38 #define CLK_HAVETIME1 0x1
39 #define CLK_HAVETIME2 0x2
40 #define CLK_HAVEVAL1 0x4
41 #define CLK_HAVEVAL2 0x8
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
55 * Constant for disabling event reporting in
56 * refclock_receive. ORed in leap
59 #define REFCLOCK_OWN_STATES 0x80
62 * Structure for returning clock status
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 */
88 * Reference clock I/O structure. Used to provide an interface between
89 * the reference clock drivers and the I/O module.
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
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 */
104 #ifdef HAVE_IO_COMPLETION_PORT
105 void * ioreg_ctx; /* IO registration context */
106 void * device_ctx; /* device-related data for i/o subsystem */
111 * Structure for returning debugging info
113 #define NCLKBUGVALUES 16
114 #define NCLKBUGTIMES 32
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 */
125 #ifdef HAVE_IO_COMPLETION_PORT
126 extern HANDLE WaitableIoEventHandle;
130 * Structure interface between the reference clock support
131 * ntp_refclock.c and the driver utility routines
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 */
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 */
152 char a_lastcode[BMAX]; /* last timecode received */
153 int lencode; /* length of last timecode */
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 */
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 */
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 */
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.
196 #define noentry 0 /* flag for null routine */
197 #define NOFLAGS 0 /* flag for null flags */
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 *);
211 * Function prototypes
213 extern int io_addclock (struct refclockio *);
214 extern void io_closeclock (struct refclockio *);
217 extern void refclock_buginfo(sockaddr_u *,
218 struct refclockbug *);
219 extern void refclock_control(sockaddr_u *,
220 const struct refclockstat *,
221 struct refclockstat *);
222 extern int refclock_open (const char *, u_int, u_int);
223 extern int refclock_setup (int, u_int, u_int);
224 extern void refclock_timer (struct peer *);
225 extern void refclock_transmit(struct peer *);
226 extern int refclock_process(struct refclockproc *);
227 extern int refclock_process_f(struct refclockproc *, double);
228 extern void refclock_process_offset(struct refclockproc *, l_fp,
230 extern int refclock_samples_avail(struct refclockproc const *);
231 extern int refclock_samples_expire(struct refclockproc *, int);
232 extern void refclock_report (struct peer *, int);
233 extern int refclock_gtlin (struct recvbuf *, char *, int, l_fp *);
234 extern int refclock_gtraw (struct recvbuf *, char *, int, l_fp *);
235 extern int indicate_refclock_packet(struct refclockio *,
237 extern void process_refclock_packet(struct recvbuf *);
239 /* save string as la_code, size==(size_t)-1 ==> ASCIIZ string */
240 extern void refclock_save_lcode(
241 struct refclockproc *, char const *, size_t);
242 /* format data into la_code */
243 extern void refclock_format_lcode(
244 struct refclockproc *, char const *, ...);
245 extern void refclock_vformat_lcode(
246 struct refclockproc *, char const *, va_list);
248 struct refclock_atom;
249 extern int refclock_ppsaugment(
250 const struct refclock_atom*, l_fp *rcvtime ,
251 double rcvfudge, double ppsfudge);
253 #endif /* REFCLOCK */
255 #endif /* NTP_REFCLOCK_H */