This file is the original README, and is a little out of date.  It
is also very specific to UofT, since there was a time when the daemon
was only run here.

To run this:

(1) Fix your kernel's value of tickadj.  Tickadj sets both the
    precision with which time slews can be performed and the amount
    of slew you can do in a given interval.  Xntpd operates by making
    a bunch of little adjustments.  Make tickadj too large (the default
    value almost always is) and xntpd will perform poorly since the
    slews will disappear in the roundoff.  Make tickadj too small
    and large slews won't complete before the next adjustment is
    ready.

    To determine a good value of tickadj to use, first determine your
    kernel's value of hz (50 on a Sun 3, 100 on Sun 4's and vaxes).
    Divide that number into 500 (i.e. compute 500/hz) and use an
    integer near there as tickadj (say, 10 on Sun 3's, 5 on Sun 4's
    and vaxes).  Then adb your kernel and write the new value.  You
    should probably do both the running kernel and the disk image.

    If your machine doesn't come with adb, or if the kernel is of a
    non-Berkeley flavour, take a look at the util directory, particularly
    util/tickadj.

(2) Edit the Config file in this directory.  You *must* tell it whether
    your machine uses big endian or little endian byte order.  Also,
    Suns running SunOS 3.x require special consideration, as well as Vaxes
    running Ultrix 2.0 and compilers which don't understand `signed char'
    declarations.  When you've got all this worked out, type `make makefiles'
    to distribute configuration information to Makefiles for individual
    programs, followed by `make' to compile everything.

(2a) Note that, among other things, two programs were made in the authstuff
    directory, authcert and authspeed.  The last two are utilities for
    checking the authentication code.  Type `authcert < certdata'.  If
    this provokes a massive failure you probably got the byte order wrong
    in the Config file.  Type `authspeed -n 10000 auth.samplekeys', or
    something, a couple of times to get a value of authdelay to stick in
    the configuration file.  The numbers for machines I've tried look like:

	uVax II		0.001450
	Sun 3/180	0.000620
	uVax III	0.000515
	Sun 3/60	0.000455
	IBM RT Mdl 125	0.000323
	Sun 3/280	0.000302
	Sun 4/280	0.000110
	MIPS M/1000	0.000100

(3) Typing `make install' will nstall xntpd, xntpdc, ntpdate and ntpq.  Watch
    the install location in the Config file.

(4) If you will be running xntpd (see 4a below for the alternative),
    configure it (configuration is necessary for all machines now, though
    this restriction will go away when I get broadcast time fully tested).
    xntpd reads its configuration from /etc/ntp.conf (by default) and
    you must tell it which machines it is to get its time from in
    here.

    Note that NTP operates in a hierarchy.  Machines with radio clocks
    (which are stratum 1 servers) are at the top of the heap, in that
    all time originates with them.  The situation with servers locally
    is in a state of flux.  We currently have one semi-reliable stratum 1
    server on campus (suzuki.ccie), and maintain three other stratum 2
    servers which (gently) access other people's off-campus stratum 1
    servers.  All of these machines are lightly loaded and have good
    quality clocks, and so will probably do until we get some more stratum 1
    weight.

    Thus you are probably faced with choosing whether your hosts should
    be stratum 2 or stratum 3 (or stratum 3 or 4 when suzuki's clock is down).
    The rule of thumb is to make your best clocks and/or your file servers
    stratum 2 (or 3) by peering them with the four campus servers, and make
    lesser clocks and clients stratum 3 (or 4) by peering them with near
    by servers which are synchonized to the campus servers.  The second rule
    of thumb is that more servers are better.  It is quite possible to
    synchronize with just a single server, but if you do your xtnpd daemon
    won't have any cross checks to tell it when the server has gone
    wonky. 3 or 4 lower stratum peers is about right.  Note that while
    you can also peer with same-stratum peers, you shouldn't do this
    unless the same-stratum peer is exchanging time with a lower stratum
    peer you don't talk to directly.

    Anyway, for your stratum 2 servers you can probably use ntp.conf
    from the conf directory directly.  You will have to handcraft the
    peer assocations for your stratum 3 servers.

    Oh, and a note about the drift file (see ntp.conf).  One of the
    things xntpd does is accumulate a correction for the frequency of
    the crystal in your computer.  It usually takes a day or so of
    running to figure this out, after which the value will usually remain
    pretty stable, especially if the computer is in a machine room.  The
    value is printed in your syslog file (once a minute, currently, though
    this will change), and can be obtained from the daemon using xntpdc.

    To avoid having to wait a day after restarts before the computer
    synchronizes really well, xntpd will optionally write its current
    value of the frequency correction into a file, once an hour.  When
    it is killed and restarted, xntpd reinitializes itself to this
    value on start up.  This is an advantageous feature, so a driftfile
    line should always be included in the configuration file.

(4a) Xntpd is a daemon.  It will keep your time exquisitely precise under
     normal conditions (it is quite capable of keeping a good clock within
     a millisecond of a good server.  Our servers aren't normally this
     good, yet, but may become so when we get a few more stable local
     stratum 1 peers).  Even when cut off entirely from its servers xntpd
     will prevent your clock from drifting seriously by continuing to apply
     its accumulated frequency correction.  The cost of this is that xntpd
     will permanently consume memory while it is running, and real memory
     at that since xntpd is unlikely to ever swap out.  This cost is
     currently over 100 kb.

     If you aren't too worried about millisecond timing and feel religious
     about keeping memory consumption at a minimum (perhaps on memory-poor
     workstations), a passable alternative might be to run ntpdate instead.
     Ntpdate is the NTP equivalent of rdate, a one shot date setting
     program, and implements the same multiple sample/multiple server
     filter algorithms as xntpd.  Ntpdate was explicitly designed to be
     run repeatly from cron, though it also makes a good boot time date
     setter.  Running ntpdate from cron on an hourly basis will keep all
     but seriously broken clocks within 100 ms of on-time, and for most
     clocks will probably do better than 50 ms.  If this is an attractive
     alternative see the manual page.  You should choose ntpdate's servers
     as you would the peer associations for a stratum 3 xntpd server.

(5) Once everything is configured, start the daemon(s).  ntpq can be
    used to see what xntpd is doing.  It runs both interactive and from
    the command line, type ? to see the interactive commands and ? command
    to see what a command does.  The `peers' command is a good one.  ntpq
    can also be used to see what other peoples' servers are doing, in
    particular the fuzzball primary servers.

(6) If you want to use the authentication facility (this might be useful
    if, for example, you were running Kerberos since this prevents people
    from setting your time back and doing replay attacks on the server),
    you might find a couple of useful programs in the auth_stuff directory.
    mkrandkeys will generate some very random keys to use.  keyparity
    generates odd parity bits for keys (needed for the key file) and will
    convert between key formats.

All bug reports gratefully received.

Dennis
