]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/ntp/include/ntp_refclock.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / ntp / include / ntp_refclock.h
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 */