diff options
Diffstat (limited to 'ntpd/refclock_local.c')
-rw-r--r-- | ntpd/refclock_local.c | 88 |
1 files changed, 30 insertions, 58 deletions
diff --git a/ntpd/refclock_local.c b/ntpd/refclock_local.c index dc6f1aefda67..d1b28718e993 100644 --- a/ntpd/refclock_local.c +++ b/ntpd/refclock_local.c @@ -24,19 +24,20 @@ /* * This is a hack to allow a machine to use its own system clock as a * reference clock, i.e., to free-run using no outside clock discipline - * source. This is useful if you want to use NTP in an isolated - * environment with no radio clock or NIST modem available. Pick a - * machine that you figure has a good clock oscillator and configure it - * with this driver. Set the clock using the best means available, like + * source. Note that the clock selection algorithm will not select this + * driver unless all other sources of synchronization have been lost. + * This is useful if you want to use NTP in an isolated environment + * with no radio clock or NIST modem available. Pick a machine that you + * figure has a good clock oscillator and configure it with this + * driver. Set the clock using the best means available, like * eyeball-and-wristwatch. Then, point all the other machines at this * one or use broadcast (not multicast) mode to distribute time. * * Another application for this driver is if you want to use a * particular server's clock as the clock of last resort when all other * normal synchronization sources have gone away. This is especially - * useful if that server has an ovenized oscillator. For this you would - * configure this driver at a higher stratum (say 5) to prevent the - * server's stratum from falling below that. + * useful if that server has an ovenized oscillator. However, the + * preferred was to do this is using orphan mode. See the documentation. * * A third application for this driver is when an external discipline * source is available, such as the NIST "lockclock" program, which @@ -52,42 +53,17 @@ * oscillator. In extreme cases, this can cause clients to exceed the * 128-ms slew window and drop off the NTP subnet. * - * THis driver includes provisions to telegraph synchronization state - * and related variables by means of kernel variables with specially - * modified kernels. This is done using the ntp_adjtime() syscall. - * In the cases where another protocol or device synchronizes the local - * host, the data given to the kernel can be slurped up by this driver - * and distributed to clients by ordinary NTP messaging. - * - * In the default mode the behavior of the clock selection algorithm is - * modified when this driver is in use. The algorithm is designed so - * that this driver will never be selected unless no other discipline - * source is available. This can be overriden with the prefer keyword of - * the server configuration command, in which case only this driver will - * be selected for synchronization and all other discipline sources will - * be ignored. This behavior is intended for use when an external - * discipline source controls the system clock. - * * Fudge Factors * - * The stratum for this driver set at 5 by default, but it can be - * changed by the fudge command and/or the ntpdc utility. The reference - * ID is 127.0.0.1 by default, but can be changed using the same mechanism. - * *NEVER* configure this driver to operate at a stratum which might - * possibly disrupt a client with access to a bona fide primary server, - * unless the local clock oscillator is reliably disciplined by another - * source. *NEVER NEVER* configure a server which might devolve to an - * undisciplined local clock to use multicast mode. Always remember that - * an improperly configured local clock driver let loose in the Internet - * can cause very serious disruption. This is why most of us who care - * about good time use cryptographic authentication. + * If fudge flag1 is lit, the leap second bit is set in the peer + * status word. It should be set early in the day of a leap second + * event and set dark on the day after the event. * - * This driver provides a mechanism to trim the local clock in both time - * and frequency, as well as a way to manipulate the leap bits. The - * fudge time1 parameter adjusts the time, in seconds, and the fudge - * time2 parameter adjusts the frequency, in ppm. The fudge time1 - * parameter is additive; that is, it adds an increment to the current - * time. The fudge time2 parameter directly sets the frequency. + * Note the fudge time1 and time2 have been deprecated. The fudge time1 + * was intended to apply a bias offset. This can be done using the Unix + * date command. The fudge time2 was intended to apply a bias frequency. + * This can be done using the frequency file and/or the freq + * configuration command. */ /* * Local interface definitions @@ -107,20 +83,11 @@ extern u_long current_time; */ extern s_char sys_precision; -#ifdef KERNEL_PLL -/* - * Imported from ntp_loopfilter - */ -extern int pll_control; /* kernel pll control */ -extern int kern_enable; /* kernel pll enabled */ -extern int ext_enable; /* external clock enable */ -#endif /* KERNEL_PLL */ - /* * Function prototypes */ -static int local_start P((int, struct peer *)); -static void local_poll P((int, struct peer *)); +static int local_start (int, struct peer *); +static void local_poll (int, struct peer *); /* * Local variables @@ -191,6 +158,12 @@ local_poll( #endif /* KERNEL_PLL LOCKCLOCK */ struct refclockproc *pp; + /* + * Do no evil unless the house is dark or lit with our own lamp. + */ + if (!(sys_peer == NULL || sys_peer == peer)) + return; + #if defined(VMS) && defined(VMS_LOCALUNIT) if (unit == VMS_LOCALUNIT) { extern void vms_local_poll(struct peer *); @@ -199,6 +172,7 @@ local_poll( return; } #endif /* VMS && VMS_LOCALUNIT */ + pp = peer->procptr; pp->polls++; @@ -209,12 +183,8 @@ local_poll( * time1 (s) and a continuous frequency adjustment using fudge * time 2 (ppm). */ - get_systime(&pp->lastrec); - pp->fudgetime1 += pp->fudgetime2 * 1e-6 * (current_time - - poll_time); poll_time = current_time; - refclock_process_offset(pp, pp->lastrec, pp->lastrec, - pp->fudgetime1); + refclock_process_offset(pp, pp->lastrec, pp->lastrec, 0); /* * If another process is disciplining the system clock, we set @@ -245,13 +215,15 @@ local_poll( pp->disp = 0; pp->jitter = 0; #else /* KERNEL_PLL LOCKCLOCK */ - pp->leap = LEAP_NOWARNING; + if (pp->sloppyclockflag & CLK_FLAG1) + pp->leap = LEAP_ADDSECOND; + else + pp->leap = LEAP_NOWARNING; pp->disp = DISPERSION; pp->jitter = 0; #endif /* KERNEL_PLL LOCKCLOCK */ pp->lastref = pp->lastrec; refclock_receive(peer); - pp->fudgetime1 = 0; } #else int refclock_local_bs; |