Annotation of embedaddon/ntp/include/ntp_refclock.h, revision 1.1.1.1

1.1       misho       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:        u_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) (struct recvbuf *); /* completion routine */
                    127:        int     (*io_input)   (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:        int     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:        void *  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:        int     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)      (int, struct peer *);
                    235:        void (*clock_shutdown)  (int, struct peer *);
                    236:        void (*clock_poll)      (int, struct peer *);
                    237:        void (*clock_control)   (int, struct refclockstat *,
                    238:                                    struct refclockstat *, struct peer *);
                    239:        void (*clock_init)      (void);
                    240:        void (*clock_buginfo)   (int, struct refclockbug *, struct peer *);
                    241:        void (*clock_timer)     (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 (l_fp *);
                    251: extern int     io_addclock_simple (struct refclockio *);
                    252: extern int     io_addclock     (struct refclockio *);
                    253: extern void    io_closeclock   (struct refclockio *);
                    254: 
                    255: #ifdef REFCLOCK
                    256: extern void    refclock_buginfo (sockaddr_u *,
                    257:                                    struct refclockbug *);
                    258: extern void    refclock_control (sockaddr_u *,
                    259:                                    struct refclockstat *,
                    260:                                    struct refclockstat *);
                    261: extern int     refclock_open   (char *, u_int, u_int);
                    262: extern int     refclock_setup  (int, u_int, u_int);
                    263: extern void    refclock_timer  (struct peer *);
                    264: extern void    refclock_transmit (struct peer *);
                    265: extern int     refclock_ioctl  (int, u_int);
                    266: extern         int     refclock_process (struct refclockproc *);
                    267: extern         int     refclock_process_f (struct refclockproc *, double);
                    268: extern         void    refclock_process_offset (struct refclockproc *, l_fp, l_fp, double);
                    269: extern void    refclock_report (struct peer *, int);
                    270: extern int     refclock_gtlin  (struct recvbuf *, char *, int, l_fp *);
                    271: extern int     refclock_gtraw  (struct recvbuf *, char *, int, l_fp *);
                    272: #endif /* REFCLOCK */
                    273: 
                    274: #endif /* NTP_REFCLOCK_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>