#ifndef NTP_REFCLOCK_H
#define NTP_REFCLOCK_H
#if defined(HAVE_SYS_MODEM_H)
#include <sys/modem.h>
#endif
#include "ntp_types.h"
#include "ntp_tty.h"
#include "recvbuff.h"
#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;
#define REFCLOCKTYPE(srcadr) ((SRCADR(srcadr) >> 8) & 0xff)
#define REFCLOCKUNIT(srcadr) (SRCADR(srcadr) & 0xff)
struct clktype {
int code;
const char *clocktype;
const char *abbrev;
};
extern struct clktype clktypes[];
#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
#define REFCLOCK_OWN_STATES 0x80
struct refclockstat {
u_char type;
u_char flags;
u_char haveflags;
u_short lencode;
const char *p_lastcode;
u_int32 polls;
u_int32 noresponse;
u_int32 badformat;
u_int32 baddata;
u_int32 timereset;
const char *clockdesc;
double fudgetime1;
double fudgetime2;
int32 fudgeval1;
u_int32 fudgeval2;
u_char currentstatus;
u_char lastevent;
u_char leap;
struct ctl_var *kv_list;
};
struct refclockio {
struct refclockio *next;
void (*clock_recv) (struct recvbuf *);
int (*io_input) (struct recvbuf *);
struct peer *srcclock;
int datalen;
int fd;
u_long recvcount;
int active;
#ifdef HAVE_IO_COMPLETION_PORT
void * ioreg_ctx;
void * device_ctx;
#endif
};
#define NCLKBUGVALUES 16
#define NCLKBUGTIMES 32
struct refclockbug {
u_char nvalues;
u_char ntimes;
u_short svalues;
u_int32 stimes;
u_int32 values[NCLKBUGVALUES];
l_fp times[NCLKBUGTIMES];
};
#ifdef HAVE_IO_COMPLETION_PORT
extern HANDLE WaitableIoEventHandle;
#endif
#define MAXSTAGE 60
#define NSTAGE 5
#define BMAX 128
#define GMT 0
#define MAXDIAL 60
struct refclockproc {
void * unitptr;
struct refclock * conf;
struct refclockio io;
u_char leap;
u_char currentstatus;
u_char lastevent;
u_char type;
const char *clockdesc;
u_long nextaction;
void (*action)(struct peer *);
char a_lastcode[BMAX];
int lencode;
int year;
int day;
int hour;
int minute;
int second;
long nsec;
u_long yearstart;
int coderecv;
int codeproc;
l_fp lastref;
l_fp lastrec;
double offset;
double disp;
double jitter;
double filter[MAXSTAGE];
double fudgetime1;
double fudgetime2;
u_char stratum;
u_int32 refid;
u_char sloppyclockflag;
u_long timestarted;
u_long polls;
u_long noreply;
u_long badformat;
u_long baddata;
};
#define noentry 0
#define NOFLAGS 0
struct refclock {
int (*clock_start) (int, struct peer *);
void (*clock_shutdown) (int, struct peer *);
void (*clock_poll) (int, struct peer *);
void (*clock_control) (int, const struct refclockstat *,
struct refclockstat *, struct peer *);
void (*clock_init) (void);
void (*clock_buginfo) (int, struct refclockbug *, struct peer *);
void (*clock_timer) (int, struct peer *);
};
extern int io_addclock (struct refclockio *);
extern void io_closeclock (struct refclockio *);
#ifdef REFCLOCK
extern void refclock_buginfo(sockaddr_u *,
struct refclockbug *);
extern void refclock_control(sockaddr_u *,
const struct refclockstat *,
struct refclockstat *);
extern int refclock_open (const char *, u_int, u_int);
extern int refclock_setup (int, u_int, u_int);
extern void refclock_timer (struct peer *);
extern void refclock_transmit(struct peer *);
extern int refclock_process(struct refclockproc *);
extern int refclock_process_f(struct refclockproc *, double);
extern void refclock_process_offset(struct refclockproc *, l_fp,
l_fp, double);
extern void refclock_report (struct peer *, int);
extern int refclock_gtlin (struct recvbuf *, char *, int, l_fp *);
extern int refclock_gtraw (struct recvbuf *, char *, int, l_fp *);
extern int indicate_refclock_packet(struct refclockio *,
struct recvbuf *);
extern void process_refclock_packet(struct recvbuf *);
#endif
#endif