Annotation of embedaddon/ntp/ntpd/refclock_local.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /*
                      3:  * refclock_local - local pseudo-clock driver
                      4:  *
                      5:  * wjm 17-aug-1995: add a hook for special treatment of VMS_LOCALUNIT
                      6:  */
                      7: #ifdef HAVE_CONFIG_H
                      8: #include <config.h>
                      9: #endif
                     10: 
                     11: #ifdef REFCLOCK
                     12: 
                     13: #include "ntpd.h"
                     14: #include "ntp_refclock.h"
                     15: #include "ntp_stdlib.h"
                     16: 
                     17: #include <stdio.h>
                     18: #include <ctype.h>
                     19: 
                     20: #ifdef KERNEL_PLL
                     21: #include "ntp_syscall.h"
                     22: #endif
                     23: 
                     24: /*
                     25:  * This is a hack to allow a machine to use its own system clock as a
                     26:  * reference clock, i.e., to free-run using no outside clock discipline
                     27:  * source. Note that the clock selection algorithm will not select this
                     28:  * driver unless all other sources of synchronization have been lost.
                     29:  * This is useful if you want to use NTP in an isolated environment
                     30:  * with no radio clock or NIST modem available. Pick a machine that you
                     31:  * figure has a good clock oscillator and configure it with this
                     32:  * driver. Set the clock using the best means available, like
                     33:  * eyeball-and-wristwatch. Then, point all the other machines at this
                     34:  * one or use broadcast (not multicast) mode to distribute time.
                     35:  *
                     36:  * Another application for this driver is if you want to use a
                     37:  * particular server's clock as the clock of last resort when all other
                     38:  * normal synchronization sources have gone away. This is especially
                     39:  * useful if that server has an ovenized oscillator. However, the
                     40:  * preferred was to do this is using orphan mode. See the documentation.
                     41:  *
                     42:  * A third application for this driver is when an external discipline
                     43:  * source is available, such as the NIST "lockclock" program, which
                     44:  * synchronizes the local clock via a telephone modem and the NIST
                     45:  * Automated Computer Time Service (ACTS), or the Digital Time
                     46:  * Synchronization Service (DTSS), which runs on DCE machines. In this
                     47:  * case the stratum should be set at zero, indicating a bona fide
                     48:  * stratum-1 source. Exercise some caution with this, since there is no
                     49:  * easy way to telegraph via NTP that something might be wrong in the
                     50:  * discipline source itself. In the case of DTSS, the local clock can
                     51:  * have a rather large jitter, depending on the interval between
                     52:  * corrections and the intrinsic frequency error of the clock
                     53:  * oscillator. In extreme cases, this can cause clients to exceed the
                     54:  * 128-ms slew window and drop off the NTP subnet.
                     55:  *
                     56:  * Fudge Factors
                     57:  *
                     58:  * If fudge flag1 is lit, the leap second bit is set in the peer
                     59:  * status word. It should be set early in the day of a leap second
                     60:  * event and set dark on the day after the event.
                     61:  *
                     62:  * Note the fudge time1 and time2 have been deprecated. The fudge time1
                     63:  * was intended to apply a bias offset. This can be done using the Unix
                     64:  * date command. The fudge time2 was intended to apply a bias frequency.
                     65:  * This can be done using the frequency file and/or the freq
                     66:  * configuration command.
                     67:  */
                     68: /*
                     69:  * Local interface definitions
                     70:  */
                     71: #define PRECISION      (-7)    /* about 10 ms precision */
                     72: #define DESCRIPTION "Undisciplined local clock" /* WRU */
                     73: #define STRATUM        5       /* default stratum */
                     74: #define DISPERSION     .01     /* default dispersion (10 ms) */
                     75: 
                     76: /*
                     77:  * Imported from the timer module
                     78:  */
                     79: extern u_long current_time;
                     80: 
                     81: /*
                     82:  * Imported from ntp_proto
                     83:  */
                     84: extern s_char sys_precision;
                     85: 
                     86: /*
                     87:  * Function prototypes
                     88:  */
                     89: static int local_start (int, struct peer *);
                     90: static void    local_poll      (int, struct peer *);
                     91: 
                     92: /*
                     93:  * Local variables
                     94:  */
                     95: static u_long poll_time;       /* last time polled */
                     96:        
                     97: /*
                     98:  * Transfer vector
                     99:  */
                    100: struct refclock refclock_local = {
                    101:        local_start,            /* start up driver */
                    102:        noentry,                /* shut down driver (not used) */
                    103:        local_poll,             /* transmit poll message */
                    104:        noentry,                /* not used (old lcl_control) */
                    105:        noentry,                /* initialize driver (not used) */
                    106:        noentry,                /* not used (old lcl_buginfo) */
                    107:        NOFLAGS                 /* not used */
                    108: };
                    109: 
                    110: 
                    111: /*
                    112:  * local_start - start up the clock
                    113:  */
                    114: static int
                    115: local_start(
                    116:        int unit,
                    117:        struct peer *peer
                    118:        )
                    119: {
                    120:        struct refclockproc *pp;
                    121: 
                    122:        pp = peer->procptr;
                    123: 
                    124:        /*
                    125:         * Initialize miscellaneous variables
                    126:         */
                    127:        peer->precision = sys_precision;
                    128:        pp->leap = LEAP_NOTINSYNC;
                    129:        peer->stratum = STRATUM;
                    130:        pp->stratum = STRATUM;
                    131:        pp->clockdesc = DESCRIPTION;
                    132:        memcpy(&pp->refid, "LOCL", 4);
                    133:        poll_time = current_time;
                    134:        return (1);
                    135: }
                    136: 
                    137: 
                    138: /*
                    139:  * local_poll - called by the transmit procedure
                    140:  *
                    141:  * LOCKCLOCK: If the kernel supports the nanokernel or microkernel
                    142:  * system calls, the leap bits are extracted from the kernel. If there
                    143:  * is a kernel error or the kernel leap bits are set to 11, the NTP leap
                    144:  * bits are set to 11 and the stratum is set to infinity. Otherwise, the
                    145:  * NTP leap bits are set to the kernel leap bits and the stratum is set
                    146:  * as fudged. This behavior does not faithfully follow the
                    147:  * specification, but is probably more appropriate in a multiple-server
                    148:  * national laboratory network.
                    149:  */
                    150: static void
                    151: local_poll(
                    152:        int unit,
                    153:        struct peer *peer
                    154:        )
                    155: {
                    156: #if defined(KERNEL_PLL) && defined(LOCKCLOCK)
                    157:        struct timex ntv;
                    158: #endif /* KERNEL_PLL LOCKCLOCK */
                    159:        struct refclockproc *pp;
                    160: 
                    161:        /*
                    162:         * Do no evil unless the house is dark or lit with our own lamp.
                    163:         */
                    164:        if (!(sys_peer == NULL || sys_peer == peer))
                    165:                return;
                    166: 
                    167: #if defined(VMS) && defined(VMS_LOCALUNIT)
                    168:        if (unit == VMS_LOCALUNIT) {
                    169:                extern void vms_local_poll(struct peer *);
                    170: 
                    171:                vms_local_poll(peer);
                    172:                return;
                    173:        }
                    174: #endif /* VMS && VMS_LOCALUNIT */
                    175: 
                    176:        pp = peer->procptr;
                    177:        pp->polls++;
                    178: 
                    179:        /*
                    180:         * Ramble through the usual filtering and grooming code, which
                    181:         * is essentially a no-op and included mostly for pretty
                    182:         * billboards. We allow a one-time time adjustment using fudge
                    183:         * time1 (s) and a continuous frequency adjustment using fudge
                    184:         * time 2 (ppm).
                    185:         */
                    186:        poll_time = current_time;
                    187:        refclock_process_offset(pp, pp->lastrec, pp->lastrec, 0);
                    188: 
                    189:        /*
                    190:         * If another process is disciplining the system clock, we set
                    191:         * the leap bits and quality indicators from the kernel.
                    192:         */
                    193: #if defined(KERNEL_PLL) && defined(LOCKCLOCK)
                    194:        memset(&ntv,  0, sizeof ntv);
                    195:        switch (ntp_adjtime(&ntv)) {
                    196:        case TIME_OK:
                    197:                pp->leap = LEAP_NOWARNING;
                    198:                peer->stratum = pp->stratum;
                    199:                break;
                    200: 
                    201:        case TIME_INS:
                    202:                pp->leap = LEAP_ADDSECOND;
                    203:                peer->stratum = pp->stratum;
                    204:                break;
                    205: 
                    206:        case TIME_DEL:
                    207:                pp->leap = LEAP_DELSECOND;
                    208:                peer->stratum = pp->stratum;
                    209:                break;
                    210: 
                    211:        default:
                    212:                pp->leap = LEAP_NOTINSYNC;
                    213:                peer->stratum = STRATUM_UNSPEC;
                    214:        }
                    215:        pp->disp = 0;
                    216:        pp->jitter = 0;
                    217: #else /* KERNEL_PLL LOCKCLOCK */
                    218:        if (pp->sloppyclockflag & CLK_FLAG1)
                    219:                pp->leap = LEAP_ADDSECOND;
                    220:        else
                    221:                pp->leap = LEAP_NOWARNING;
                    222:        pp->disp = DISPERSION;
                    223:        pp->jitter = 0;
                    224: #endif /* KERNEL_PLL LOCKCLOCK */
                    225:        pp->lastref = pp->lastrec;
                    226:        refclock_receive(peer);
                    227: }
                    228: #else
                    229: int refclock_local_bs;
                    230: #endif /* REFCLOCK */

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