ntp_refclock.h revision 298699
138136Sdfr/* 238136Sdfr * ntp_refclock.h - definitions for reference clock support 338136Sdfr */ 438136Sdfr 538136Sdfr#ifndef NTP_REFCLOCK_H 638136Sdfr#define NTP_REFCLOCK_H 738136Sdfr 838136Sdfr#if defined(HAVE_SYS_MODEM_H) 938136Sdfr#include <sys/modem.h> 1038136Sdfr#endif 1138136Sdfr 1238136Sdfr#include "ntp_types.h" 1338136Sdfr#include "ntp_tty.h" 1438136Sdfr#include "recvbuff.h" 1538136Sdfr 1638136Sdfr 1738136Sdfr#define SAMPLE(x) pp->coderecv = (pp->coderecv + 1) % MAXSTAGE; \ 1838136Sdfr pp->filter[pp->coderecv] = (x); \ 1938136Sdfr if (pp->coderecv == pp->codeproc) \ 2038136Sdfr pp->codeproc = (pp->codeproc + 1) % MAXSTAGE; 2138136Sdfr 2238136Sdfr/* 2338136Sdfr * Macros to determine the clock type and unit numbers from a 2438136Sdfr * 127.127.t.u address 2538136Sdfr */ 2638136Sdfr#define REFCLOCKTYPE(srcadr) ((SRCADR(srcadr) >> 8) & 0xff) 2738136Sdfr#define REFCLOCKUNIT(srcadr) (SRCADR(srcadr) & 0xff) 2838136Sdfr 2938136Sdfr/* 3038136Sdfr * List of reference clock names and descriptions. These must agree with 3138136Sdfr * lib/clocktypes.c and ntpd/refclock_conf.c. 3238136Sdfr */ 3350477Speterstruct clktype { 3438136Sdfr int code; /* driver "major" number */ 3538136Sdfr const char *clocktype; /* long description */ 3638136Sdfr const char *abbrev; /* short description */ 37110231Snyan}; 3838136Sdfrextern struct clktype clktypes[]; 3938136Sdfr 4047613Sdfr/* 4147613Sdfr * Configuration flag values 4238136Sdfr */ 4338136Sdfr#define CLK_HAVETIME1 0x1 4438136Sdfr#define CLK_HAVETIME2 0x2 4538136Sdfr#define CLK_HAVEVAL1 0x4 4638136Sdfr#define CLK_HAVEVAL2 0x8 4738136Sdfr 4838136Sdfr#define CLK_FLAG1 0x1 4938136Sdfr#define CLK_FLAG2 0x2 5038136Sdfr#define CLK_FLAG3 0x4 5138136Sdfr#define CLK_FLAG4 0x8 5238136Sdfr 5338136Sdfr#define CLK_HAVEFLAG1 0x10 5438136Sdfr#define CLK_HAVEFLAG2 0x20 5538136Sdfr#define CLK_HAVEFLAG3 0x40 5638136Sdfr#define CLK_HAVEFLAG4 0x80 5738136Sdfr 5838136Sdfr/* 5938136Sdfr * Constant for disabling event reporting in 6038136Sdfr * refclock_receive. ORed in leap 6138136Sdfr * parameter 6238136Sdfr */ 6338136Sdfr#define REFCLOCK_OWN_STATES 0x80 6438136Sdfr 6538136Sdfr/* 6638136Sdfr * Structure for returning clock status 6738136Sdfr */ 6838136Sdfrstruct refclockstat { 6938136Sdfr u_char type; /* clock type */ 7038136Sdfr u_char flags; /* clock flags */ 7138136Sdfr u_char haveflags; /* bit array of valid flags */ 7238136Sdfr u_short lencode; /* length of last timecode */ 7338136Sdfr const char *p_lastcode; /* last timecode received */ 7438136Sdfr u_int32 polls; /* transmit polls */ 7538136Sdfr u_int32 noresponse; /* no response to poll */ 7638136Sdfr u_int32 badformat; /* bad format timecode received */ 7738136Sdfr u_int32 baddata; /* invalid data timecode received */ 7838136Sdfr u_int32 timereset; /* driver resets */ 7938136Sdfr const char *clockdesc; /* ASCII description */ 8038136Sdfr double fudgetime1; /* configure fudge time1 */ 8138136Sdfr double fudgetime2; /* configure fudge time2 */ 8238136Sdfr int32 fudgeval1; /* configure fudge value1 */ 8338136Sdfr u_int32 fudgeval2; /* configure fudge value2 */ 8438136Sdfr u_char currentstatus; /* clock status */ 8538136Sdfr u_char lastevent; /* last exception event */ 8638136Sdfr u_char leap; /* leap bits */ 8738136Sdfr struct ctl_var *kv_list; /* additional variables */ 8838136Sdfr}; 8938136Sdfr 9038136Sdfr/* 9138136Sdfr * Reference clock I/O structure. Used to provide an interface between 9238136Sdfr * the reference clock drivers and the I/O module. 9338136Sdfr */ 9438136Sdfrstruct refclockio { 9538136Sdfr struct refclockio *next; /* link to next structure */ 9638136Sdfr void (*clock_recv) (struct recvbuf *); /* completion routine */ 9738136Sdfr int (*io_input) (struct recvbuf *); /* input routine - 9838136Sdfr to avoid excessive buffer use 9938136Sdfr due to small bursts 10038136Sdfr of refclock input data */ 10138136Sdfr struct peer *srcclock; /* refclock peer */ 10238136Sdfr int datalen; /* length of data */ 10338136Sdfr int fd; /* file descriptor */ 10438136Sdfr u_long recvcount; /* count of receive completions */ 10538136Sdfr int active; /* nonzero when in use */ 10638136Sdfr 10738136Sdfr#ifdef HAVE_IO_COMPLETION_PORT 10838136Sdfr void * ioreg_ctx; /* IO registration context */ 10938136Sdfr void * device_ctx; /* device-related data for i/o subsystem */ 11038136Sdfr#endif 11138136Sdfr}; 11238136Sdfr 11338136Sdfr/* 11438136Sdfr * Structure for returning debugging info 11538136Sdfr */ 11638136Sdfr#define NCLKBUGVALUES 16 11738136Sdfr#define NCLKBUGTIMES 32 11838136Sdfr 11938136Sdfrstruct refclockbug { 12038136Sdfr u_char nvalues; /* values following */ 12138136Sdfr u_char ntimes; /* times following */ 12238136Sdfr u_short svalues; /* values format sign array */ 12338136Sdfr u_int32 stimes; /* times format sign array */ 12438136Sdfr u_int32 values[NCLKBUGVALUES]; /* real values */ 12538136Sdfr l_fp times[NCLKBUGTIMES]; /* real times */ 12638136Sdfr}; 12738136Sdfr 12838136Sdfr#ifdef HAVE_IO_COMPLETION_PORT 12938136Sdfrextern HANDLE WaitableIoEventHandle; 13038136Sdfr#endif 13138136Sdfr 13238136Sdfr/* 13338136Sdfr * Structure interface between the reference clock support 13438136Sdfr * ntp_refclock.c and the driver utility routines 13538136Sdfr */ 13638136Sdfr#define MAXSTAGE 60 /* max median filter stages */ 13738136Sdfr#define NSTAGE 5 /* default median filter stages */ 13838136Sdfr#define BMAX 128 /* max timecode length */ 13942333Syokota#define GMT 0 /* I hope nobody sees this */ 14038136Sdfr#define MAXDIAL 60 /* max length of modem dial strings */ 14138136Sdfr 14238136Sdfr 14338136Sdfrstruct refclockproc { 14438136Sdfr void * unitptr; /* pointer to unit structure */ 14538136Sdfr struct refclock * conf; /* refclock_conf[type] */ 14660544Sdfr struct refclockio io; /* I/O handler structure */ 14760544Sdfr u_char leap; /* leap/synchronization code */ 14860544Sdfr u_char currentstatus; /* clock status */ 14960544Sdfr u_char lastevent; /* last exception event */ 15060544Sdfr u_char type; /* clock type */ 15160544Sdfr const char *clockdesc; /* clock description */ 15260544Sdfr u_long nextaction; /* local activity timeout */ 15363403Sdfr void (*action)(struct peer *); /* timeout callback */ 15463403Sdfr 15560544Sdfr char a_lastcode[BMAX]; /* last timecode received */ 15642333Syokota int lencode; /* length of last timecode */ 15738136Sdfr 15842333Syokota int year; /* year of eternity */ 15938136Sdfr int day; /* day of year */ 16038136Sdfr int hour; /* hour of day */ 16138136Sdfr int minute; /* minute of hour */ 16238136Sdfr int second; /* second of minute */ 16338136Sdfr long nsec; /* nanosecond of second */ 16438136Sdfr u_long yearstart; /* beginning of year */ 16538136Sdfr int coderecv; /* put pointer */ 16638136Sdfr int codeproc; /* get pointer */ 16738136Sdfr l_fp lastref; /* reference timestamp */ 16838136Sdfr l_fp lastrec; /* receive timestamp */ 16938136Sdfr double offset; /* mean offset */ 17038136Sdfr double disp; /* sample dispersion */ 17138136Sdfr double jitter; /* jitter (mean squares) */ 17238136Sdfr double filter[MAXSTAGE]; /* median filter */ 17338136Sdfr 17438136Sdfr /* 17538136Sdfr * Configuration data 17638136Sdfr */ 17738136Sdfr double fudgetime1; /* fudge time1 */ 17838136Sdfr double fudgetime2; /* fudge time2 */ 17938136Sdfr u_char stratum; /* server stratum */ 18038136Sdfr u_int32 refid; /* reference identifier */ 18138136Sdfr u_char sloppyclockflag; /* fudge flags */ 18238136Sdfr 18338136Sdfr /* 18447613Sdfr * Status tallies 185 */ 186 u_long timestarted; /* time we started this */ 187 u_long polls; /* polls sent */ 188 u_long noreply; /* no replies to polls */ 189 u_long badformat; /* bad format reply */ 190 u_long baddata; /* bad data reply */ 191}; 192 193/* 194 * Structure interface between the reference clock support 195 * ntp_refclock.c and particular clock drivers. This must agree with the 196 * structure defined in the driver. 197 */ 198#define noentry 0 /* flag for null routine */ 199#define NOFLAGS 0 /* flag for null flags */ 200 201struct refclock { 202 int (*clock_start) (int, struct peer *); 203 void (*clock_shutdown) (int, struct peer *); 204 void (*clock_poll) (int, struct peer *); 205 void (*clock_control) (int, const struct refclockstat *, 206 struct refclockstat *, struct peer *); 207 void (*clock_init) (void); 208 void (*clock_buginfo) (int, struct refclockbug *, struct peer *); 209 void (*clock_timer) (int, struct peer *); 210}; 211 212/* 213 * Function prototypes 214 */ 215extern int io_addclock (struct refclockio *); 216extern void io_closeclock (struct refclockio *); 217 218#ifdef REFCLOCK 219extern void refclock_buginfo(sockaddr_u *, 220 struct refclockbug *); 221extern void refclock_control(sockaddr_u *, 222 const struct refclockstat *, 223 struct refclockstat *); 224extern int refclock_open (const char *, u_int, u_int); 225extern int refclock_setup (int, u_int, u_int); 226extern void refclock_timer (struct peer *); 227extern void refclock_transmit(struct peer *); 228extern int refclock_process(struct refclockproc *); 229extern int refclock_process_f(struct refclockproc *, double); 230extern void refclock_process_offset(struct refclockproc *, l_fp, 231 l_fp, double); 232extern void refclock_report (struct peer *, int); 233extern int refclock_gtlin (struct recvbuf *, char *, int, l_fp *); 234extern int refclock_gtraw (struct recvbuf *, char *, int, l_fp *); 235extern int indicate_refclock_packet(struct refclockio *, 236 struct recvbuf *); 237extern void process_refclock_packet(struct recvbuf *); 238#endif /* REFCLOCK */ 239 240#endif /* NTP_REFCLOCK_H */ 241