Annotation of embedaddon/ntp/ntpd/refclock_local.c, revision 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>