143 lines
3.7 KiB
C
143 lines
3.7 KiB
C
/*
|
|
* ntp_refclock.h - definitions for reference clock support
|
|
*/
|
|
|
|
#include "ntp_types.h"
|
|
|
|
#if !defined(SYSV_TTYS) && !defined(STREAM) & !defined(BSD_TTYS)
|
|
#define BSD_TTYS
|
|
#endif /* SYSV_TTYS STREAM BSD_TTYS */
|
|
|
|
/*
|
|
* 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
|
|
* see lib/clocktypes.c (must also agree with xntpd/refclock_conf.c)
|
|
*/
|
|
struct clktype {
|
|
int code; /* driver "major" number */
|
|
char *clocktype; /* LONG description */
|
|
char *abbrev; /* short description */
|
|
};
|
|
|
|
/*
|
|
* Definitions for default values
|
|
*/
|
|
#define noentry 0 /* flag for null routine */
|
|
|
|
/*
|
|
* Definitions for flags
|
|
*/
|
|
#define NOFLAGS 0
|
|
#define REF_FLAG_BCLIENT 0x1 /* clock prefers to run as a bclient */
|
|
|
|
/*
|
|
* 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
|
|
|
|
/*
|
|
* Structure for returning clock status
|
|
*/
|
|
struct refclockstat {
|
|
u_char type;
|
|
u_char flags;
|
|
u_char haveflags;
|
|
u_short lencode; /* ahem, we do have some longer "time-codes" */
|
|
char *lastcode;
|
|
U_LONG polls;
|
|
U_LONG noresponse;
|
|
U_LONG badformat;
|
|
U_LONG baddata;
|
|
U_LONG timereset;
|
|
char *clockdesc; /* description of clock, in ASCII */
|
|
l_fp fudgetime1;
|
|
l_fp fudgetime2;
|
|
LONG fudgeval1;
|
|
LONG fudgeval2;
|
|
u_char currentstatus;
|
|
u_char lastevent;
|
|
u_char unused;
|
|
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;
|
|
void (*clock_recv)();
|
|
caddr_t srcclock; /* pointer to clock structure */
|
|
int datalen;
|
|
int fd;
|
|
U_LONG recvcount;
|
|
};
|
|
|
|
|
|
/*
|
|
* Sizes of things we return for debugging
|
|
*/
|
|
#define NCLKBUGVALUES 16
|
|
#define NCLKBUGTIMES 32
|
|
|
|
/*
|
|
* Structure for returning debugging info
|
|
*/
|
|
struct refclockbug {
|
|
u_char nvalues;
|
|
u_char ntimes;
|
|
u_short svalues;
|
|
U_LONG stimes;
|
|
U_LONG values[NCLKBUGVALUES];
|
|
l_fp times[NCLKBUGTIMES];
|
|
};
|
|
|
|
/*
|
|
* Struct refclock provides the interface between the reference
|
|
* clock support and particular clock drivers. There are entries
|
|
* to open and close a unit, optional values to specify the
|
|
* timer interval for calls to the transmit procedure and to
|
|
* specify a polling routine to be called when the transmit
|
|
* procedure executes. There is an entry which is called when
|
|
* the transmit routine is about to shift zeroes into the
|
|
* filter register, and entries for stuffing fudge factors into
|
|
* the driver and getting statistics from it.
|
|
*/
|
|
struct refclock {
|
|
int (*clock_start) P((u_int, struct peer *)); /* start a clock unit */
|
|
void (*clock_shutdown) P((int)); /* shut a clock down */
|
|
void (*clock_poll) P((int, struct peer *)); /* called from the xmit routine */
|
|
void (*clock_control) P((u_int, struct refclockstat *, struct refclockstat *)); /* set fudge values, return stats */
|
|
void (*clock_init) P((void)); /* initialize driver data at startup */
|
|
void (*clock_buginfo) P((int, struct refclockbug *)); /* get clock dependent bug info */
|
|
U_LONG clock_flags; /* flag values */
|
|
};
|
|
|
|
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_in *, struct refclockbug *));
|
|
extern void refclock_control P((struct sockaddr_in *, struct refclockstat *, struct refclockstat *));
|
|
#endif /* REFCLOCK */
|