There are three programs in the NTP distribution:
ntp - simple query program used for single
sample queries
ntpd - A daemon that sets up peers and responds
to queries. Ntpd does the clock trimming.
ntpdc - program to query an ntpd. It was useful in
checking the filters and cleaning the windows
Installation:
1) Add an entry to /etc/services to define the ntp port.
ntp 123/udp # network time protocol (exp)
2) Make a /etc/ntp.conf with the clocks you want to track.
Please refer to the RFC's in the man directory, the man
pages, and the clock.txt file to assist you in selecting
clocks to peer with. The supplied ntp.conf is only a
sample, and is not suitable for use.
3) Change the Makefile definitions to suit your environment.
4) make
5) make install
6) adb or remake kernel and change "tickadj"
Recommended values for tickadj on various machines:
VAX: 5
Sun3: 10
Sun4: 5
NeXT: 7
This step is optional; new algorithms will allow you to
get by (with reduced accuracy) with the system supplied
value of tickadj. For better preformence, you should
change the value of tickadj. This can be done by making
a new kernel or by compiling ntpd with SETTICKADJ defined,
and having ntpd set it to the value you specify. This is
clearly ugly.
7) Fire up ntpd in /etc/rc.local
History:
5/17/89
Yet another preprocessor define for broken unsigned long to double
conversions. Define GENERIC_UNS_BUG, and the unsigned long is shifted
right one bit and cast to an int before conversion to a double. This
seems to work much better.
Preliminary support for NeXT systems. Be sure to define both
GENERIC_UNS_BUG and SUN_FLT_BUG. The default value of tickadj in the
kernel is too large so you'll have to adjust it by using the
-t option and compiling with SETTICKADJ. I don't think you can use
gdb on the running /dev/mem image. NOTE: don't even think of trying
to run this on the 0.8 release of the system software. You will
utterly and absolutely hang you system. Current testing is being
done on the 0.9 release. So far, there seems to be some weirdness in
the kernel which is attempting to sync to the clock to the internal
clock chip every so ofter. So while it compiles and runs, it really
doesn't work very well on the NeXT machine.
Integration of the reference clock code from Doug Kingston and Jeff
Schiller has been done. To configure a reference clock, check the
ntpd manual page.
5/3/89
The changes to the ntp_proto.c module for clockhopper suppression have
been tweaked once more, ever so slightly to conform with the 21 April
1989 draft of the NTP spec. We won't switch peers if the current
peer makes it into the final selection list, unless the first peer on
the selection list is of a higher stratum than the current peer.
The ntpd.c/hourly() function now saves the value of the drift
compensation register to a file (/etc/ntp.drift by default). In fact,
the last 5 hourly samples are written to the file, as well as how
many hours the ntpd process has been running. Ntpd will also attempt
to intialize the value of the drift compensation register from this
file when it is started up. The hourly stats: log message has been
augmented to log additional information.
4/8/89
Changes to the ntp_proto.c module to supress peer switching when the
dispersion between the newly selected peer and the currently selected
peer is "small." A new configuration option, NOSWAP, has been added
for use on Ultrix systems which can lock the ntpd process in memory;
very desirable for diskless workstations. peer.reach is now not
cleared in the clear() procedure. The stat.pl perl script can now
handle syslog records which span a month boundary correctly. We're
getting real close to a "blessed" version now.
3/29/89
A few fixes, clean up of unused #defines in ntp.h. The receive()
procedure is now table driven per the 26 March 1989 draft of the
spec. If no terrible errors or bugs are found, this version
will probably be packaged as a "blessed" working version before
the next stage of major hacking.
3/22/89
A bunch of minor fixes here an there. The RCS header is being
updated so that patches that are generated will apply; apparently
the new version of RCS puts the Locked: status in the Header
Minor fiddles to ntpd/ntpdc to eliminate some byte-sex dependencies.
Changs to ntp_proto.c to fix an mis-interpretation in the packet
procedure.
The ntp program now uses connected UDP sockets to pick up ICMP
generated errors.
ntpdc will now select a value of tickadj if you don't specify one.
3/17/89
Another sort-of-working ntpd. There might still be something weird
with the logical clock code; seems to be a little weird. Would
really like your comments on this version.
Note that the a version that supports the Precision Time WWV clock
can be had via anonymous FTP from BITSY.MIT.EDU. The version there
might lag the University of Maryland version.
3/12/89
A snapshot of a more-or-less working ntpd. There's been a few more
bug fixes and changes due to the NTP spec being revised. A few more
changes have been made to the latest NTP spec (11 March 1989 version)
which have not yet been applied.
A few problems areas: I currently observe some peer flapping between
two clock which are both of very good quality (UMD1.UMD.EDU and
TRUECHIMER.CSO.UIUC.EDU). Not quite sure why this is happening yet
or if it is really a problem.
There are quite a few "Dropping peer <foo>" messages in the syslog.
Most of these are due to lower statum "transient" clocks peering with
the local daemon. Need to find a way to supress the messages in
the transmit procedure when we've got no intention of keeping a
peer structure around for them.
There are changes in the works to improve the reliability of the
ntpdc program. The ntpd hooks are there now, and some work remains
in the ntpdc program.
3/7/89
*** THIS IS A TEST RELEASE ***
This version contain most of the new algorithms from the 6 March 1989
draft of the NTP specification. It still operates, however, as
Version 1, and does not support the authentication feature.
The stratum 1 WWV clock code from Doug Kingston has not been tested or
changed for this release. I would really like someone to change the
interface to have the clock appear as just another peer.
Quite a bit if clean-up and cosmetic changes were made in almost all
of the modules. Note that the ntest program which tests certain
arithmetic operations on you machine is automatically run by the
Makefile. If it fail *for any reason*, stop right there and find
out why. Until ntest works correctly, don't even bother with the
rest of the code. Note that at least Ultrix has problems, and there
is a define option in the makefile to accomodate the broken Ultrix
pcc compiler. Recent version of GNU CC are known to work correctly
on a VAX platform, and is in fact used for development. It is not
necessary to use the GNU C compiler on you machine, however.
The logical clock code in ntp_adjust.c has been changed to be more
self-contained and independent from NTP proper. It has the tickadj
round-off residual accumulating code, and attempts to implemenet the
newest version of the NTP logical clock code. A large change here is
that once an clock update has been passed to the logical clock, it will
ignore further updated for 1<<CLOCK_UPDATE seconds. Note that the
units for tick_adj have changed in this version. Eventually, a
normalized version of this value will be written to a file for use
on subsequent invocations.
There has been no work in the area of supporting broadcast NTP. A
bunch of bug fixes have been made to the ntp_proto.c module, including
a significant one in the code which selects the clock; the dispersion
computed before was incorrect and resulted in poor clock choices. This
is probably the cause of having long "strings" of peers rather then
all syncing to one clock.
The ntpd will now actually delete peer entries when the hosts "go
away." This will hopefully save some memory. The peer list is now
doublely linked, so deletions can happen very efficiently.
There is still a weirdness in there when interoperating with very old
broken versions of ntpd. It manifests itself with peers being expunged
and them coming back.
Please beat on this version and let me know what bugs you find. I
want to make another release, this one "blessed" until the Version 2
one is ready.
1/12/89
*** THIS IS A TEST RELEASE ***
There have been a bunch of bug fixes, and an attemtp to unify the
the debug output and logging. There is still a problem with the
verbose version of ntpdc; the offset values are clearly bogus.
Danger: don't attempt to run ntpd on a NeXT machine. It provokes
a bug in the OS which hangs the machine quite absolutely.
There is some support for a statrum 1 clock in some code provided by
Doug Kingston (dpk@morgan.com). I'm not really sure that its the
``right'' way to do it; I'd rather have the clock appear just like
another peer, and have it selected as a reference, just like you'd
select any other clock. In fact, by doing it that way with some other
support, you could even have a seperate process take care of reading
the clock, and talking to the main process with some UNIX domain
sockets... Hmm..
12/8/88
*** THIS IS A TEST RELEASE ***
Really. We have tested this code on a VAX platform, but not much of
anything else. I would like to hear back about any bugs, but you
should not treat this as a 'release' version.
Very large number of changes and updates. Files have been reorganized
with ntpd.c containing intialization and other very UNIX specific code,
while the new file ntp_proto.c contains the bulk of the NTP code.
This version of the UNIX NTP daemon was re-written and updated to
conform with the revised NTP specification.
For all of the mucking about with tickadj, you can now define
SETTICKADJ in the Makefile, and specify the value of tickadj in
/etc/ntp.conf. The ntpd will attempt to update `tickadj' using
/dev/kmem. Yow!
If possible, ntpd will attempt to discover the value of your kernel's
`hz' variable, and set the value of `precison' automagically. If
`precision' is specified in /etc/ntp.conf, it will override any
automatic selection.
Only hosts which are configured or mentioned in /etc/ntp.conf on a
`peer', `server' or `passive' statement are elligable to be
synchronized to. This solves the "ganging-up" problem, but is sorta
ugly.
The `peer' statement in /etc/ntp.conf works just as before; it sends
packets with MODE=SYMMETRIC-ACTIVE to the remote host. The remote host
might synchronize to you if appropriate. If reachability is lost,
polling will continue.
The new `server' statement in /etc/ntp.conf causes packets of MODE=
CLIENT to be sent to the specified host. The remote host will *not*
synchronize to you under any circumstances. If reachability is lost,
polling will continue.
The new `passive' statement in /etc/ntp.conf causes packets of
MODE=SYMMETRIC-PASSIVE to be sent to the remote host *when the local
host is polled*. If reachability is lost, then polling will cease
until the remote host begins to the local host again.
Note conditional compilation define in the makefile for
VAX_COMPILER_FLT_BUG for old 4.2 and Ultrix 2.0/2.2/3.0 pcc compilers.
There is a bug in the code generated to convert an unsigned long to a
double. Previously, this code was always present, but it is now
#ifdef'd. The 4.3BSD-tahoe and GNU CC (1.30 and 1.31 at least) are
known to work correctly. If you don't know if your compiler
performs this conversion correctly, try making and running the
`ntest' program, and see if test3 passes or not.
The format of the data sent between ntpd and the ntpdc programs has
changed yet again. It is likely to change again before the final
release of this version.
7/30/88
Added and updated manual entries contributed by Glenn Trewitt.
(trewitt@miasma.stanford.edu)
7/27/88
Reorder peer list so configuted hosts are always first. This
REALLY helps the faleticker code.
Changed ntpdc to have a larger RECV socket buffer. This fixes
the "only see 20 peers" problem. This is a side affect of using
UDP for the status return.
6/20/88
Support for hosts with multiple interfaces. Minor updates to
the ntpdc program; note that the format of the messages between
the ntpd and ntpdc programs is different in this version than the
last. You should update both ntpd and ntpdc at the same time.
New file ``ntp_sock.c''. Tested with Ultrix 2.4 field test, and
4.3 BSD tahoe release. Debug level can be adjusted by sending
SIGUSR1 to increase and SIGUSR2 to zero the debug level.
5/17/88
Changed peer structure alloactor to stop allocating a perm
structure for non-peer relationships. This make the ntpdc
output a lot more understandable.
Installed faletick code.
Installed work around to bug in Ultrix C compiler.
The compiler has troubles converting unsigned longs to floats.
This caused a lot of off by 2 second problems.
3/31/88
The world is ALL different now. The NTP protocols have had
some major structural work. This is the first rev that
attempts to meet NTP version 1 compliance. There are a couple
of loose ends (faltickers code and clock slew rate) that
are not finished, but should be RSN. This release is to
bridge the compatability with the old clock system.
CHANGES:
ntpsubs.c had a MAJOR bug in the tstamp routine. Accuracy
should be much better now.
The ntp.conf file is much simpler. List your precision
and peers, the rest is automagic.
The ntp/udp service mapping is now consitent. No more hard
coded 123s.
The math routines are more robust. They now handle signed
conversion of longs and shorts.
The control structure of ntpd is radically different. A peer
relation is NOT setup for clocks at a higher stratum. This
reduces table clutter, but you lose the history of those
requesters.
2/20/88
Removed the median filter and replaced it with a minimum
filter. Experimentation by Dave Mills suggests this is
a better way to track network clocks. Changed status field based
on updated RFC.
12/29/87
Only believe samples were the round trip delay is positive.
I recommend HIGHLY that you change tickadj in /sys/conf/param.c
to equal 1 instead of 40. This reduces the granularity of
clock slewing from 4ms/sec to .1ms/sec. This should suffice
if your clock is less that 4.3 minutes per month. If this is
the case get a new clock, increase the value, or live with
periodic clock jumps due to setimeofday(). The basic problem is
that adjtime() slews only with "tickadj" granularity. That's
argueably broken, but needs kernel mods to fix it.
12/17/87
Added some of the changes from Greg Fowler and Ken Stone
of HP labs. This adds "hpux" compatability. Ken and Greg
also tighten up the "bestclock" determination so you
don't end up tracking yourself. (thanks again)
The Precision field in now correct, precision is the power
of 2 indication of internal clock tics. (ex. 60-HZ = -6)
This is a constant for the machine and should be set in the
ntp.conf file.
12/1/87
Massive cleanup in the daemon code. There was a BIG problem
with "bestclock" peer calculation. A clock of a lower type would
be tracked if the delay to that clock was lower than the delay
to the higher precision clock. The peers listed in the ntp.conf
files are marked as PERM. This causes a ntp gram to go to these
guys regardless of any recv activity. This eliminates the problem
of a peer being down and not talking ot him when he comes back
up because the activity indicator went to zero. Using PERM
entries creates a fixed overhead, use it with caution.
There is the beginning of a second order filter that can be used
to adjust the kernel tick rate. More on that when it's done.
The data structures have changed for queries. Querying old
clocks will cause problems. Note - the NTP protocol has NOT
changed, only the query hack. The SET_THRESHOLD has been changed
to be more reasonable with the max slew rate of 4.3BSD. This
will be relaxed when the second order stuff is working.
5/29/87
All of the internal math is now done with doubles. This removes
a lot of the hair and cost. On vaxen the double yields 54(5) bits of
accuracy. The NTP timestamps are 64 bits. Converting to doubles
will cause the loss of some bits on ost machines. This is not bad
since most machines don't have clocks that could track even the lower
16 bits of the NTP timestamps.
NTP makes three choices on changing the local clock.
1) If the local clock apperars to be off by more than
WAYTOOBIG (1000.0) seconds, it refuses to do anything
but fill up you log.
2) If the local clock is off less than WAYTOOBIG but more
than SET_THRESHOLD (2.0) a settimeofday will be done.
3) If the clock is off less than SET_THRESHOLD an adjustime
is done.
Ntpd clears out the samples after every clock adjustment.
This helped to prevent the filter from overshouting based on old
data.
===========================================================================
Still cooking on the stove are:
modify adjtime - it won't allow small adjustments.
I may punt and put in a new adjtime that handles
the second order stuff.
making it handle broadcasted time like timed
man pages
Any suggestions or help are ALWAYS appreciated.
Louis A. Mamakos (louie@trantor.umd.edu)
mike petry (petry@trantor.umd.edu)