mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-28 11:57:28 +00:00
6b6d0b46c4
after the NEXT commit. |
||
---|---|---|
.. | ||
acts.c | ||
notes.txt | ||
ntpdate.8 | ||
ntpq.8 | ||
ntptrace.8 | ||
README.irig | ||
README.kern | ||
README.magic | ||
README.refclock | ||
tickadj.8 | ||
UofT | ||
xntpd.8 | ||
xntpdc.8 |
Information on Reference Clock Drivers Revised 5 August 1994 Support for most of the commonly available radio clocks is included in the default configuration of xntpd. Individual clocks can be activated by configuration file commands, specifically the server and fudge commands described in the xntpd.8 man page. This file contains information useful in configuring and operating these clocks. Note that the man pages and documentation files mentioned in this note can be found in the ./doc directory of the xntp3 distribution. Radio clocks by convention have addresses in the form 127.127.t.u, where "t" is the clock type and "u" is a unit number in the range 0-3 used to distinguish multiple instances of clocks of the same type. Most of these clocks require support in the form of a serial port or special bus peripheral. The particular device is normally specified by adding a soft link /dev/device%d to the particular hardware device involved. The name "device" is compiled in the driver according to the table below. The table shows the type number, device name, short description used in some displays, and long description used in other displays. Type Device Name Description ------------------------------------------------------- 1 (none) LOCAL Undisciplined Local Clock 2 trak GPS_TRAK TRAK 8820 GPS Receiver 3 pst WWV_PST PSTI/Traconex WWV/WWVH Receiver 4 wwvb WWVB_SPEC Spectracom WWVB Receiver 5 goes GPS_GOES_TRUE TrueTime GPS/GOES Receivers 6 irig IRIG_AUDIO IRIG Audio Decoder 7 chu CHU Scratchbuilt CHU Receiver 8 refclock- GENERIC Generic Reference Clock Driver 9 gps GPS_MX4200 Magnavox MX4200 GPS Receiver 10 gps GPS_AS2201 Austron 2201A GPS Receiver 11 omega OMEGA_TRUE TrueTime OM-DC OMEGA Receiver 12 tpro IRIG_TPRO KSI/Odetics TPRO/S IRIG Interface 13 leitch ATOM_LEITCH Leitch CSD 5300 Master Clock Controller 14 ees MSF_EES EES M201 MSF Receiver 15 gpstm GPS_TRUE TrueTime GPS/TM-TMD Receiver 16 * GPS_BANC Bancomm GPS/IRIG Receiver 17 datum GPS_DATUM Datum Precision Time System 18 acts NIST_ACTS NIST Automated Computer Time Service 19 heath WWV_HEATH Heath WWV/WWVH Receiver 20 nmea GPS_NMEA Generic NMEA GPS Receiver 21 * GPS_MOTO Motorola Six Gun GPS Receiver 22 pps ATOM_PPS PPS Clock Discipline * Not yet available. A radio clock is specified in the configuration using the server command server 127.127.t.u [ prefer ] [ mode m ] where t is the type number above and u can be in the range 0-3, conventionally 1. Ordinarily, this is the only command necessary to configure a radio clock. The optional prefer keyword can be used to modify the clock selection algorithm as described in Appendix B. For those clock drivers that support multiple modes of operation, the optional mode parameter selects which one. This parameter affects the operation of each driver as described in Appendix A. In rare cases a fudge command is necessary to specify additional details. This command has the following syntax fudge 127.127.t.u [stratum s] [refid r] [time1 t1] [time2 t2] [flags] and must follow the corresponding server command in the configuration file. The optional fields following the clock address are interpreted as follows: stratum s The s, a decimal number in the range 0-15, overrides the default stratum assigned by the driver. refid r The r, a 4-character, null-terminated ASCII string, overrides the reference identifier assigned by the driver. time1 t1 The t1, a fixed-point decimal number in seconds, specifies a constant to be added to the time offset produced by the driver. This provides a way to correct a systematic error or bias on the part of the particular clock. time2 t2 The t2, a fixed-point decimal number, is interpreted in a driver-dependent way. See the descriptions of specific clock drivers in Appendix A. There are four optional flags named flag1, flag2, flag3 and flag4. A flag is specified in the form <keyword> <value>, where <keyword> is one of the flag names and <value> is either 0 or 1, as appropriate. Two of the flags are generic and are interpreted by all applicable drivers, and two are driver dependent. The generic ones are as follows: flag4 This flag is used to enable detailed status monitoring and event recording. The data collected are written to the clockstats file maintained by the filegen utility (See the xntpd.8 man page). This file is normally processed by a cron job run once per day to produce summary statistics and performance data. The ./scripts/stats directory contains a number of shell and awk scripts for this, as well as S- language programs that produce PostScript plots of performance data. flag3 This flag is used with Sun SPARCstation baseboard serial ports to assign the ppsclock streams driver for a 1-pps signal produced by some radio clocks and timekeeping devices. See the dscription of the PPS Clock Discipline Driver (type 22) in Appendix A for further information. Note that the fudge factors above can be changed at run time using the xntpdc program (see the xntpdc.8 man page). This program does not have to be run on the server machine itself, since it communicates with the xntpd daemon using cryptographically authenticated messages. The PPS Signal Some radio clocks and related timekeeping gear have a pulse-per-second (PPS) signal that can be used to discipline the local clock oscillator to a high degree of precision, typically to the order less than 50 us in time and 0.1 ppm in frequency. The PPS signal can be connected in either of two ways, either via the data leads of a serial port or via the modem control leads. Either way requires conversion of the PPS signal, usually at TTL levels, to RS232 levels, which can be done using a circuit such as described in the ./gadget directory of the xntp3 distribution. The data leads interface requires regenerating the PPS pulse and converting to RS232 signal levels, so that the pulse looks like a legitimate ASCII character. The tty_clk module in the ./kernel directory inserts a timestamp following this character in the input data stream. The driver uses this timestamp to determine the time of arrival of the PPS pulse to within 26 us at 38.4 kbps while eliminating error due to operating system queues and service times. In order to use the tty_clk module, the xntp3 distribution must be compiled with CLK defined. The modem control leads interface requires converting to RS232 levels and connecting to the carrier detect (CD) lead of a serial port. The ppsclock streams module in the ./ppsclock directory is used to capture a timestamp upon transition of the PPS signal. The driver reads the latest timestamp with a designated ioctl() system call to determine the time of arrival of the PPS pulse to within a few tens of microseconds. In order to use the ppsclock module, the xntp3 distribution must be compiled with PPS defined. Both of these mechanisms are supported by the ATOM_PPS reference clock driver described in Appendix A. This driver is ordinarily used in conjunction with another clock driver that supports the radio clock that produces the PPS pulse. This driver furnishes the coarse timecode used to disambiguate the seconds numbering of the PPS pulse itself. The NTP daemon mitigates between the radio clock driver and ATOM_PPS driver as described in Appendix B in order to provide the most accurate time, while respecting the various types of equipment failures that could happen. For the utmost time quality, a number of Unix system kernel modifications can be made as described in the README.magic and README.kernel files. Specifically, the ppsclock module can be used to interface the PPS signal directly to the kernel for use as discipline sources for both time and frequency. These sources can be separately enabled and monitored using the ntp_adjtime() system call described in README.kernel and the ./include/sys/timex.h header file in the xntp3 distribution. In order to use the kernel PPS signal, the xntp3 distribution must be compiled with KERNEL_PLL defined. In some configurations may have multiple radio clocks, each with PPS outputs, as well as a kernel modified to use the PPS signal. In order to provide the highest degree of redundancy and survivability, the kernel PPS discipline, tty_clk module and ppsclock module may all be in use at the same time, each backing up the other. The sometimes complicated mitigation rules are described in Appendix B. Debugging Hints The ntpq and xntpdc utility programs can be used to debug reference clocks, either on the server itself or from another machine elsewhere in the network. The server is compiled, installed and started using the command-line switches described in the xntpd.8 man page. The first thing to look for are error messages on the system log. If none occur, the daemon has started, opened the devices specified and waiting for peers and radios to come up. The next step is to be sure the RS232 messages, if used, are getting to and from the clock. The most reliable way to do this is with an RS232 tester and to look for data flashes as the driver polls the clock and/or as data arrive from the clock. Our experience is that the overwhelming fraction of problems occurring during installation are due to problems such as miswired connectors or improperly configured radio clocks at this stage. If RS232 messages are getting to and from the clock, the variables of interest can be inspected using the ntpq program and various commands described in the ntpq.8 man page. First, use the pe and as commands to display a pair of billboards showing the peer configuration and association IDs for all peers, including the radio clock peers. The assigned clock address should appear in the pe billboard and the association ID for it at the same relative line position in the as billboard. If things are operating correctly, after a minute or two samples should show up in the pe display line for the clock. Additional information is available with the rv and clockvar commands, which take as argument the association ID shown in the as billboard. The rv command with no argument shows the system variables, while the rv command with argument shows the peer variables for the clock, as well as any other peers of interest. The clockvar command with argument shows the peer variables specific to reference clock peers, including the clock status, device name, last received timecode (if relevant), and various event counters. In addition, a subset of the fudge parameters is included. The xntpdc utility program can be used for detailed inspection of the clock driver status. The most useful are the clockstat and clkbug commands described in the xntpdc.8 man page. While these commands permit getting quite personal with the particular driver involved, their use is seldom necessary, unless an implementation bug shows up. Most drivers write a message to the clockstats file as each timecode or surrogate is received from the radio clock. By convention, this is the last ASCII timecode (or ASCII gloss of a binary-coded one) received from the radio. This file is managed by the filegen facility described in the xntpd.8 man page and requires specific commands in the configuration file. This forms a highly useful record to discover anomalies during regular operation of the clock. The scripts included in the ./scripts/stats directory can be run from a cron job to collect and summarize these data on a daily or weekly basis. The summary files have proven invaluable to detect infrequent misbehavior due to clock implementation bugs in some radios. Appendix A. Individual Driver Descriptions Following are detailed descriptions of the clock drivers, together with configuration data useful for special circumstances. Type 1: Undisciplined Local Clock 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 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 3 or 4) to prevent the server's stratum from falling below that. A third application for this driver is when an external discipline source is available, such as the NIST "lockclock" program, which synchronizes the local clock via a telephone modem and the NIST Automated Computer Time Service (ACTS), or the Digital Time Synchronization Service (DTSS), which runs on DCE machines. In this case the stratum should be set at zero, indicating a bona fide stratum-1 source. Exercise some caution with this, since there is no easy way to telegraph via NTP that something might be wrong in the discipline source itself. In the case of DTSS, the local clock can have a rather large jitter, depending on the interval between corrections and the intrinsic frequency error of the clock oscillator. In extreme cases, this can cause clients to exceed the 128-ms slew window and drop off the NTP subnet. 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 overridden 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 LCLSTRATUM is set at 3 by default, but can be changed by the fudge command and/or the xntpdc utility. The reference ID is "LCL" by default, but can be changed using the same mechanisms. *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. 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. Both parameters are additive; that is, they add increments in time or frequency to the present values. (Note: The frequency cannot be changed when the kernel modifications are in use - see the README.kern file). The fudge flag1 and fudge flag2 bits set the corresponding leap bits; for example, setting flag1 causes a leap second to be added at the end of the UTC day. These bits are not reset automatically when the leap takes place; they must be turned off manually after the leap event. Type 2: TRAK 8820 GPS Receiver This driver supports the TRAK 8820 GPS Station Clock. The claimed accuracy at the 1-pps output is 200-300 ns relative to the broadcast signal; however, in most cases the actual accuracy is limited by the precision of the timecode and the latencies of the serial interface and operating system. For best accuracy, this radio requires the LDISC_ACTS line discipline, which captures a timestamp at the '*' on-time character of the timecode. Using this discipline the jitter is in the order of 1 ms and systematic error about 0.5 ms. If unavailable, the buffer timestamp is used, which is captured at the \r ending the timecode message. This introduces a systematic error of 23 character times, or about 24 ms at 9600 bps, together with a jitter well over 8 ms on Sun IPC-class machines. Using the menus, the radio should be set for 9600 bps, one stop bit and no parity. It should be set to operate in computer (no echo) mode. The timecode format includes neither the year nor leap-second warning. No provisions are included in this preliminary version of the driver to read and record detailed internal radio status. In operation, this driver sends a RQTS\r request to the radio at initialization in order to put it in continuous time output mode. The radio then sends the following message once each second: *RQTS U,ddd:hh:mm:ss.0,q<cr><lf> on-time = '*' ddd = day of year hh:mm:ss = hours, minutes, seconds q = quality indicator (phase error), 0-6: 0 > 20 us 6 > 10 us 5 > 1 us 4 > 100 ns 3 > 10 ns 2 < 10 ns The alarm condition is indicated by '0' at Q, which means the radio has a phase error than 20 usec relative to the broadcast time. The absence of year, DST and leap-second warning in this format is also alarming. The continuous time mode is disabled using the RQTX<cr> request, following which the radio sends a RQTX DONE<cr><lf> response. In the normal mode, other control and status requests are effective, including the leap-second status request RQLS<cr>. The radio responds with RQLS yy,mm,dd<cr><lf>, where yy,mm,dd are the year, month and day. Presumably, this gives the epoch of the next leap second, RQLS 00,00,00 if none is specified in the GPS message. Specified in this form, the information is generally useless and is ignored by the driver. Fudge Factors There are no special fudge factors other than the generic. Type 3: PSTI/Traconex WWV/WWVH Receiver This driver supports the PSTI 1010 and Traconex 1020 WWV/WWVH Receivers. No specific claim of accuracy is made for these receiver, but actual experience suggests that 10 ms would be a conservative assumption. The DIPswitches should be set for 9600 bps line speed, 24-hour day- of-year format and UTC time zone. Automatic correction for DST should be disabled. It is very important that the year be set correctly in the DIPswitches; otherwise, the day of year will be incorrect after 28 April of a normal or leap year. The propagation delay DIPswitches should be set according to the distance from the transmitter for both WWV and WWVH, as described in the instructions. While the delay can be set only to within 11 ms, the fudge time1 parameter can be used for vernier corrections. Using the poll sequence QTQDQM, the response timecode is in three sections totalling 50 ASCII printing characters, as concatenated by the driver, in the following format: ahh:mm:ss.fffs<cr> yy/dd/mm/ddd<cr> frdzycchhSSFTttttuuxx<cr> on-time = first <cr> hh:mm:ss.fff = hours, minutes, seconds, milliseconds a = AM/PM indicator (' ' for 24-hour mode) yy = year (from DIPswitches) dd/mm/ddd = day of month, month, day of year s = daylight-saving indicator (' ' for 24-hour mode) f = frequency enable (O = all frequencies enabled) r = baud rate (3 = 1200, 6 = 9600) d = features indicator (@ = month/day display enabled) z = time zone (0 = UTC) y = year (5 = 91) cc = WWV propagation delay (52 = 22 ms) hh = WWVH propagation delay (81 = 33 ms) SS = status (80 or 82 = operating correctly) F = current receive frequency (4 = 15 MHz) T = transmitter (C = WWV, H = WWVH) tttt = time since last update (0000 = minutes) uu = flush character (03 = ^c) xx = 94 (unknown) The alarm condition is indicated by other than '8' at A, which occurs during initial synchronization and when received signal is lost for an extended period; unlock condition is indicated by other than "0000" in the tttt subfield at Q. Fudge Factors There are no special fudge factors other than the generic. Type 4: Spectracom WWVB Receiver This driver supports the Spectracom Model 8170 and Netclock/2 WWVB Synchronized Clock. This clock has proven a reliable source of time, except in some cases of high ambient conductive RF interference. The claimed accuracy of the clock is 100 usec relative to the broadcast signal; however, in most cases the actual accuracy is limited by the precision of the timecode and the latencies of the serial interface and operating system. The DIPswitches on this clock should be set to 24-hour display, AUTO DST off, time zone 0 (UTC), data format 0 or 2 (see below) and baud rate 9600. If this clock is to used as the source for the IRIG Audio Decoder (refclock_irig.c in this distribution), set the DIPswitches for AM IRIG output and IRIG format 1 (IRIG B with signature control). There are two timecode formats used by these clocks. Format 0, which is available with both the Netclock/2 and 8170, and format 2, which is available only with the Netclock/2 and specially modified 8170. Format 0 (22 ASCII printing characters): <cr><lf>i ddd hh:mm:ss TZ=zz<cr><lf> on-time = first <cr> hh:mm:ss = hours, minutes, seconds i = synchronization flag (' ' = in synch, '?' = out synch) The alarm condition is indicated by other than ' ' at A, which occurs during initial synchronization and when received signal is lost for about ten hours. Format 2 (24 ASCII printing characters): <cr><lf>iqyy ddd hh:mm:ss.fff ld on-time = <cr> i = synchronization flag (' ' = in synch, '?' = out synch) q = quality indicator (' ' = locked, 'A'...'D' = unlocked) yy = year (as broadcast) ddd = day of year hh:mm:ss.fff = hours, minutes, seconds, milliseconds The alarm condition is indicated by other than ' ' at A, which occurs during initial synchronization and when received signal is lost for about ten hours. The unlock condition is indicated by other than ' ' at Q. The Q is normally ' ' when the time error is less than 1 ms and a character in the set 'A'...'D' when the time error is less than 10, 100, 500 and greater than 500 ms respectively. The L is normally ' ', but is set to 'L' early in the month of an upcoming UTC leap second and reset to ' ' on the first day of the following month. The D is set to 'S' for standard time 'I' on the day preceding a switch to daylight time, 'D' for daylight time and 'O' on the day preceding a switch to standard time. The start bit of the first <cr> is synchronized to the indicated time as returned. This driver does not need to be told which format is in use - it figures out which one from the length of the message. A three-stage median filter is used to reduce jitter and provide a dispersion measure. The driver makes no attempt to correct for the intrinsic jitter of the radio itself, which is a known problem with the older radios. Fudge Factors This driver can retrieve a table of quality data maintained internally by the Netclock/2 receiver. If flag4 of the fudge configuration command is set to 1, the driver will retrieve this table and write it to the clockstats file on when the first timecode message of a new day is received. Type 5: TrueTime GPS/GOES Receivers This driver supports at least two models of Kinemetrics/TrueTime Timing Receivers, the 468-DC MK III GOES Synchronized Clock and GPS-DC MK III GPS Synchronized Clock and very likely others in the same model family that use the same timecode formats. The clocks are connected via a serial port. Up to four units, with unit numbers in the range 0 through 3, can be configured. The driver assumes the serial port device name is /dev/goes%d (i.e., unit 1 at 127.127.5.1 opens the clock at /dev/goes1) and that the clock is configured for 9600-baud operation. Type 6: IRIG Audio Decoder This driver supports the Inter-Range Instrumentation Group standard time-distribution signal IRIG-B using the audio codec native to the Sun SPARCstation. This signal is generated by several radio clocks, including those made by Austron, TrueTime, Odetics and Spectracom, among others, although it is generally an add-on option. The signal is connected via an attenuator box and cable to the audio codec input on a Sun SPARCstation and requires a specially modified kernel audio driver. Details are in the README.irig file. Timing jitter using the decoder and a Sun IPC is in the order of a few microseconds, although the overall timing accuracy is limited by the wander of the CPU oscillator used for timing purposes to a few hundred microseconds. These figures are comparable with what can be achieved using the 1-pps discipline as describe elsewhere in this note. Fudge Factors There are no special fudge factors other than the generic. The flag3 and flag4 flags are not applicable to this driver. Type 7: Scratchbuilt CHU Receiver This driver supports a shortwave receiver and special modem circuitry described in the ./gadget directory of the xntp3 distribution. It requires the chu-clk line discipline or chu_clk STREAMS module described in the ./kernel directory of that distribution. It is connected via a serial port operating at 300 baud. Unlike the NIST time services, whose timecode requires quite specialized hardware to interpret, the CHU timecode can be received directly via a serial port after demodulation. While there are currently no known commercial CHU receivers, the hardware required to receive the CHU timecode is fairly simple to build. While it is possible to configure several CHU units simultaneously, this is in general not useful. Fudge Factors The time1 option can be used to set the CHU propagation delay, compensate for inherent latencies in the serial port hardware and operating system. The default value is 0.0025 seconds, which is about right for Toronto. Values for other locations can be calculated using the propdelay program in the util directory of the xntp3 distribution or equivalent means. The time2 option can be used to compensate for inherent latencies in the serial port hardware and operating system. The value, which defaults to zero, is in addition to the propagation delay provided by the time1 option. The default value is 0.0002 seconds, which is about right for typical telephone modem chips. The flag1 option can be used to modify the averaging algorithm used to smooth the clock indications. Ordinarily, the algorithm picks the median of a set of samples, which is appropriate under conditions of poor to fair radio propagation conditions. If the clock is located relatively close to the WWV or WWVH transmitters, setting this flag will cause the algorithm to average the set of samples, which can reduce the residual jitter and improve accuracy. Type 8: Generic Reference Clock Driver The timecode of these receivers is sampled via a STREAMS module in the kernel (The STREAMS module has been designed for use with SUN Systems under SunOS 4.1.x. It can be linked directly into the kernel or loaded via the loadable driver mechanism). This STREAMS module can be adapted to be able to convert different time code formats. If the daemon is compiled without the STREAM definition synchronization will work without the Sun streams module, though accuracy is significantly degraded. The actual receiver status is mapped into various synchronization states generally used by receivers. The STREAMS module is configured to interpret the time codes of DCF U/A 31, PZF535, GPS166, Trimble SV6 GPS, ELV DCF7000, Schmid and low cost receivers (see list below). The reference clock support in xntp contains the necessary configuration tables for those receivers. In addition to supporting up to 32 different clock types and 4 devices, the generation a a PPS signal is also provided as an configuration option. The PPS configuration option uses the receiver generated time stamps for feeding the PPS loopfilter control for much finer clock synchronization. CAUTION: The PPS configuration option is different from the hardware PPS signal, which is also supported (see below), as it controls the way xntpd is synchronized to the reference clock, while the hardware PPS signal controls the way time offsets are determined. The use of the PPS option requires receivers with an accuracy of better than 1ms. Fudge factors Only two fudge factors are utilized. The time1 fudge factor defines the phase offset of the synchronization character to the actual time. On the availability of PPS information the time2 fudge factor defines the skew between the PPS time stamp and the receiver timestamp of the PPS signal. This parameter is usually zero, as usually the PPS signal is believed in time and OS delays should be corrected in the machine specific section of the kernel driver. time2 needs only be set when the actual PPS signal is delayed for some reason. The flag0 enables input filtering. This a median filter with continuous sampling. The flag1 selects averaging of the samples remaining after the filtering. Leap secondhandling is controlled with the flag2. When set a leap second will be deleted on receipt of a leap second indication from the receiver. Otherwise the leap second will be added, (which is the default). ntpq (8) timecode variable The ntpq program can read clock variables command list several variables. These hold the following information: refclock_time is the local time with the offset to UTC (format HHMM). The currently active receiver flags are listed in refclock_status. Additional feature flags of the receiver are optionally listed in parentheses. The actual time code is listed in timecode. A qualification of the decoded time code format is following in refclock_format. The last piece of information is the overall running time and the accumulated times for the clock event states in refclock_states. When PPS information is present additional variable are available. refclock_ppstime lists then the PPS timestamp and refclock_ppsskew lists the difference between RS232 derived timestamp and the PPS timestamp. Unit encoding The unit field <u> encodes the device, clock type and the PPS generation option. There are 4 possible units, which are encoded in the lower two bits of the <u> field. The devices are named /dev/refclock-0 through /dev/refclock-3. Bits 2 thru 6 encode the clock type. The fudge factors of the clock type are taken from a table clockinfo in refclock_parse.c. The generation of PPS information for disciplining the local NTP clock is encoded in bit 7 of <u>. Currently, nine clock types (devices /dev/refclock-0 - /dev/refclock-3) are supported. 127.127.8.0-3 16 Meinberg PZF535 receiver (FM demodulation/TCXO / 50us) 127.127.8.4-7 16 Meinberg PZF535 receiver (FM demodulation/OCXO / 50us) 127.127.8.8-11 16 Meinberg DCF U/A 31 receiver (AM demodulation / 4ms) 127.127.8.12-15 16 ELV DCF7000 (sloppy AM demodulation / 50ms) 127.127.8.16-19 16 Walter Schmid DCF receiver Kit (AM demodulation / 1ms) 127.127.8.20-23 16 RAW DCF77 100/200ms pulses (Conrad DCF77 receiver module / 5ms) 127.127.8.24-27 16 RAW DCF77 100/200ms pulses (TimeBrick DCF77 receiver module / 5ms) 127.127.8.28-31 16 Meinberg GPS166 receiver (GPS / <<1us) 127.127.8.32-35 16 Trimble SV6 GPS receiver (GPS / <<1us) The reference clock support carefully monitors the state transitions of the receiver. All state changes and exceptional events such as loss of time code transmission are logged via the syslog facility. Every hour a summary of the accumulated times for the clock states is listed via syslog. PPS support is only available when the receiver is completely synchronized. The receiver is believed to deliver correct time for an additional period of time after losing synchronizations, unless a disruption in time code transmission is detected (possible power loss). The trust period is dependent on the receiver oscillator and thus a function of clock type. This is one of the parameters in the clockinfo field of the reference clock implementation. This parameter cannot be configured by xntpdc. In addition to the PPS loopfilter control a true PPS hardware signal can be applied on Sun Sparc stations via the CPU serial ports on the CD pin. This signal is automatically detected and will be used for offset calculation. The input signal must be the time mark for the following time code. (The edge sensitivity can be selected - look into the appropriate kernel/parsestreams.c for details). Meinberg receivers can be connected by feeding the PPS pulse of the receiver via a 1488 level converter to Pin 8 (CD) of a Sun serial zs\-port. There exists a special firmware release for the PZF535 Meinberg receivers. This release (PZFUERL 4.6 (or higher - The UERL is important)) is absolutely recommended for XNTP use, as it provides LEAP warning, time code time zone information and alternate antenna indication. Please check with Meinberg for this firmware release. For the Meinberg GPS166 receiver is also a special firmware release available (Uni-Erlangen). This release must be used for proper operation. The raw DCF77 pulses can be fed via a level converter directly into Pin 3 (Rx) of the Sun. The telegrams will be decoded an used for synchronization. AM DCF77 receivers are running as low as $25. The accuracy is dependent on the receiver and is somewhere between 2ms (expensive) to 10ms (cheap). Upon bad signal reception of DCF77 synchronizations will cease as no backup oscillator is available as usually found in other reference clock receivers. So it is important to have a good place for the DCF77 antenna. For transmitter shutdowns you are out of luck unless you have other NTP servers with alternate time sources available. Type 9: Magnavox MX4200 GPS Receiver This driver supports the Magnavox MX4200 Navigation Receiver adapted to precision timing applications. This requires an interface box described in the ./ppsclock directory of the xntp3 distribution. It is connected via a serial port and requires the ppsclock STREAMS module described in the same directory. Fudge Factors There are no special fudge factors other than the generic. Type 10: Austron 2201A GPS Receiver This driver supports the Austron 2200A/2201A GPS/LORAN Synchronized Clock and Timing Receiver connected via a serial port. It supports several special features of the clock, including the Input Buffer Module, Output Buffer Module, IRIG-B Interface Module and LORAN Assist Module. It requires the RS232 Serial Interface module for communication with the driver. This receiver is capable of a comprehensive and large volume of statistics and operational data. The specific data collection commands and attributes are embedded in the driver source code; however, the collection process can be enabled or disabled using the flag4 flag. If set, collection is enabled; if not, which is the default, it is disabled. A comprehensive suite of data reduction and summary scripts is in the ./scripts/stats directory of the xntp3 distribution. To achieve the high accuracy this device provides, it is necessary to use the ppsclock feature of the xntp3 program distribution or, alternatively, to install the kernel modifications described in the README.kern. The clock can be wired to provide time to a single CPU or bussed in parallel to several CPUs, with one CPU controlling the receiver and the others just listening. Fair accuracy can be achieved in the single-CPU configuration without use of the 1-pps signal, but in multiple CPU configurations accuracy is severely degraded without it. Fudge Factors There are no special fudge factors other than the generic. Type 11: TrueTime OM-DC OMEGA Receiver This driver supports the Kinemetrics/TrueTime OMEGA-DC OMEGA Synchronized Clock connected via a serial port. This clock is sufficiently different from other Kinemetrics/TrueTime models that a separate driver is required. Up to four units, with unit numbers in the range 0 through 3, can be configured. The driver assumes the serial port device name is /dev/omega%d (i.e., unit 1 at 127.127.11.1 opens the clock at /dev/omega1) and that the clock is configured for 9600-baud operation. Fudge Factors There are no special fudge factors other than the generic. Type 12: KSI/Odetics TPRO/S IRIG Interface This driver supports the KSI/Odetics TPRO and TPRO-SAT IRIG-B Decoder, which is a module connected directly to the SBus of a Sun workstation. The module works with the IRIG-B signal generated by several radio clocks, including those made by Austron, TrueTime, Odetics and Spectracom, among others, although it is generally an add-on option. In the case of the TPRO-SAT, the module is an integral part of a GPS receiver, which serves as the primary timing source. Using the TPRO interface as a NTP reference clock provides precision time only to xntpd and its clients. With suitable kernel modifications, it is possible to use the TPRO as the CPU system clock, avoiding errors introduced by the CPU clock oscillator wander. See the README.kernel and kern.c files for further details. Type 13: Leitch CSD 5300 Master Clock Controller Information not available. Type 14: EES M201 MSF Receiver This driver supports the EES M201 MSF receiver connected to a Sun SPARCstation running SunOS 4.x with the "ppsclock" STREAMS module. Fudge Factors If flag1 is set, then the system clock is assumed to be sloppy (e.g. Sun4 with 20ms clock), so samples are averaged. If flag2 is set, then leaphold is set. If flag3 is set, then the sample information is dumped. If flag4 is set, then the input data is smoothed, and all data points are used. Type 15: TrueTime GPS/TM-TMD Receiver Information not available. Type 16: Bancomm GPS/IRIG Receiver Information not available. Type 17: Datum Precision Time System Information not available. Type 18: NIST Automated Computer Time Service This driver supports the NIST Automated Computer Time Service (ACTS). It periodically dials a prespecified telephone number, receives the NIST timecode data and calculates the local clock correction. It designed primarily for use when neither a radio clock nor connectivity to Internet time servers is available. For the best accuracy, the individual telephone line/modem delay needs to be calibrated using outside sources. The ACTS is located at NIST Boulder, CO, telephone 303 494 4774. A toll call from Newark, DE, costs between three and four cents, although it is not clear what carrier and time of day discounts apply. The modem dial string will differ depending on local telephone configuration, etc., and is specified by the phone command in the configuration file. The argument to this command is an AT command for a Hayes compatible modem. The accuracy produced by this driver should be in the range of a millisecond or two, but may need correction due to the delay characteristics of the individual modem involved. For undetermined reasons, some modems work with the ACTS echo-delay measurement scheme and some don't. This driver tries to do the best it can with what it gets. Initial experiments with a Practical Peripherals 9600SA modem here in Delaware suggest an accuracy of a millisecond or two can be achieved without the scheme by using a fudge time1 value of 65.0 ms. In either case, the dispersion for a single call involving ten samples is about 1.3 ms. The driver can operate in either of three modes, as determined by the mode parameter in the server configuration command. In mode 0 (automatic) the driver operates continuously at intervals depending on the prediction error, as measured by the driver, usually in the order of several hours. In mode 1 (backup) the driver is enabled in automatic mode only when no other source of synchronization is available and when more than MAXOUTAGE (3600 s) have elapsed since last synchronized by other sources. In mode 2 (manual) the driver operates only when enabled using a fudge flags switch, as described below. For reliable call management, this driver requires a 1200-bps modem with a Hayes-compatible command set and control over the modem data terminal ready (DTR) control line. Present restrictions require the use of a POSIX-compatible programming interface, although other interfaces may work as well. The ACTS telephone number and modem setup string are hard-coded in the driver and may require changes for nonstandard modems or special circumstances. Fudge Factors Ordinarily, the propagation time correction is computed automatically by ACTS and the driver. When this is not possible or erratic due to individual modem characteristics, the fudge flag2 switch should be set to disable the ACTS echo-delay scheme. In any case, the fudge time1 parameter can be used to adjust the propagation delay as required. The ACTS call interval is determined in one of three ways. In manual mode a call is initiated by setting fudge flag1 using xntpdc, either manually or via a cron job. In automatic mode this flag is set by the peer timer, which is controlled by the sys_poll variable in response to measured errors. In backup mode the driver is ordinarily asleep, but awakes (in automatic mode) if all other synchronization sources are lost. In either automatic or backup modes, the call interval increases as long as the measured errors do not exceed the value of the fudge time2 parameter. When the fudge flag1 is set, the ACTS calling program is activated. This program dials each number listed in the phones command of the configuration file in turn. If a call attempt fails, the next number in the list is dialed. The fudge flag1 and counter are reset and the calling program terminated if (a) a valid clock update has been determined, (b) no more numbers remain in the list, (c) a device fault or timeout occurs, or (d) fudge flag1 is reset manually using xntpdc. The NIST timecode message is transmitted at 1200 bps in the following format (see the driver source for more information): jjjjj yy-mm-dd hh:mm:ss tt l uuu mmmmm UTC(NIST) * jjjjj = modified Julian day yy-mm-dd = year, month, day hh:mm:ss = hours, minutes, seconds tt = DST indicator (see driver listing) l = leap-second warning (see driver listing) uuu = DUT1 correction (see driver listing) mmmmm = modem calibration (see driver listing) on-time = '*' The timecode message is transmitted continuously after a signon banner, which this driver ignores. The driver also ignores all but the yy-mm-dd, hh:mm:ss and on-time character '*' fields, although it checks the format of all fields of the message. A timestamp is captured at the '*' character, as required by the ACTS specification, and used as the reference time of the timecode. If a message with an on-time character of '#' is received, the driver updates the propagation delay. The driver disconnects when (a) ten valid messages have been received, (b) no message has been received for 15 s, (c) an on-time character of '#' is received. These messages are processed by a trimmed-mean filter to reduce timing noise and then by the usual NTP algorithms to develop the clock correction. 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 overridden 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. Ordinarily, the prefer keyword would be used only in automatic mode ehen primary time is to be obtained via ACTS and backup NTP peers used only when ACTS fails. Call Management Since ACTS will be a toll call in most areas of the country, it is necessary to carefully manage the calling interval. The ACTS call program is initiated by setting fudge flag1. This flag can be set manually using xntpdc, by a cron job that calls xntpdc, or automatically by the driver itself. The fudge flag1 is reset when the program terminates after a time determination is comlete or when no more numbers remain in the alternate path list, a device fault or timeout has occured, or the fudge flag1 has been reset using xntpdc. In automatic and backup modes, the driver determines the call interval using a procedure depending on the measured prediction error and the fudge time2 parameter. If the error exceeds time2 for a number of times depending on the current interval, the interval is decreased, but not less than about 1000 s. If the error is less than time2 for some number of times, the interval is increased, but not more than about 18 h. With the default value of zero for fudge time2, the interval will increase from 1000 s to the 4000-8000-s range, in which the expected accuracy should be in the 1-2-ms range. Setting fudge time2 to a large value, like 0.1 s, may result in errors of that order, but increase the call interval to the maximum. The exact value for each configuration will depend on the modem and operating system involved, so some experimentation may be necessary. Manual call attempts can be made at any time by setting fudge flag1 using xntpdc. For example, the xntpdc command fudge 127.127.18.1 flags 1 will ask for a key identifier and password and, if authenticated by the server, will set flag1. There may be a short delay until the expiration of the current poll timeout. The flag1 can be set from a cron job in the following way. Construct a file with contents keyid 11 passwd dialup fudge 127.127.18.1 flags 1 quit Then, run the following program at specified times as required. /usr/local/bin/xntpdc <file Type 19: Heath WWV/WWVH Receiver This driver supports the Heath GC-1000 Most Accurate Clock, with RS232C Output Accessory. This is a WWV/WWVH receiver somewhat less robust than other supported receivers. Its claimed accuracy is 100 ms when actually synchronized to the broadcast signal, but this doesn't happen even most of the time, due to propagation conditions, ambient noise sources, etc. When not synchronized, the accuracy is at the whim of the internal clock oscillator, which can wander into the sunset without warning. Since the indicated precision is 100 ms, expect a host synchronized only to this thing to wander to and fro, occasionally being rudely stepped when the offset exceeds the default CLOCK_MAX of 128 ms. The internal DIPswitches should be set to operate at 1200 baud in MANUAL mode and the current year. The external DIPswitches should be set to GMT and 24-hour format. It is very important that the year be set correctly in the DIPswitches. Otherwise, the day of year will be incorrect after 28 April of a normal or leap year. In MANUAL mode the clock responds to a rising edge of the request to send (RTS) modem control line by sending the timecode. Therefore, it is necessary that the operating system implement the TIOCMBIC and TIOCMBIS ioctl system calls and TIOCM_RTS control bit. Present restrictions require the use of a POSIX-compatible programming interface, although other interfaces may work as well. The clock message consists of 23 ASCII printing characters in the following format: hh:mm:ss.f dd/mm/yr<cr> hh:mm:ss.f = hours, minutes, seconds f = deciseconds ('?' when out of spec) dd/mm/yr = day, month, year The alarm condition is indicated by '?', rather than a digit, at A. Note that 0?:??:??.? is displayed before synchronization is first established and hh:mm:ss.? once synchronization is established and then lost again for about a day. Fudge Factors There are no special fudge factors other than the generic. A fudge time1 value of .07 s appears to center the clock offset residuals. Type 20: Generic NMEA GPS Receiver Information not available. Type 21: Motorola Six Gun GPS Receiver Information not available. Type 22: PPS Clock Discipline This driver furnishes an interface for pulse-per-second (PPS) signals produced by a cesium clock, timing receiver or related equipment. It can be used to remove accumulated jitter and retime a secondary server when synchronized to a primary server over a congested, wide-area network and before redistributing the time to local clients. Note that this driver does not control the system clock if the kernel modifications described in the README.kernel file have been installed, but it can be useful as a monitoring tool. In order for this driver to work, the local clock must be set to within +-500 ms by another means, such as a radio clock or NTP itself. The 1-pps signal is connected via a serial port and gadget box consisting of a one-shot and RS232 level converter. When operated at 38.4 kbps with a SPARCstation IPC, this arrangement has a worst-case jitter less than 26 us. There are three ways in which this driver can be used. The first way uses the LDISC_PPS line discipline and works only for the baseboard serial ports of the Sun SPARCstation. The PPS signal is connected via a gadget box to the carrier detect (CD) line of a serial port and flag3 of the driver configured for that port is set. This causes the ppsclock streams module to be configured for that port and capture a timestamp at the on-time transition of the PPS signal. This driver then reads the timestamp directly by a designated ioctl() system call. This provides the most accurate time and least jitter of any other scheme. There is no need to configure a dedicated device for this purpose, which ordinarily is the device used for the associated radio clock. The second way uses the LDISC_CLKPPS line discipline and works for any architecture supporting a serial port. If after a few seconds this driver finds no ppsclock module configured, it attempts to open a serial port device /dev/pps%d, where %d is the unit number, and assign the LDISC_CLKPPS line discipline to it. If the line discipline fails, no harm is done except the accuracy is reduced somewhat. The pulse generator in the gadget box is adjusted to produce a start bit of length 26 us at 38400 bps (or 104 us at 9600 bps). Used with the LDISC_CLKPPS line discipline, this produces an ASCII DEL character ('\377') followed by a timestamp at each seconds epoch. The third way involves an auxiliary radio clock driver which calls the PPS driver with a timestamp captured by that driver. This use is documented in the source code for the driver(s) involved. Fudge Factors There are no special fudge factors other than the generic and those explicitly defined above. The fudge time1 parameter can be used to compensate for miscellaneous UART and OS delays. Allow about 247 us for uart delays at 38400 bps and about 1 ms for SunOS streams nonsense. Appendix B. Mitigation Rules In order to provide robust backup sources, stratum-1 peers are usually operated in a diversity configuration, in which the local server operates with a number of remote peers in addition with one or more radio clocks operating also as local peers. In these configurations the suite of algorithms used in NTP to refine the data from each peer separately and to select and weight the data from a number of peers can be used with the entire ensemble of remote peers and local radios. However, Because of small but significant systematic time offsets between the peers, it is in general not possible to achieve the lowest jitter and highest stability in these configurations. In addition, there are a number of special configurations involving auxiliary radio clock outputs, telephone backup services and other special cases, so that a set of mitigation rules becomes necessary. The mitigation rules are based on a set of special characteristics of the various reference clock drivers configured on the server. For instance, it is possible to designate a peer as "preferred," in which case, all other things being equal, this peer will be selected for synchronization over all other eligible candidates in the clock selection procedures. The precise characterization of the prefer peer is described below. In addition, when a pulse-per-second (PPS) signal is connected via the PPS Clock Discipline Driver (type 22), the corresponding peer is called the PPS peer. The manner in which this peer operates is described below. When the Undisciplined Local Clock Driver (type 1) is configured in the server, this becomes the local-clock peer. When the Automated Computer Time Service Driver (type 18) is configured in the server, this becomes the ACTS peer. Both the local-clock and ACTS peers operates in the manner described in Appendix A. Finally, where support is available, the PPS signal may be processed directly by the kernel. In the following this will be called the kernel discipline. The mitigation rules apply in the clock selection procedures following the sanity checks, intersection algorithm and clustering algorithm. The survivors at this point represent the subset of all peers which can provide the most accurate, stable time. In the general case, with no designated prefer peer, PPS peer or local-clock peer, the mitigation rules require all survivors be averaged according to a weight depending on the reciprocal of the dispersion, as provided in the NTP specification. The mitigation rules establish the choice of system peer, which determine the stratum, reference identifier and several other system variables which are visible to clients of the local server. In addition, they establish which source or combination of sources control the local clock. In detail, these rules operate as follows: 1. If there is a prefer peer and it is the local-clock peer or the ACTS peer; or, if there is a prefer peer and the kernel discipline is active, choose the prefer peer as the system peer. 2. If the above is not the case and there is a PPS peer, then choose it as the system peer and its offset as the system clock offset. 3. If the above is not the case and there is a prefer peer (not the local-clock or ACTS peer in this case), then choose it as the system peer and its offset as the system clock offset. 4. If the above is not the case and the peer previously chosen as the system peer is in the surviving population, then choose it as the system peer and average its offset along with the other survivors to determine the system clock offset. This behavior is designed to avoid excess jitter due to "clockhopping," when switching the system peer would not materially improve the time accuracy. 5. If the above is not the case, then choose the first candidate in the list of survivors ranked in order of synchronization distance and average its offset along with the other survivors to determine the system clock offset. This is the default case and the only case considered in the current NTP specification. The specific interpretation of the prefer peer and PPS peer require some explanation, which is given in following sections. B.1. Using the prefer Keyword For the reasons stated previously, a scheme has been implemented in NTP to provide an intelligent mitigation between various classes of peers, one designed to provide the best quality time without compromising the normal operation of the NTP algorithms. This scheme in its present form is not an integral component of the NTP specification. but is likely to be included in future versions of the specification. The scheme is based on the "preferred peer," which is specified by including the prefer keyword with the associated server or peer command in the configuration file. This keyword can be used with any peer or server, but is most commonly used with a radio clock server. The prefer scheme works on the set of peers that have survived the sanity and intersection algorithms of the clock select procedures. Ordinarily, the members of this set can be considered truechimers and any one of them could in principle provide correct time; however, due to various error contributions, not all can provide the most stable time. The job of the clustering algorithm, which is invoked at this point, is to select the best subset of the survivors providing the least variance in the combined ensemble compared to the variance in each member of the subset. The detailed operation of the clustering algorithm, which are given in the specification, are not important here, other than to point out it operates in rounds, where a survivor, presumably the worst of the lot, is discarded in each round until one of several termination conditions is met. In the prefer scheme the clustering algorithm is modified so that the prefer peer is never discarded; on the contrary, its potential removal becomes a termination condition. If the original algorithm were about to toss out the prefer peer, the algorithm terminates right there. The prefer peer can still be discarded by the sanity and intersection algorithms, of course, but it will always survive the clustering algorithm. A preferred peer retains that designation as long as it survives the intersection algorithm. If for some reason the prefer peer fails to survive the intersection algorithm, either because it was declared a falseticker or became unreachable, it loses that designation and the clock selection remitigates as described above. Along with this behavior, the clock select procedures are modified so that the combining algorithm is not used when a prefer (or PPS) peer is present. Instead, the offset of the prefer (or PPS) peer is used exclusively as the synchronization source. In the usual case involving a radio clock and a flock of remote stratum-1 peers, and with the radio clock designated a prefer peer, the result is that the high quality radio time disciplines the server clock as long as the radio itself remains operational and with valid time, as determined from the remote peers, sanity algorithm and intersection algorithm. While the model does not forbid it, it does not seem useful to designate more than one peer as preferred, since the additional complexities to mitigate among them do not seem justified from on the air experience. Note that the prefer peer interacts with the PPS peer discussed in Appendix C. It also interacts with the Undisciplined Local Clock Driver (type 1), as described in Appendix A. See the main text for the mitigation rules applying to the general case. B.2. Using the Pulse-per-Second (PPS) Signal Most radio clocks are connected using a serial port operating at speeds of 9600 bps or lower. The accuracy using typical timecode formats, where the on-time epoch is indicated by a designated ASCII character, like carriage-return <cr>, is limited to a millisecond at best and a few milliseconds in typical cases. However, some radios produce a precision pulse-per-second (PPS) signal which can be used to improve the accuracy in typical workstation servers to the order of a few tens of microseconds. The details of how this can be accomplished are discussed in the README.magic file; the following discusses how this signal is implemented and configured in a typical working server. First, it should be pointed out that the PPS signal is inherently ambiguous, in that it provides a precise seconds epoch, but does not provide a way to number the seconds. In principle and most commonly, another source of synchronization, either the timecode from an associated radio clock, or even a set of remote peers, is available to perform that function. In all cases a specific, configured peer or server must be designated as associated with the PPS signal. This is done by including the prefer keyword with the associated server or peer command in the configuration file. This PPS signal can be associated in this way any peer or server, but is most commonly used with the radio clock generating the PPS signal. The PPS signal is processed by a special PPS Clock Discipline Driver (type 22) described in Appendix A. That description specifies the hardware configurations in which this signal can be connected to the server. This driver replaces the former scheme based on conditional compilation and the PPS, CLK and PPSCLK compile-time switches. Regardless of method, the driver, like all other drivers, is mitigated in the manner described for the prefer peer in Appendix B. However, in the case of the PPS peer, the behavior is slightly more complex. First, in order for the PPS peer to be considered at all, its associated prefer peer must have survived the sanity and intersection algorithms and have been designated the prefer peer. This insures that the radio clock hardware is operating correctly and that, presumably, the PPS signal is operating correctly as well. Second, the absolute time offset from that peer must be less than CLOCK_MAX, the gradual-adjustment range, which is ordinarily set at 128 ms, or well within the +-0.5-s unambiguous range of the PPS signal itself. Finally, the time offsets generated by the PPS peer are propagated via the clock filter to the clock selection procedures just like any other peer. Should these pass the sanity and intersection algorithms, they will show up along with the offsets of the prefer peer itself. Note that, unlike the prefer peer, the PPS peer samples are not protected from discard by the clustering algorithm. These complicated procedures insure that the PPS offsets developed in this way are the most accurate, reliable available for synchronization. A PPS peer retains that designation as long as it survives the intersection algorithm; however, like any other clock driver, it runs a reachability algortihm on the PPS signal itself. If for some reason the signal fails or displays gross errors, the PPS peer will either become unreachable or stray out of the survivor population. In this case the clock selection remitigates as described above. Finally, the mitigation procedures described above for the prefer peer are modified so that, if the PPS peer survives the clustering algorithm, its offset is mitigated over the prefer peer offset; in other words in case of ties, the PPS offset wins. See the main text for the mitigation rules applying to the general case. B.3. Using the Kernel Discipline Code to implement the kernel discipline is a special feature that can be incorporated in the kernel of some workstations as described in the README.kernel file. The discipline provides for the control of the local clock oscillator time and/or frequency by means of an external PPS signal interfaced via a modem control lead. As the PPS signal is derived from external equipment, cables, etc., which sometimes fail, a good deal of error checking is done in the kernel to detect signal failure and excessive noise. In order to operate, the kernel discipline must be enabled and the signal must be present and within nominal jitter and wander error tolerances. In the NTP daemon the kernel is enabled only when the prefer peer is among the survivors of the clustering algorithm, as described above. Then, the PPS peer is designated the prefer peer as long as the PPS signal is present and operating within tolerances. Under these conditions the kernel disregards updates produced by the NTP daemon and uses its internal PPS source instead. The kernel maintains a watchdog timer for the PPS signal; if the signal has not been heard or is out of tolerance for more than some interval, currently two minutes, the kernel discipline is declared inoperable and operation continues as if it were not present. Appendix C. NTP Local Clock Discipline Implementation of the ACTS driver caused somewhat of a shakeup in the NTP local clock model and implementation. The model described in the specification RFC-1305 is based on a phase-lock loop (PLL) design, which is optimum or near optimum for the update intervals used for NTP peers and radio clocks, ordinarily in the range 64-1024 s. However, the ACTS driver must operate with update intervals in the range well above 1024 s, where the performance of the PLL model deteriorates. As suggested by Judah Levine of NIST and used in his "lockclock" algorithm, a hybrid frequency-lock loop (FLL) gives better performance at the longer update intervals up to a maximum depending on the acceptable error bound. In a series of experiments and simulations, it was verified that the PLL model provides better performance in the regime less than about 1000 s, while the FLL model provides better performance above that. The parameters of each model were optimized by simulation for the lowest time and frequency error using data collected on an undisciplined computer clock oscillator over a period of about two weeks. The PLL/FLL hybrid loop has been implemented in NTP, along with certain other refinements described below. While it was designed primarily with ACTS in mind, it can be used with any NTP peer or radio clock, should that prove useful. To take advantage of this feature for other than the ACTS driver, where it is automatic, note that the default minimum poll interval is 64 s and default maximum poll interval 1024 s (for the ACTS driver the default minimum is 1024 s and default maximum 16384 s). However, using the minpoll and/or maxpoll parameters of the server or peer commands in the configuration file, it is possible to set the minimum poll interval as low as 16 s and the maximum poll interval as high as 16384 s. Poll intervals less than 64 s are useful if an exceptionally quick lock is required, like in real-time or portable systems. Poll intervals above 1024 s, other than ACTS, may be useful to reduce traffic in some situations, such as when charges are made on a per-packet basis. Another modification to the stock NTP local clock discipline is to avoid errors due to old data. From a study of the stability characteristics of typical computer clock oscillators using both experiment and simulation, it was determined that data used to discipline the PLL are not generally useful if older than about 1000 s. This corresponds roughly to the knee in the Allan variance characteristic measured for a typical workstation oscillator. The NTP clock filter algorithm was modified to adjust the effective length of the shift register so that samples older than about 1000 s are not used to determine the filtered offset, delay and dispersion values. This design has the useful byproduct that the time to acquire lock when first coming up and to declare unreachability is independent of the poll interval. A problem which has recurred on every occasion a leap second has been inserted in the UTC timescale is that not all radio clocks detect and implement the leap event. As a result, some radios sail right through the leap, become confused for periods up to 15 minutes, then reacquire lock. In order to cope with this, as well as other occasions where atypically large offsets occur, the NTP clock discipline has been modified to disregard offsets over 128 ms, unless (a) first coming up, (b) first returning to service after a period when unsynchronized, or (c) an interval of about 15 minutes has elapsed since the last update less than 128 ms was received. In addition, the discipline has been modified so that, if the first offset received after coming up is less than 128 ms, the local clock is immediately reset to that offset without affecting the PLL variables. It has been the experience of some users that, when first installed in a system, the NTP clock discipline fails to reliably lock to other peers and servers as configured. The indications are that the daemon locks for some period of time, but is unable to stabilize the frequency estimate. As the result, the time offsets eventually climb above 128 ms and the discipline unlocks again. After the 15-minute timeout, the daemon locks again and the cycle repeats. The problem here is that the intrinsic frequency error of the local clock exceeds the design capture range of the PLL, 100 ppm. This particular limit was selected as a compromise between useful maximum error indications and the tolerances found in typical computer clock oscillators. In spite of the tolerance assumed in the NTP specification of 100 ppm, the NTP daemon for Unix can operate with an intrinsic frequency error of over 380 ppm, depending on the values of tick and tickadj selected by the tickadj program. However, with errors that large, the PLL will not reliably lock, and the behavior noted above can occur. Formerly, the only remedial in cases where this happens waas a somewhat painful manual process where the nominal oscillator frequency is measured by some other means, such as eyeball-and-wristwatch, and a specific drift file (ntp.drift) crafted. In order to avoid the above problem, the NTP clock discipline has been modified to measure the frequency during periods when not locked to another server or radio clock. Such periods occur when the time offset wanders through and beyond the 128-ms window as described above. When synchronization is reestablished, the working frequency used by NTP is initialized with the measured value. Since a precise frequency determination is not always possible under these chaotic conditions, it may take more than one cycle of this type to get the residual error below 100 ppm and reliable lock established. David L. Mills <mills@udel.edu> Electrical Engineering Department University of Delaware Newark, DE 19716 302 831 8247 fax 302 831 4316 3 July 1994