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 */ 274