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